--- old/modules/javafx.graphics/src/main/java/com/sun/marlin/RendererNoAA.java 2018-06-08 16:12:53.407686486 +0200 +++ new/modules/javafx.graphics/src/main/java/com/sun/marlin/RendererNoAA.java 2018-06-08 16:12:53.247686488 +0200 @@ -63,6 +63,8 @@ // 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 float CUB_DEC_BND @@ -93,6 +95,8 @@ // 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 float QUAD_DEC_BND @@ -175,7 +179,8 @@ } } - int nL = 0; // line count + final int nL = count; // line count + if (count > 1) { final float icount = 1.0f / count; // dt final float icount2 = icount * icount; // dt^2 @@ -185,17 +190,12 @@ float dx = c.bx * icount2 + c.cx * icount; float dy = c.by * icount2 + c.cy * icount; - float x1, y1; - - while (--count > 0) { - x1 = x0 + dx; - dx += ddx; - y1 = y0 + dy; - dy += ddy; + // we use x0, y0 to walk the line + for (float 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; } @@ -203,7 +203,7 @@ addLine(x0, y0, x2, y2); if (DO_STATS) { - rdrCtx.stats.stat_rdr_quadBreak.add(nL + 1); + rdrCtx.stats.stat_rdr_quadBreak.add(nL); } } @@ -231,34 +231,19 @@ 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 - float x1 = x0, y1 = y0; int nL = 0; // line count final float _DEC_BND = CUB_DEC_BND; final float _INC_BND = CUB_INC_BND; - while (count > 0) { - // divide step by half: - while (Math.abs(ddx) + Math.abs(ddy) >= _DEC_BND) { - dddx /= 8.0f; - dddy /= 8.0f; - ddx = ddx / 4.0f - dddx; - ddy = ddy / 4.0f - dddy; - dx = (dx - ddx) / 2.0f; - dy = (dy - ddy) / 2.0f; - - count <<= 1; - if (DO_STATS) { - rdrCtx.stats.stat_rdr_curveBreak_dec.add(count); - } - } + // we use x0, y0 to walk the line + for (float x1 = x0, y1 = y0; count > 0; ) { + // inc / dec => ratio ~ 5 to minimize upscale / downscale but minimize edges - // double step: + // float 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)) <= _INC_BND)) { dx = 2.0f * dx + ddx; dy = 2.0f * dy + ddy; ddx = 4.0f * (ddx + dddx); @@ -271,26 +256,40 @@ 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)) >= _DEC_BND) { + dddx /= 8.0f; + dddy /= 8.0f; + ddx = ddx / 4.0f - dddx; + ddy = ddy / 4.0f - dddy; + dx = (dx - ddx) / 2.0f; + dy = (dy - ddy) / 2.0f; + + 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); } } @@ -672,8 +671,10 @@ { final float xe = tosubpixx(pix_x3); final float 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; @@ -685,7 +686,9 @@ { final float xe = tosubpixx(pix_x2); final float 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;