--- old/src/java.desktop/share/classes/sun/java2d/marlin/DRenderer.java 2018-02-15 13:11:10.980338693 +0100 +++ new/src/java.desktop/share/classes/sun/java2d/marlin/DRenderer.java 2018-02-15 13:11:10.828334529 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,9 +53,9 @@ private static final int SUBPIXEL_TILE = TILE_H << SUBPIXEL_LG_POSITIONS_Y; - // 2048 (pixelSize) pixels (height) x 8 subpixels = 64K + // 2176 pixels (height) x 8 subpixels = 68K static final int INITIAL_BUCKET_ARRAY - = INITIAL_PIXEL_DIM * SUBPIXEL_POSITIONS_Y; + = INITIAL_PIXEL_HEIGHT * SUBPIXEL_POSITIONS_Y; // crossing capacity = edges count / 4 ~ 1024 static final int INITIAL_CROSSING_COUNT = INITIAL_EDGES_COUNT >> 2; @@ -76,13 +76,17 @@ // curve break into lines // cubic error in subpixels to decrement step private static final double CUB_DEC_ERR_SUBPIX - = MarlinProperties.getCubicDecD2() * (NORM_SUBPIXELS / 8.0d); // 1 pixel + = MarlinProperties.getCubicDecD2() * (SUBPIXEL_POSITIONS_X / 8.0d); // 1.0 / 8th pixel // cubic error in subpixels to increment step private static final double CUB_INC_ERR_SUBPIX - = MarlinProperties.getCubicIncD1() * (NORM_SUBPIXELS / 8.0d); // 0.4 pixel + = MarlinProperties.getCubicIncD1() * (SUBPIXEL_POSITIONS_X / 8.0d); // 0.4 / 8th pixel + // scale factor for Y-axis contribution to quad / cubic errors: + public static final double SCALE_DY = ((double) SUBPIXEL_POSITIONS_X) / SUBPIXEL_POSITIONS_Y; // TestNonAARasterization (JDK-8170879): cubics // bad paths (59294/100000 == 59,29%, 94335 bad pixels (avg = 1,59), 3966 warnings (avg = 0,07) +// 2018 + // 1.0 / 0.2: bad paths (67194/100000 == 67,19%, 117394 bad pixels (avg = 1,75 - max = 9), 4042 warnings (avg = 0,06) // cubic bind length to decrement step public static final double CUB_DEC_BND @@ -109,10 +113,12 @@ // quad break into lines // quadratic error in subpixels private static final double QUAD_DEC_ERR_SUBPIX - = MarlinProperties.getQuadDecD2() * (NORM_SUBPIXELS / 8.0d); // 0.5 pixel + = MarlinProperties.getQuadDecD2() * (SUBPIXEL_POSITIONS_X / 8.0d); // 0.5 / 8th pixel // TestNonAARasterization (JDK-8170879): quads // bad paths (62916/100000 == 62,92%, 103818 bad pixels (avg = 1,65), 6514 warnings (avg = 0,10) +// 2018 + // 0.50px = bad paths (62915/100000 == 62,92%, 103810 bad pixels (avg = 1,65), 6512 warnings (avg = 0,10) // quadratic bind length to decrement step public static final double QUAD_DEC_BND @@ -179,7 +185,7 @@ int count = 1; // dt = 1 / count // maximum(ddX|Y) = norm(dbx, dby) * dt^2 (= 1) - double maxDD = Math.abs(c.dbx) + Math.abs(c.dby); + double maxDD = Math.abs(c.dbx) + Math.abs(c.dby) * SCALE_DY; final double _DEC_BND = QUAD_DEC_BND; @@ -193,7 +199,8 @@ } } - int nL = 0; // line count + final int nL = count; // line count + if (count > 1) { final double icount = 1.0d / count; // dt final double icount2 = icount * icount; // dt^2 @@ -203,17 +210,12 @@ double dx = c.bx * icount2 + c.cx * icount; double dy = c.by * icount2 + c.cy * icount; - double x1, y1; - - while (--count > 0) { - x1 = x0 + dx; - dx += ddx; - y1 = y0 + dy; - dy += ddy; + // we use x0, y0 to walk the line + for (double x1 = x0, y1 = y0; --count > 0; dx += ddx, dy += ddy) { + x1 += dx; + y1 += dy; addLine(x0, y0, x1, y1); - - if (DO_STATS) { nL++; } x0 = x1; y0 = y1; } @@ -221,7 +223,7 @@ addLine(x0, y0, x2, y2); if (DO_STATS) { - rdrCtx.stats.stat_rdr_quadBreak.add(nL + 1); + rdrCtx.stats.stat_rdr_quadBreak.add(nL); } } @@ -234,7 +236,7 @@ final DCurve c, final double x3, final double y3) { - int count = CUB_COUNT; + int count = CUB_COUNT; final double icount = CUB_INV_COUNT; // dt final double icount2 = CUB_INV_COUNT_2; // dt^2 final double icount3 = CUB_INV_COUNT_3; // dt^3 @@ -249,34 +251,22 @@ dx = c.ax * icount3 + c.bx * icount2 + c.cx * icount; dy = c.ay * icount3 + c.by * icount2 + c.cy * icount; - // we use x0, y0 to walk the line - double x1 = x0, y1 = y0; int nL = 0; // line count final double _DEC_BND = CUB_DEC_BND; final double _INC_BND = CUB_INC_BND; + final double _SCALE_DY = SCALE_DY; - while (count > 0) { - // divide step by half: - while (Math.abs(ddx) + Math.abs(ddy) >= _DEC_BND) { - dddx /= 8.0d; - dddy /= 8.0d; - ddx = ddx / 4.0d - dddx; - ddy = ddy / 4.0d - dddy; - dx = (dx - ddx) / 2.0d; - dy = (dy - ddy) / 2.0d; - - count <<= 1; - if (DO_STATS) { - rdrCtx.stats.stat_rdr_curveBreak_dec.add(count); - } - } + // we use x0, y0 to walk the line + for (double x1 = x0, y1 = y0; count > 0; ) { + // inc / dec => ratio ~ 5 to minimize upscale / downscale but minimize edges // double step: // can only do this on even "count" values, because we must divide count by 2 - while (count % 2 == 0 - && Math.abs(dx) + Math.abs(dy) <= _INC_BND) - { + while ((count % 2 == 0) + && ((Math.abs(ddx) + Math.abs(ddy) * _SCALE_DY) <= _INC_BND +// && (Math.abs(ddx + dddx) + Math.abs(ddy + dddy) * _SCALE_DY) <= _INC_BND + )) { dx = 2.0d * dx + ddx; dy = 2.0d * dy + ddy; ddx = 4.0d * (ddx + dddx); @@ -289,26 +279,42 @@ rdrCtx.stats.stat_rdr_curveBreak_inc.add(count); } } - if (--count > 0) { - x1 += dx; - dx += ddx; - ddx += dddx; - y1 += dy; - dy += ddy; - ddy += dddy; - } else { - x1 = x3; - y1 = y3; + + // divide step by half: + while ((Math.abs(ddx) + Math.abs(ddy) * _SCALE_DY) >= _DEC_BND +// || (Math.abs(ddx + dddx) + Math.abs(ddy + dddy) * _SCALE_DY) >= _DEC_BND + ) { + dddx /= 8.0d; + dddy /= 8.0d; + ddx = ddx / 4.0d - dddx; + ddy = ddy / 4.0d - dddy; + dx = (dx - ddx) / 2.0d; + dy = (dy - ddy) / 2.0d; + + count <<= 1; + if (DO_STATS) { + rdrCtx.stats.stat_rdr_curveBreak_dec.add(count); + } + } + if (--count == 0) { + break; } - addLine(x0, y0, x1, y1); + x1 += dx; + y1 += dy; + dx += ddx; + dy += ddy; + ddx += dddx; + ddy += dddy; - if (DO_STATS) { nL++; } + addLine(x0, y0, x1, y1); x0 = x1; y0 = y1; } + addLine(x0, y0, x3, y3); + if (DO_STATS) { - rdrCtx.stats.stat_rdr_curveBreak.add(nL); + rdrCtx.stats.stat_rdr_curveBreak.add(nL + 1); } } @@ -533,8 +539,8 @@ edgeBuckets = edgeBuckets_ref.initial; edgeBucketCounts = edgeBucketCounts_ref.initial; - // 2048 (pixelsize) pixel large - alphaLine_ref = rdrCtx.newCleanIntArrayRef(INITIAL_AA_ARRAY); // 8K + // 4096 pixels large + alphaLine_ref = rdrCtx.newCleanIntArrayRef(INITIAL_AA_ARRAY); // 16K alphaLine = alphaLine_ref.initial; crossings_ref = rdrCtx.newDirtyIntArrayRef(INITIAL_CROSSING_COUNT); // 2K @@ -692,8 +698,10 @@ { final double xe = tosubpixx(pix_x3); final double ye = tosubpixy(pix_y3); - curve.set(x0, y0, tosubpixx(pix_x1), tosubpixy(pix_y1), - tosubpixx(pix_x2), tosubpixy(pix_y2), xe, ye); + curve.set(x0, y0, + tosubpixx(pix_x1), tosubpixy(pix_y1), + tosubpixx(pix_x2), tosubpixy(pix_y2), + xe, ye); curveBreakIntoLinesAndAdd(x0, y0, curve, xe, ye); x0 = xe; y0 = ye; @@ -705,7 +713,9 @@ { final double xe = tosubpixx(pix_x2); final double ye = tosubpixy(pix_y2); - curve.set(x0, y0, tosubpixx(pix_x1), tosubpixy(pix_y1), xe, ye); + curve.set(x0, y0, + tosubpixx(pix_x1), tosubpixy(pix_y1), + xe, ye); quadBreakIntoLinesAndAdd(x0, y0, curve, xe, ye); x0 = xe; y0 = ye;