< prev index next >

modules/javafx.graphics/src/main/java/com/sun/prism/impl/shape/MarlinPrismUtils.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2011, 2017, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2011, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 42,76 **** public final class MarlinPrismUtils { private static final boolean FORCE_NO_AA = false; ! static final float UPPER_BND = Float.MAX_VALUE / 2.0f; ! static final float LOWER_BND = -UPPER_BND; ! ! static final boolean DO_CLIP = MarlinProperties.isDoClip(); ! static final boolean DO_CLIP_FILL = true; static final boolean DO_TRACE_PATH = false; static final boolean DO_CLIP_RUNTIME_ENABLE = MarlinProperties.isDoClipRuntimeFlag(); /** * Private constructor to prevent instantiation. */ private MarlinPrismUtils() { } - private static boolean nearZero(final double num) { - return Math.abs(num) < 2.0d * Math.ulp(num); - } - private static PathConsumer2D initStroker( final RendererContext rdrCtx, final BasicStroke stroke, final float lineWidth, ! final BaseTransform tx, final PathConsumer2D out) { // We use strokerat so that in Stroker and Dasher we can work only // with the pre-transformation coordinates. This will repeat a lot of // computations done in the path iterator, but the alternative is to --- 42,74 ---- public final class MarlinPrismUtils { private static final boolean FORCE_NO_AA = false; ! // slightly slower ~2% if enabled stroker clipping (lines) but skipping cap / join handling is few percents faster in specific cases ! static final boolean DISABLE_2ND_STROKER_CLIPPING = true; static final boolean DO_TRACE_PATH = false; + static final boolean DO_CLIP = MarlinProperties.isDoClip(); + static final boolean DO_CLIP_FILL = true; static final boolean DO_CLIP_RUNTIME_ENABLE = MarlinProperties.isDoClipRuntimeFlag(); + static final float UPPER_BND = Float.MAX_VALUE / 2.0f; + static final float LOWER_BND = -UPPER_BND; + /** * Private constructor to prevent instantiation. */ private MarlinPrismUtils() { } private static PathConsumer2D initStroker( final RendererContext rdrCtx, final BasicStroke stroke, final float lineWidth, ! BaseTransform tx, final PathConsumer2D out) { // We use strokerat so that in Stroker and Dasher we can work only // with the pre-transformation coordinates. This will repeat a lot of // computations done in the path iterator, but the alternative is to
*** 136,145 **** --- 134,147 ---- // applied. Ainv*T*A is not equal to T, but it is a translation, // which means that none of stroker's assumptions about its // input will be violated. After all this, A will be applied // to stroker's output. } + } else { + // either tx is null or it's the identity. In either case + // we don't transform the path. + tx = null; } // Get renderer offsets: float rdrOffX = 0.0f, rdrOffY = 0.0f;
*** 169,185 **** pc = transformerPC2D.deltaTransformConsumer(pc, strokerTx, rdrOffX, rdrOffY); // stroker will adjust the clip rectangle (width / miter limit): pc = rdrCtx.stroker.init(pc, width, stroke.getEndCap(), stroke.getLineJoin(), stroke.getMiterLimit(), ! scale, rdrOffX, rdrOffY); if (dashes != null) { if (!recycleDashes) { dashLen = dashes.length; } ! pc = rdrCtx.dasher.init(pc, dashes, dashLen, dashphase, recycleDashes); } else if (rdrCtx.doClip && (stroke.getEndCap() != Stroker.CAP_BUTT)) { if (DO_TRACE_PATH) { pc = transformerPC2D.traceClosedPathDetector(pc); } --- 171,200 ---- pc = transformerPC2D.deltaTransformConsumer(pc, strokerTx, rdrOffX, rdrOffY); // stroker will adjust the clip rectangle (width / miter limit): pc = rdrCtx.stroker.init(pc, width, stroke.getEndCap(), stroke.getLineJoin(), stroke.getMiterLimit(), ! scale, rdrOffX, rdrOffY, (dashes == null)); ! ! // Curve Monotizer: ! rdrCtx.monotonizer.init(width); if (dashes != null) { if (!recycleDashes) { dashLen = dashes.length; } ! if (DO_TRACE_PATH) { ! pc = transformerPC2D.traceDasher(pc); ! } ! pc = rdrCtx.dasher.init(pc, dashes, dashLen, dashphase, ! recycleDashes); ! ! if (DISABLE_2ND_STROKER_CLIPPING) { ! // disable stoker clipping: ! rdrCtx.stroker.disableClipping(); ! } ! } else if (rdrCtx.doClip && (stroke.getEndCap() != Stroker.CAP_BUTT)) { if (DO_TRACE_PATH) { pc = transformerPC2D.traceClosedPathDetector(pc); }
*** 206,215 **** --- 221,234 ---- * -> pc2d = Renderer (bounding box) */ return pc; } + private static boolean nearZero(final double num) { + return Math.abs(num) < 2.0d * Math.ulp(num); + } + private static PathConsumer2D initRenderer( final RendererContext rdrCtx, final BasicStroke stroke, final BaseTransform tx, final Rectangle clip,
*** 305,316 **** feedConsumer(rdrCtx, shape.getPathIterator(null), pc2d); } } private static void feedConsumer(final RendererContext rdrCtx, final PathIterator pi, ! final PathConsumer2D pc2d) { // mark context as DIRTY: rdrCtx.dirty = true; final float[] coords = rdrCtx.float6; --- 324,341 ---- feedConsumer(rdrCtx, shape.getPathIterator(null), pc2d); } } private static void feedConsumer(final RendererContext rdrCtx, final PathIterator pi, ! PathConsumer2D pc2d) { + if (MarlinConst.USE_PATH_SIMPLIFIER) { + // Use path simplifier at the first step + // to remove useless points + pc2d = rdrCtx.pathSimplifier.init(pc2d); + } + // mark context as DIRTY: rdrCtx.dirty = true; final float[] coords = rdrCtx.float6;
*** 426,437 **** } private static void feedConsumer(final RendererContext rdrCtx, final Path2D p2d, final BaseTransform xform, ! final PathConsumer2D pc2d) { // mark context as DIRTY: rdrCtx.dirty = true; final float[] coords = rdrCtx.float6; --- 451,468 ---- } private static void feedConsumer(final RendererContext rdrCtx, final Path2D p2d, final BaseTransform xform, ! PathConsumer2D pc2d) { + if (MarlinConst.USE_PATH_SIMPLIFIER) { + // Use path simplifier at the first step + // to remove useless points + pc2d = rdrCtx.pathSimplifier.init(pc2d); + } + // mark context as DIRTY: rdrCtx.dirty = true; final float[] coords = rdrCtx.float6;
< prev index next >