--- a/src/java.desktop/share/classes/sun/java2d/marlin/DRenderer.java Fri Mar 23 13:43:39 2018 -0700
+++ b/src/java.desktop/share/classes/sun/java2d/marlin/DRenderer.java Tue Mar 27 22:09:43 2018 +0200
@@ -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,16 +251,35 @@
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) {
+ // 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(ddx) + Math.abs(ddy) * _SCALE_DY) <= _INC_BND)) {
+ dx = 2.0d * dx + ddx;
+ dy = 2.0d * dy + ddy;
+ ddx = 4.0d * (ddx + dddx);
+ ddy = 4.0d * (ddy + dddy);
+ dddx *= 8.0d;
+ dddy *= 8.0d;
+
+ count >>= 1;
+ if (DO_STATS) {
+ rdrCtx.stats.stat_rdr_curveBreak_inc.add(count);
+ }
+ }
+
// divide step by half:
- while (Math.abs(ddx) + Math.abs(ddy) >= _DEC_BND) {
+ while ((Math.abs(ddx) + Math.abs(ddy) * _SCALE_DY) >= _DEC_BND) {
dddx /= 8.0d;
dddy /= 8.0d;
ddx = ddx / 4.0d - dddx;
@@ -271,44 +292,25 @@
rdrCtx.stats.stat_rdr_curveBreak_dec.add(count);
}
}
-
- // 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)
- {
- dx = 2.0d * dx + ddx;
- dy = 2.0d * dy + ddy;
- ddx = 4.0d * (ddx + dddx);
- ddy = 4.0d * (ddy + dddy);
- dddx *= 8.0d;
- dddy *= 8.0d;
-
- count >>= 1;
- if (DO_STATS) {
- 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;
+ 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 +535,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 +694,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 +709,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;