< 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 >