--- old/modules/javafx.graphics/src/main/java/com/sun/marlin/TransformingPathConsumer2D.java 2018-10-29 19:02:54.000000000 +0100 +++ new/modules/javafx.graphics/src/main/java/com/sun/marlin/TransformingPathConsumer2D.java 2018-10-29 19:02:54.000000000 +0100 @@ -98,17 +98,12 @@ return cpDetector.init(out); } - public PathConsumer2D pathClipper(PathConsumer2D out, - final float rdrOffX, - final float rdrOffY) - { - return pathClipper.init(out, rdrOffX, rdrOffY); + public PathConsumer2D pathClipper(PathConsumer2D out) { + return pathClipper.init(out); } public PathConsumer2D deltaTransformConsumer(PathConsumer2D out, - BaseTransform at, - final float rdrOffX, - final float rdrOffY) + BaseTransform at) { if (at == null) { return out; @@ -125,44 +120,55 @@ // Scale only if (rdrCtx.doClip) { // adjust clip rectangle (ymin, ymax, xmin, xmax): - adjustClipOffset(rdrCtx.clipRect, rdrOffX, rdrOffY); - adjustClipScale(rdrCtx.clipRect, mxx, myy); + rdrCtx.clipInvScale = adjustClipScale(rdrCtx.clipRect, + mxx, myy); } return dt_DeltaScaleFilter.init(out, mxx, myy); } } else { if (rdrCtx.doClip) { // adjust clip rectangle (ymin, ymax, xmin, xmax): - adjustClipOffset(rdrCtx.clipRect, rdrOffX, rdrOffY); - adjustClipInverseDelta(rdrCtx.clipRect, mxx, mxy, myx, myy); + rdrCtx.clipInvScale = adjustClipInverseDelta(rdrCtx.clipRect, + mxx, mxy, myx, myy); } return dt_DeltaTransformFilter.init(out, mxx, mxy, myx, myy); } } - private static void adjustClipOffset(final float[] clipRect, - final float rdrOffX, - final float rdrOffY) - { - clipRect[0] += rdrOffY; - clipRect[1] += rdrOffY; - clipRect[2] += rdrOffX; - clipRect[3] += rdrOffX; - } - - private static void adjustClipScale(final float[] clipRect, - final float mxx, final float myy) + private static float adjustClipScale(final float[] clipRect, + final float mxx, final float myy) { // Adjust the clipping rectangle (iv_DeltaScaleFilter): - clipRect[0] /= myy; - clipRect[1] /= myy; - clipRect[2] /= mxx; - clipRect[3] /= mxx; + final float scaleY = 1.0f / myy; + clipRect[0] *= scaleY; + clipRect[1] *= scaleY; + + if (clipRect[1] < clipRect[0]) { + float tmp = clipRect[0]; + clipRect[0] = clipRect[1]; + clipRect[1] = tmp; + } + + final float scaleX = 1.0f / mxx; + clipRect[2] *= scaleX; + clipRect[3] *= scaleX; + + if (clipRect[3] < clipRect[2]) { + float tmp = clipRect[2]; + clipRect[2] = clipRect[3]; + clipRect[3] = tmp; + } + + if (MarlinConst.DO_LOG_CLIP) { + MarlinUtils.logInfo("clipRect (ClipScale): " + + Arrays.toString(clipRect)); + } + return 0.5f * (Math.abs(scaleX) + Math.abs(scaleY)); } - private static void adjustClipInverseDelta(final float[] clipRect, - final float mxx, final float mxy, - final float myx, final float myy) + private static float adjustClipInverseDelta(final float[] clipRect, + final float mxx, final float mxy, + final float myx, final float myy) { // Adjust the clipping rectangle (iv_DeltaTransformFilter): final float det = mxx * myy - mxy * myx; @@ -205,6 +211,16 @@ clipRect[1] = ymax; clipRect[2] = xmin; clipRect[3] = xmax; + + if (MarlinConst.DO_LOG_CLIP) { + MarlinUtils.logInfo("clipRect (ClipInverseDelta): " + + Arrays.toString(clipRect)); + } + + final float scaleX = (float) Math.sqrt(imxx * imxx + imxy * imxy); + final float scaleY = (float) Math.sqrt(imyx * imyx + imyy * imyy); + + return 0.5f * (scaleX + scaleY); } public PathConsumer2D inverseDeltaTransformConsumer(PathConsumer2D out, @@ -222,7 +238,7 @@ if (mxx == 1.0f && myy == 1.0f) { return out; } else { - return iv_DeltaScaleFilter.init(out, 1.0f/mxx, 1.0f/myy); + return iv_DeltaScaleFilter.init(out, 1.0f / mxx, 1.0f / myy); } } else { final float det = mxx * myy - mxy * myx; @@ -516,22 +532,9 @@ : new IndexStack(rdrCtx); } - PathClipFilter init(final PathConsumer2D out, - final double rdrOffX, - final double rdrOffY) - { + PathClipFilter init(final PathConsumer2D out) { this.out = out; - // add a small rounding error: - final float margin = 1e-3f; - - final float[] _clipRect = this.clipRect; - // Adjust the clipping rectangle with the renderer offsets - _clipRect[0] -= margin - rdrOffY; - _clipRect[1] += margin + rdrOffY; - _clipRect[2] -= margin - rdrOffX; - _clipRect[3] += margin + rdrOffX; - if (MarlinConst.DO_CLIP_SUBDIVIDER) { // adjust padded clip rectangle: curveSplitter.init(); @@ -849,6 +852,11 @@ private static final int MAX_N_CURVES = 3 * 4; + private final RendererContext rdrCtx; + + // scaled length threshold: + private float minLength; + // clip rectangle (ymin, ymax, xmin, xmax): final float[] clipRect; @@ -866,12 +874,23 @@ private final Curve curve; CurveClipSplitter(final RendererContext rdrCtx) { + this.rdrCtx = rdrCtx; this.clipRect = rdrCtx.clipRect; this.curve = rdrCtx.curve; } void init() { this.init_clipRectPad = true; + + if (DO_CHECK_LENGTH) { + this.minLength = (this.rdrCtx.clipInvScale == 0.0f) ? LEN_TH + : (LEN_TH * this.rdrCtx.clipInvScale); + + if (MarlinConst.DO_LOG_CLIP) { + MarlinUtils.logInfo("CurveClipSplitter.minLength = " + + minLength); + } + } } private void initPaddedClip() { @@ -888,7 +907,7 @@ if (TRACE) { MarlinUtils.logInfo("clip: X [" + _clipRectPad[2] + " .. " + _clipRectPad[3] +"] " - + "Y ["+ _clipRectPad[0] + " .. " + _clipRectPad[1] +"]"); + + "Y [" + _clipRectPad[0] + " .. " + _clipRectPad[1] +"]"); } } @@ -901,7 +920,7 @@ MarlinUtils.logInfo("divLine P0(" + x0 + ", " + y0 + ") P1(" + x1 + ", " + y1 + ")"); } - if (DO_CHECK_LENGTH && Helpers.fastLineLen(x0, y0, x1, y1) <= LEN_TH) { + if (DO_CHECK_LENGTH && Helpers.fastLineLen(x0, y0, x1, y1) <= minLength) { return false; } @@ -922,7 +941,7 @@ MarlinUtils.logInfo("divQuad P0(" + x0 + ", " + y0 + ") P1(" + x1 + ", " + y1 + ") P2(" + x2 + ", " + y2 + ")"); } - if (DO_CHECK_LENGTH && Helpers.fastQuadLen(x0, y0, x1, y1, x2, y2) <= LEN_TH) { + if (DO_CHECK_LENGTH && Helpers.fastQuadLen(x0, y0, x1, y1, x2, y2) <= minLength) { return false; } @@ -945,7 +964,7 @@ MarlinUtils.logInfo("divCurve P0(" + x0 + ", " + y0 + ") P1(" + x1 + ", " + y1 + ") P2(" + x2 + ", " + y2 + ") P3(" + x3 + ", " + y3 + ")"); } - if (DO_CHECK_LENGTH && Helpers.fastCurvelen(x0, y0, x1, y1, x2, y2, x3, y3) <= LEN_TH) { + if (DO_CHECK_LENGTH && Helpers.fastCurvelen(x0, y0, x1, y1, x2, y2, x3, y3) <= minLength) { return false; } @@ -973,7 +992,7 @@ outCodeOR, clipRectPad); if (TRACE) { - MarlinUtils.logInfo("nSplits: "+ nSplits); + MarlinUtils.logInfo("nSplits: " + nSplits); MarlinUtils.logInfo("subTs: " + Arrays.toString(Arrays.copyOfRange(subTs, 0, nSplits))); } if (nSplits == 0) {