< prev index next >

modules/javafx.graphics/src/main/java/com/sun/marlin/DTransformingPathConsumer2D.java

Print this page

        

*** 95,115 **** public DPathConsumer2D detectClosedPath(DPathConsumer2D out) { return cpDetector.init(out); } ! public DPathConsumer2D pathClipper(DPathConsumer2D out, ! final double rdrOffX, ! final double rdrOffY) { ! return pathClipper.init(out, rdrOffX, rdrOffY); } public DPathConsumer2D deltaTransformConsumer(DPathConsumer2D out, ! BaseTransform at, ! final double rdrOffX, ! final double rdrOffY) { if (at == null) { return out; } final double mxx = at.getMxx(); --- 95,111 ---- public DPathConsumer2D detectClosedPath(DPathConsumer2D out) { return cpDetector.init(out); } ! public DPathConsumer2D pathClipper(DPathConsumer2D out) { ! return pathClipper.init(out); } public DPathConsumer2D deltaTransformConsumer(DPathConsumer2D out, ! BaseTransform at) { if (at == null) { return out; } final double mxx = at.getMxx();
*** 122,167 **** return out; } else { // Scale only if (rdrCtx.doClip) { // adjust clip rectangle (ymin, ymax, xmin, xmax): ! adjustClipOffset(rdrCtx.clipRect, rdrOffX, rdrOffY); ! 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); } return dt_DeltaTransformFilter.init(out, mxx, mxy, myx, myy); } } ! private static void adjustClipOffset(final double[] clipRect, ! final double rdrOffX, ! final double rdrOffY) ! { ! clipRect[0] += rdrOffY; ! clipRect[1] += rdrOffY; ! clipRect[2] += rdrOffX; ! clipRect[3] += rdrOffX; ! } ! ! private static void adjustClipScale(final double[] clipRect, final double mxx, final double myy) { // Adjust the clipping rectangle (iv_DeltaScaleFilter): ! clipRect[0] /= myy; ! clipRect[1] /= myy; ! clipRect[2] /= mxx; ! clipRect[3] /= mxx; } ! private static void adjustClipInverseDelta(final double[] clipRect, final double mxx, final double mxy, final double myx, final double myy) { // Adjust the clipping rectangle (iv_DeltaTransformFilter): final double det = mxx * myy - mxy * myx; --- 118,174 ---- return out; } else { // Scale only if (rdrCtx.doClip) { // adjust clip rectangle (ymin, ymax, xmin, xmax): ! 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): ! rdrCtx.clipInvScale = adjustClipInverseDelta(rdrCtx.clipRect, ! mxx, mxy, myx, myy); } return dt_DeltaTransformFilter.init(out, mxx, mxy, myx, myy); } } ! private static double adjustClipScale(final double[] clipRect, final double mxx, final double myy) { // Adjust the clipping rectangle (iv_DeltaScaleFilter): ! final double scaleY = 1.0d / myy; ! clipRect[0] *= scaleY; ! clipRect[1] *= scaleY; ! ! if (clipRect[1] < clipRect[0]) { ! double tmp = clipRect[0]; ! clipRect[0] = clipRect[1]; ! clipRect[1] = tmp; } ! final double scaleX = 1.0d / mxx; ! clipRect[2] *= scaleX; ! clipRect[3] *= scaleX; ! ! if (clipRect[3] < clipRect[2]) { ! double tmp = clipRect[2]; ! clipRect[2] = clipRect[3]; ! clipRect[3] = tmp; ! } ! ! if (MarlinConst.DO_LOG_CLIP) { ! MarlinUtils.logInfo("clipRect (ClipScale): " ! + Arrays.toString(clipRect)); ! } ! return 0.5d * (Math.abs(scaleX) + Math.abs(scaleY)); ! } ! ! private static double adjustClipInverseDelta(final double[] clipRect, final double mxx, final double mxy, final double myx, final double myy) { // Adjust the clipping rectangle (iv_DeltaTransformFilter): final double det = mxx * myy - mxy * myx;
*** 202,211 **** --- 209,228 ---- clipRect[0] = ymin; clipRect[1] = ymax; clipRect[2] = xmin; clipRect[3] = xmax; + + if (MarlinConst.DO_LOG_CLIP) { + MarlinUtils.logInfo("clipRect (ClipInverseDelta): " + + Arrays.toString(clipRect)); + } + + final double scaleX = Math.sqrt(imxx * imxx + imxy * imxy); + final double scaleY = Math.sqrt(imyx * imyx + imyy * imyy); + + return 0.5d * (scaleX + scaleY); } public DPathConsumer2D inverseDeltaTransformConsumer(DPathConsumer2D out, BaseTransform at) {
*** 219,229 **** if (mxy == 0.0d && myx == 0.0d) { if (mxx == 1.0d && myy == 1.0d) { return out; } else { ! return iv_DeltaScaleFilter.init(out, 1.0d/mxx, 1.0d/myy); } } else { final double det = mxx * myy - mxy * myx; return iv_DeltaTransformFilter.init(out, myy / det, --- 236,246 ---- if (mxy == 0.0d && myx == 0.0d) { if (mxx == 1.0d && myy == 1.0d) { return out; } else { ! return iv_DeltaScaleFilter.init(out, 1.0d / mxx, 1.0d / myy); } } else { final double det = mxx * myy - mxy * myx; return iv_DeltaTransformFilter.init(out, myy / det,
*** 514,539 **** rdrCtx.stats.hist_pcf_idxstack_indices, rdrCtx.stats.stat_array_pcf_idxstack_indices) : new IndexStack(rdrCtx); } ! PathClipFilter init(final DPathConsumer2D out, ! final double rdrOffX, ! final double rdrOffY) ! { this.out = out; - // add a small rounding error: - final double margin = 1e-3d; - - final double[] _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(); } --- 531,543 ---- rdrCtx.stats.hist_pcf_idxstack_indices, rdrCtx.stats.stat_array_pcf_idxstack_indices) : new IndexStack(rdrCtx); } ! PathClipFilter init(final DPathConsumer2D out) { this.out = out; if (MarlinConst.DO_CLIP_SUBDIVIDER) { // adjust padded clip rectangle: curveSplitter.init(); }
*** 847,856 **** --- 851,865 ---- private static final boolean TRACE = false; private static final int MAX_N_CURVES = 3 * 4; + private final DRendererContext rdrCtx; + + // scaled length threshold: + private double minLength; + // clip rectangle (ymin, ymax, xmin, xmax): final double[] clipRect; // clip rectangle (ymin, ymax, xmin, xmax) including padding: final double[] clipRectPad = new double[4];
*** 864,879 **** --- 873,899 ---- // dirty curve private final DCurve curve; CurveClipSplitter(final DRendererContext 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.0d) ? LEN_TH + : (LEN_TH * this.rdrCtx.clipInvScale); + + if (MarlinConst.DO_LOG_CLIP) { + MarlinUtils.logInfo("CurveClipSplitter.minLength = " + + minLength); + } + } } private void initPaddedClip() { // bounds as half-open intervals: minX <= x < maxX and minY <= y < maxY // adjust padded clip rectangle (ymin, ymax, xmin, xmax):
*** 886,896 **** _clipRectPad[2] = _clipRect[2] - CLIP_RECT_PADDING; _clipRectPad[3] = _clipRect[3] + CLIP_RECT_PADDING; if (TRACE) { MarlinUtils.logInfo("clip: X [" + _clipRectPad[2] + " .. " + _clipRectPad[3] +"] " ! + "Y ["+ _clipRectPad[0] + " .. " + _clipRectPad[1] +"]"); } } boolean splitLine(final double x0, final double y0, final double x1, final double y1, --- 906,916 ---- _clipRectPad[2] = _clipRect[2] - CLIP_RECT_PADDING; _clipRectPad[3] = _clipRect[3] + CLIP_RECT_PADDING; if (TRACE) { MarlinUtils.logInfo("clip: X [" + _clipRectPad[2] + " .. " + _clipRectPad[3] +"] " ! + "Y [" + _clipRectPad[0] + " .. " + _clipRectPad[1] +"]"); } } boolean splitLine(final double x0, final double y0, final double x1, final double y1,
*** 899,909 **** { if (TRACE) { MarlinUtils.logInfo("divLine P0(" + x0 + ", " + y0 + ") P1(" + x1 + ", " + y1 + ")"); } ! if (DO_CHECK_LENGTH && DHelpers.fastLineLen(x0, y0, x1, y1) <= LEN_TH) { return false; } final double[] mid = middle; mid[0] = x0; mid[1] = y0; --- 919,929 ---- { if (TRACE) { MarlinUtils.logInfo("divLine P0(" + x0 + ", " + y0 + ") P1(" + x1 + ", " + y1 + ")"); } ! if (DO_CHECK_LENGTH && DHelpers.fastLineLen(x0, y0, x1, y1) <= minLength) { return false; } final double[] mid = middle; mid[0] = x0; mid[1] = y0;
*** 920,930 **** { if (TRACE) { MarlinUtils.logInfo("divQuad P0(" + x0 + ", " + y0 + ") P1(" + x1 + ", " + y1 + ") P2(" + x2 + ", " + y2 + ")"); } ! if (DO_CHECK_LENGTH && DHelpers.fastQuadLen(x0, y0, x1, y1, x2, y2) <= LEN_TH) { return false; } final double[] mid = middle; mid[0] = x0; mid[1] = y0; --- 940,950 ---- { if (TRACE) { MarlinUtils.logInfo("divQuad P0(" + x0 + ", " + y0 + ") P1(" + x1 + ", " + y1 + ") P2(" + x2 + ", " + y2 + ")"); } ! if (DO_CHECK_LENGTH && DHelpers.fastQuadLen(x0, y0, x1, y1, x2, y2) <= minLength) { return false; } final double[] mid = middle; mid[0] = x0; mid[1] = y0;
*** 943,953 **** { if (TRACE) { MarlinUtils.logInfo("divCurve P0(" + x0 + ", " + y0 + ") P1(" + x1 + ", " + y1 + ") P2(" + x2 + ", " + y2 + ") P3(" + x3 + ", " + y3 + ")"); } ! if (DO_CHECK_LENGTH && DHelpers.fastCurvelen(x0, y0, x1, y1, x2, y2, x3, y3) <= LEN_TH) { return false; } final double[] mid = middle; mid[0] = x0; mid[1] = y0; --- 963,973 ---- { if (TRACE) { MarlinUtils.logInfo("divCurve P0(" + x0 + ", " + y0 + ") P1(" + x1 + ", " + y1 + ") P2(" + x2 + ", " + y2 + ") P3(" + x3 + ", " + y3 + ")"); } ! if (DO_CHECK_LENGTH && DHelpers.fastCurvelen(x0, y0, x1, y1, x2, y2, x3, y3) <= minLength) { return false; } final double[] mid = middle; mid[0] = x0; mid[1] = y0;
*** 971,981 **** final int nSplits = DHelpers.findClipPoints(curve, mid, subTs, type, outCodeOR, clipRectPad); if (TRACE) { ! MarlinUtils.logInfo("nSplits: "+ nSplits); MarlinUtils.logInfo("subTs: " + Arrays.toString(Arrays.copyOfRange(subTs, 0, nSplits))); } if (nSplits == 0) { // only curve support shortcut return false; --- 991,1001 ---- final int nSplits = DHelpers.findClipPoints(curve, mid, subTs, type, outCodeOR, clipRectPad); if (TRACE) { ! MarlinUtils.logInfo("nSplits: " + nSplits); MarlinUtils.logInfo("subTs: " + Arrays.toString(Arrays.copyOfRange(subTs, 0, nSplits))); } if (nSplits == 0) { // only curve support shortcut return false;
< prev index next >