src/java.desktop/share/classes/sun/java2d/marlin/Dasher.java
author lbourges
Tue, 08 May 2018 10:13:21 +0200
changeset 50135 793e481c7641
parent 49496 1ea202af7a97
child 57929 13178f7e75d5
permissions -rw-r--r--
8202580: Dashed BasicStroke randomly painted incorrectly, may freeze application Summary: fixed Dasher.init() to use the correct part [0; dashLen[ Reviewed-by: prr, serb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     1
/*
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
     2
 * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     4
 *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    10
 *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    15
 * accompanied this code).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    16
 *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    20
 *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    23
 * questions.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    24
 */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    25
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    26
package sun.java2d.marlin;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    27
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    28
import java.util.Arrays;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    29
import sun.awt.geom.PathConsumer2D;
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    30
import sun.java2d.marlin.TransformingPathConsumer2D.CurveBasicMonotonizer;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    31
import sun.java2d.marlin.TransformingPathConsumer2D.CurveClipSplitter;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    32
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    33
/**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    34
 * The <code>Dasher</code> class takes a series of linear commands
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    35
 * (<code>moveTo</code>, <code>lineTo</code>, <code>close</code> and
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    36
 * <code>end</code>) and breaks them into smaller segments according to a
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    37
 * dash pattern array and a starting dash phase.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    38
 *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    39
 * <p> Issues: in J2Se, a zero length dash segment as drawn as a very
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    40
 * short dash, whereas Pisces does not draw anything.  The PostScript
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    41
 * semantics are unclear.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    42
 *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    43
 */
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
    44
final class Dasher implements PathConsumer2D, MarlinConst {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    45
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    46
    /* huge circle with radius ~ 2E9 only needs 12 subdivision levels */
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    47
    static final int REC_LIMIT = 16;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    48
    static final float CURVE_LEN_ERR = MarlinProperties.getCurveLengthError(); // 0.01
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
    49
    static final float MIN_T_INC = 1.0f / (1 << REC_LIMIT);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
    50
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
    51
    // More than 24 bits of mantissa means we can no longer accurately
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
    52
    // measure the number of times cycled through the dash array so we
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
    53
    // punt and override the phase to just be 0 past that point.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
    54
    static final float MAX_CYCLES = 16000000.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    55
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    56
    private PathConsumer2D out;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    57
    private float[] dash;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    58
    private int dashLen;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    59
    private float startPhase;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    60
    private boolean startDashOn;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    61
    private int startIdx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    62
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    63
    private boolean starting;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    64
    private boolean needsMoveTo;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    65
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    66
    private int idx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    67
    private boolean dashOn;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    68
    private float phase;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    69
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    70
    // The starting point of the path
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    71
    private float sx0, sy0;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    72
    // the current point
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    73
    private float cx0, cy0;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    74
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    75
    // temporary storage for the current curve
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    76
    private final float[] curCurvepts;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    77
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    78
    // per-thread renderer context
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    79
    final RendererContext rdrCtx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    80
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    81
    // flag to recycle dash array copy
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    82
    boolean recycleDashes;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    83
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    84
    // We don't emit the first dash right away. If we did, caps would be
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    85
    // drawn on it, but we need joins to be drawn if there's a closePath()
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    86
    // So, we store the path elements that make up the first dash in the
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    87
    // buffer below.
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    88
    private float[] firstSegmentsBuffer; // dynamic array
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    89
    private int firstSegidx;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    90
40421
d5ee65e2b0fb 8159638: Improve array caches and renderer stats in Marlin renderer
lbourges
parents: 39519
diff changeset
    91
    // dashes ref (dirty)
d5ee65e2b0fb 8159638: Improve array caches and renderer stats in Marlin renderer
lbourges
parents: 39519
diff changeset
    92
    final FloatArrayCache.Reference dashes_ref;
d5ee65e2b0fb 8159638: Improve array caches and renderer stats in Marlin renderer
lbourges
parents: 39519
diff changeset
    93
    // firstSegmentsBuffer ref (dirty)
d5ee65e2b0fb 8159638: Improve array caches and renderer stats in Marlin renderer
lbourges
parents: 39519
diff changeset
    94
    final FloatArrayCache.Reference firstSegmentsBuffer_ref;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    95
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    96
    // Bounds of the drawing region, at pixel precision.
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    97
    private float[] clipRect;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    98
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    99
    // the outcode of the current point
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   100
    private int cOutCode = 0;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   101
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   102
    private boolean subdivide = DO_CLIP_SUBDIVIDER;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   103
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   104
    private final LengthIterator li = new LengthIterator();
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   105
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   106
    private final CurveClipSplitter curveSplitter;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   107
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   108
    private float cycleLen;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   109
    private boolean outside;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   110
    private float totalSkipLen;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   111
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   112
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   113
     * Constructs a <code>Dasher</code>.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   114
     * @param rdrCtx per-thread renderer context
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   115
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   116
    Dasher(final RendererContext rdrCtx) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   117
        this.rdrCtx = rdrCtx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   118
40421
d5ee65e2b0fb 8159638: Improve array caches and renderer stats in Marlin renderer
lbourges
parents: 39519
diff changeset
   119
        dashes_ref = rdrCtx.newDirtyFloatArrayRef(INITIAL_ARRAY); // 1K
d5ee65e2b0fb 8159638: Improve array caches and renderer stats in Marlin renderer
lbourges
parents: 39519
diff changeset
   120
d5ee65e2b0fb 8159638: Improve array caches and renderer stats in Marlin renderer
lbourges
parents: 39519
diff changeset
   121
        firstSegmentsBuffer_ref = rdrCtx.newDirtyFloatArrayRef(INITIAL_ARRAY); // 1K
d5ee65e2b0fb 8159638: Improve array caches and renderer stats in Marlin renderer
lbourges
parents: 39519
diff changeset
   122
        firstSegmentsBuffer     = firstSegmentsBuffer_ref.initial;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   123
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   124
        // we need curCurvepts to be able to contain 2 curves because when
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   125
        // dashing curves, we need to subdivide it
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   126
        curCurvepts = new float[8 * 2];
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   127
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   128
        this.curveSplitter = rdrCtx.curveClipSplitter;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   129
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   130
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   131
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   132
     * Initialize the <code>Dasher</code>.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   133
     *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   134
     * @param out an output <code>PathConsumer2D</code>.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   135
     * @param dash an array of <code>float</code>s containing the dash pattern
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   136
     * @param dashLen length of the given dash array
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   137
     * @param phase a <code>float</code> containing the dash phase
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   138
     * @param recycleDashes true to indicate to recycle the given dash array
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   139
     * @return this instance
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   140
     */
50135
793e481c7641 8202580: Dashed BasicStroke randomly painted incorrectly, may freeze application
lbourges
parents: 49496
diff changeset
   141
    Dasher init(final PathConsumer2D out, final float[] dash, final int dashLen,
793e481c7641 8202580: Dashed BasicStroke randomly painted incorrectly, may freeze application
lbourges
parents: 49496
diff changeset
   142
                float phase, final boolean recycleDashes)
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   143
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   144
        this.out = out;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   145
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   146
        // Normalize so 0 <= phase < dash[0]
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   147
        int sidx = 0;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   148
        dashOn = true;
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   149
50135
793e481c7641 8202580: Dashed BasicStroke randomly painted incorrectly, may freeze application
lbourges
parents: 49496
diff changeset
   150
        // note: BasicStroke constructor checks dash elements and sum > 0
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   151
        float sum = 0.0f;
50135
793e481c7641 8202580: Dashed BasicStroke randomly painted incorrectly, may freeze application
lbourges
parents: 49496
diff changeset
   152
        for (int i = 0; i < dashLen; i++) {
793e481c7641 8202580: Dashed BasicStroke randomly painted incorrectly, may freeze application
lbourges
parents: 49496
diff changeset
   153
            sum += dash[i];
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   154
        }
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   155
        this.cycleLen = sum;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   156
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   157
        float cycles = phase / sum;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   158
        if (phase < 0.0f) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   159
            if (-cycles >= MAX_CYCLES) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   160
                phase = 0.0f;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   161
            } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   162
                int fullcycles = FloatMath.floor_int(-cycles);
50135
793e481c7641 8202580: Dashed BasicStroke randomly painted incorrectly, may freeze application
lbourges
parents: 49496
diff changeset
   163
                if ((fullcycles & dashLen & 1) != 0) {
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   164
                    dashOn = !dashOn;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   165
                }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   166
                phase += fullcycles * sum;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   167
                while (phase < 0.0f) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   168
                    if (--sidx < 0) {
50135
793e481c7641 8202580: Dashed BasicStroke randomly painted incorrectly, may freeze application
lbourges
parents: 49496
diff changeset
   169
                        sidx = dashLen - 1;
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   170
                    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   171
                    phase += dash[sidx];
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   172
                    dashOn = !dashOn;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   173
                }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   174
            }
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   175
        } else if (phase > 0.0f) {
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   176
            if (cycles >= MAX_CYCLES) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   177
                phase = 0.0f;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   178
            } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   179
                int fullcycles = FloatMath.floor_int(cycles);
50135
793e481c7641 8202580: Dashed BasicStroke randomly painted incorrectly, may freeze application
lbourges
parents: 49496
diff changeset
   180
                if ((fullcycles & dashLen & 1) != 0) {
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   181
                    dashOn = !dashOn;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   182
                }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   183
                phase -= fullcycles * sum;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   184
                float d;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   185
                while (phase >= (d = dash[sidx])) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   186
                    phase -= d;
50135
793e481c7641 8202580: Dashed BasicStroke randomly painted incorrectly, may freeze application
lbourges
parents: 49496
diff changeset
   187
                    sidx = (sidx + 1) % dashLen;
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   188
                    dashOn = !dashOn;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   189
                }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   190
            }
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   191
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   192
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   193
        this.dash = dash;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   194
        this.dashLen = dashLen;
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   195
        this.phase = phase;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   196
        this.startPhase = phase;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   197
        this.startDashOn = dashOn;
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   198
        this.startIdx = sidx;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   199
        this.starting = true;
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   200
        this.needsMoveTo = false;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   201
        this.firstSegidx = 0;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   202
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   203
        this.recycleDashes = recycleDashes;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   204
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   205
        if (rdrCtx.doClip) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   206
            this.clipRect = rdrCtx.clipRect;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   207
        } else {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   208
            this.clipRect = null;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   209
            this.cOutCode = 0;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   210
        }
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   211
        return this; // fluent API
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   212
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   213
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   214
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   215
     * Disposes this dasher:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   216
     * clean up before reusing this instance
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   217
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   218
    void dispose() {
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 34417
diff changeset
   219
        if (DO_CLEAN_DIRTY) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   220
            // Force zero-fill dirty arrays:
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   221
            Arrays.fill(curCurvepts, 0.0f);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   222
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   223
        // Return arrays:
40421
d5ee65e2b0fb 8159638: Improve array caches and renderer stats in Marlin renderer
lbourges
parents: 39519
diff changeset
   224
        if (recycleDashes) {
d5ee65e2b0fb 8159638: Improve array caches and renderer stats in Marlin renderer
lbourges
parents: 39519
diff changeset
   225
            dash = dashes_ref.putArray(dash);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   226
        }
40421
d5ee65e2b0fb 8159638: Improve array caches and renderer stats in Marlin renderer
lbourges
parents: 39519
diff changeset
   227
        firstSegmentsBuffer = firstSegmentsBuffer_ref.putArray(firstSegmentsBuffer);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   228
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   229
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   230
    float[] copyDashArray(final float[] dashes) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   231
        final int len = dashes.length;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   232
        final float[] newDashes;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   233
        if (len <= MarlinConst.INITIAL_ARRAY) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   234
            newDashes = dashes_ref.initial;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   235
        } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   236
            if (DO_STATS) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   237
                rdrCtx.stats.stat_array_dasher_dasher.add(len);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   238
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   239
            newDashes = dashes_ref.getArray(len);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   240
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   241
        System.arraycopy(dashes, 0, newDashes, 0, len);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   242
        return newDashes;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   243
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   244
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   245
    @Override
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   246
    public void moveTo(final float x0, final float y0) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   247
        if (firstSegidx != 0) {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   248
            out.moveTo(sx0, sy0);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   249
            emitFirstSegments();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   250
        }
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   251
        this.needsMoveTo = true;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   252
        this.idx = startIdx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   253
        this.dashOn = this.startDashOn;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   254
        this.phase = this.startPhase;
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   255
        this.cx0 = x0;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   256
        this.cy0 = y0;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   257
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   258
        // update starting point:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   259
        this.sx0 = x0;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   260
        this.sy0 = y0;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   261
        this.starting = true;
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   262
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   263
        if (clipRect != null) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   264
            final int outcode = Helpers.outcode(x0, y0, clipRect);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   265
            this.cOutCode = outcode;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   266
            this.outside = false;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   267
            this.totalSkipLen = 0.0f;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   268
        }
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   269
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   270
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   271
    private void emitSeg(float[] buf, int off, int type) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   272
        switch (type) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   273
        case 8:
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   274
            out.curveTo(buf[off    ], buf[off + 1],
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   275
                        buf[off + 2], buf[off + 3],
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   276
                        buf[off + 4], buf[off + 5]);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   277
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   278
        case 6:
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   279
            out.quadTo(buf[off    ], buf[off + 1],
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   280
                       buf[off + 2], buf[off + 3]);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   281
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   282
        case 4:
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   283
            out.lineTo(buf[off], buf[off + 1]);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   284
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   285
        default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   286
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   287
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   288
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   289
    private void emitFirstSegments() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   290
        final float[] fSegBuf = firstSegmentsBuffer;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   291
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   292
        for (int i = 0, len = firstSegidx; i < len; ) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   293
            int type = (int)fSegBuf[i];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   294
            emitSeg(fSegBuf, i + 1, type);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   295
            i += (type - 1);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   296
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   297
        firstSegidx = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   298
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   299
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   300
    // precondition: pts must be in relative coordinates (relative to x0,y0)
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   301
    private void goTo(final float[] pts, final int off, final int type,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   302
                      final boolean on)
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   303
    {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   304
        final int index = off + type;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   305
        final float x = pts[index - 4];
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   306
        final float y = pts[index - 3];
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   307
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   308
        if (on) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   309
            if (starting) {
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   310
                goTo_starting(pts, off, type);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   311
            } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   312
                if (needsMoveTo) {
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   313
                    needsMoveTo = false;
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   314
                    out.moveTo(cx0, cy0);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   315
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   316
                emitSeg(pts, off, type);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   317
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   318
        } else {
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   319
            if (starting) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   320
                // low probability test (hotspot)
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   321
                starting = false;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   322
            }
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   323
            needsMoveTo = true;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   324
        }
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   325
        this.cx0 = x;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   326
        this.cy0 = y;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   327
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   328
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   329
    private void goTo_starting(final float[] pts, final int off, final int type) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   330
        int len = type - 1; // - 2 + 1
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   331
        int segIdx = firstSegidx;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   332
        float[] buf = firstSegmentsBuffer;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   333
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   334
        if (segIdx + len  > buf.length) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   335
            if (DO_STATS) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   336
                rdrCtx.stats.stat_array_dasher_firstSegmentsBuffer
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   337
                    .add(segIdx + len);
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   338
            }
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   339
            firstSegmentsBuffer = buf
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   340
                = firstSegmentsBuffer_ref.widenArray(buf, segIdx,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   341
                                                     segIdx + len);
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   342
        }
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   343
        buf[segIdx++] = type;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   344
        len--;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   345
        // small arraycopy (2, 4 or 6) but with offset:
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   346
        System.arraycopy(pts, off, buf, segIdx, len);
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   347
        firstSegidx = segIdx + len;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   348
    }
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   349
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   350
    @Override
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   351
    public void lineTo(final float x1, final float y1) {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   352
        final int outcode0 = this.cOutCode;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   353
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   354
        if (clipRect != null) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   355
            final int outcode1 = Helpers.outcode(x1, y1, clipRect);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   356
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   357
            // Should clip
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   358
            final int orCode = (outcode0 | outcode1);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   359
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   360
            if (orCode != 0) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   361
                final int sideCode = outcode0 & outcode1;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   362
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   363
                // basic rejection criteria:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   364
                if (sideCode == 0) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   365
                    // ovelap clip:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   366
                    if (subdivide) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   367
                        // avoid reentrance
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   368
                        subdivide = false;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   369
                        // subdivide curve => callback with subdivided parts:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   370
                        boolean ret = curveSplitter.splitLine(cx0, cy0, x1, y1,
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   371
                                                              orCode, this);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   372
                        // reentrance is done:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   373
                        subdivide = true;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   374
                        if (ret) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   375
                            return;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   376
                        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   377
                    }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   378
                    // already subdivided so render it
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   379
                } else {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   380
                    this.cOutCode = outcode1;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   381
                    skipLineTo(x1, y1);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   382
                    return;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   383
                }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   384
            }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   385
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   386
            this.cOutCode = outcode1;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   387
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   388
            if (this.outside) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   389
                this.outside = false;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   390
                // Adjust current index, phase & dash:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   391
                skipLen();
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   392
            }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   393
        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   394
        _lineTo(x1, y1);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   395
    }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   396
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   397
    private void _lineTo(final float x1, final float y1) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   398
        final float dx = x1 - cx0;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   399
        final float dy = y1 - cy0;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   400
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   401
        float len = dx * dx + dy * dy;
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   402
        if (len == 0.0f) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   403
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   404
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   405
        len = (float) Math.sqrt(len);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   406
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   407
        // The scaling factors needed to get the dx and dy of the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   408
        // transformed dash segments.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   409
        final float cx = dx / len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   410
        final float cy = dy / len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   411
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   412
        final float[] _curCurvepts = curCurvepts;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   413
        final float[] _dash = dash;
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   414
        final int _dashLen = this.dashLen;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   415
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   416
        int _idx = idx;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   417
        boolean _dashOn = dashOn;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   418
        float _phase = phase;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   419
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   420
        float leftInThisDashSegment, d;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   421
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   422
        while (true) {
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   423
            d = _dash[_idx];
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   424
            leftInThisDashSegment = d - _phase;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   425
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   426
            if (len <= leftInThisDashSegment) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   427
                _curCurvepts[0] = x1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   428
                _curCurvepts[1] = y1;
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   429
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   430
                goTo(_curCurvepts, 0, 4, _dashOn);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   431
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   432
                // Advance phase within current dash segment
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   433
                _phase += len;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   434
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   435
                // TODO: compare float values using epsilon:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   436
                if (len == leftInThisDashSegment) {
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   437
                    _phase = 0.0f;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   438
                    _idx = (_idx + 1) % _dashLen;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   439
                    _dashOn = !_dashOn;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   440
                }
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   441
                break;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   442
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   443
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   444
            if (_phase == 0.0f) {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   445
                _curCurvepts[0] = cx0 + d * cx;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   446
                _curCurvepts[1] = cy0 + d * cy;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   447
            } else {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   448
                _curCurvepts[0] = cx0 + leftInThisDashSegment * cx;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   449
                _curCurvepts[1] = cy0 + leftInThisDashSegment * cy;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   450
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   451
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   452
            goTo(_curCurvepts, 0, 4, _dashOn);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   453
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   454
            len -= leftInThisDashSegment;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   455
            // Advance to next dash segment
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   456
            _idx = (_idx + 1) % _dashLen;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   457
            _dashOn = !_dashOn;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   458
            _phase = 0.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   459
        }
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   460
        // Save local state:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   461
        idx = _idx;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   462
        dashOn = _dashOn;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   463
        phase = _phase;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   464
    }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   465
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   466
    private void skipLineTo(final float x1, final float y1) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   467
        final float dx = x1 - cx0;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   468
        final float dy = y1 - cy0;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   469
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   470
        float len = dx * dx + dy * dy;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   471
        if (len != 0.0f) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   472
            len = (float)Math.sqrt(len);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   473
        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   474
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   475
        // Accumulate skipped length:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   476
        this.outside = true;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   477
        this.totalSkipLen += len;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   478
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   479
        // Fix initial move:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   480
        this.needsMoveTo = true;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   481
        this.starting = false;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   482
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   483
        this.cx0 = x1;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   484
        this.cy0 = y1;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   485
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   486
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   487
    public void skipLen() {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   488
        float len = this.totalSkipLen;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   489
        this.totalSkipLen = 0.0f;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   490
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   491
        final float[] _dash = dash;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   492
        final int _dashLen = this.dashLen;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   493
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   494
        int _idx = idx;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   495
        boolean _dashOn = dashOn;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   496
        float _phase = phase;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   497
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   498
        // -2 to ensure having 2 iterations of the post-loop
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   499
        // to compensate the remaining phase
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   500
        final long fullcycles = (long)Math.floor(len / cycleLen) - 2L;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   501
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   502
        if (fullcycles > 0L) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   503
            len -= cycleLen * fullcycles;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   504
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   505
            final long iterations = fullcycles * _dashLen;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   506
            _idx = (int) (iterations + _idx) % _dashLen;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   507
            _dashOn = (iterations + (_dashOn ? 1L : 0L) & 1L) == 1L;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   508
        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   509
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   510
        float leftInThisDashSegment, d;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   511
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   512
        while (true) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   513
            d = _dash[_idx];
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   514
            leftInThisDashSegment = d - _phase;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   515
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   516
            if (len <= leftInThisDashSegment) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   517
                // Advance phase within current dash segment
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   518
                _phase += len;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   519
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   520
                // TODO: compare float values using epsilon:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   521
                if (len == leftInThisDashSegment) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   522
                    _phase = 0.0f;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   523
                    _idx = (_idx + 1) % _dashLen;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   524
                    _dashOn = !_dashOn;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   525
                }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   526
                break;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   527
            }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   528
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   529
            len -= leftInThisDashSegment;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   530
            // Advance to next dash segment
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   531
            _idx = (_idx + 1) % _dashLen;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   532
            _dashOn = !_dashOn;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   533
            _phase = 0.0f;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   534
        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   535
        // Save local state:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   536
        idx = _idx;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   537
        dashOn = _dashOn;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   538
        phase = _phase;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   539
    }
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   540
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   541
    // preconditions: curCurvepts must be an array of length at least 2 * type,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   542
    // that contains the curve we want to dash in the first type elements
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   543
    private void somethingTo(final int type) {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   544
        final float[] _curCurvepts = curCurvepts;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   545
        if (pointCurve(_curCurvepts, type)) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   546
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   547
        }
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   548
        final LengthIterator _li = li;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   549
        final float[] _dash = dash;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   550
        final int _dashLen = this.dashLen;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   551
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   552
        _li.initializeIterationOnCurve(_curCurvepts, type);
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   553
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   554
        int _idx = idx;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   555
        boolean _dashOn = dashOn;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   556
        float _phase = phase;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   557
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   558
        // initially the current curve is at curCurvepts[0...type]
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   559
        int curCurveoff = 0;
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   560
        float prevT = 0.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   561
        float t;
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   562
        float leftInThisDashSegment = _dash[_idx] - _phase;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   563
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   564
        while ((t = _li.next(leftInThisDashSegment)) < 1.0f) {
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   565
            if (t != 0.0f) {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   566
                Helpers.subdivideAt((t - prevT) / (1.0f - prevT),
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   567
                                    _curCurvepts, curCurveoff,
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   568
                                    _curCurvepts, 0, type);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   569
                prevT = t;
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   570
                goTo(_curCurvepts, 2, type, _dashOn);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   571
                curCurveoff = type;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   572
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   573
            // Advance to next dash segment
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   574
            _idx = (_idx + 1) % _dashLen;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   575
            _dashOn = !_dashOn;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   576
            _phase = 0.0f;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   577
            leftInThisDashSegment = _dash[_idx];
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   578
        }
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   579
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   580
        goTo(_curCurvepts, curCurveoff + 2, type, _dashOn);
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   581
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   582
        _phase += _li.lastSegLen();
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   583
        if (_phase >= _dash[_idx]) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   584
            _phase = 0.0f;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   585
            _idx = (_idx + 1) % _dashLen;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   586
            _dashOn = !_dashOn;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   587
        }
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   588
        // Save local state:
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   589
        idx = _idx;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   590
        dashOn = _dashOn;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   591
        phase = _phase;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   592
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   593
        // reset LengthIterator:
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   594
        _li.reset();
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   595
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   596
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   597
    private void skipSomethingTo(final int type) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   598
        final float[] _curCurvepts = curCurvepts;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   599
        if (pointCurve(_curCurvepts, type)) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   600
            return;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   601
        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   602
        final LengthIterator _li = li;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   603
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   604
        _li.initializeIterationOnCurve(_curCurvepts, type);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   605
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   606
        // In contrary to somethingTo(),
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   607
        // just estimate properly the curve length:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   608
        final float len = _li.totalLength();
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   609
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   610
        // Accumulate skipped length:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   611
        this.outside = true;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   612
        this.totalSkipLen += len;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   613
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   614
        // Fix initial move:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   615
        this.needsMoveTo = true;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   616
        this.starting = false;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   617
    }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   618
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   619
    private static boolean pointCurve(final float[] curve, final int type) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   620
        for (int i = 2; i < type; i++) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   621
            if (curve[i] != curve[i-2]) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   622
                return false;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   623
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   624
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   625
        return true;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   626
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   627
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   628
    // Objects of this class are used to iterate through curves. They return
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   629
    // t values where the left side of the curve has a specified length.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   630
    // It does this by subdividing the input curve until a certain error
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   631
    // condition has been met. A recursive subdivision procedure would
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   632
    // return as many as 1<<limit curves, but this is an iterator and we
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   633
    // don't need all the curves all at once, so what we carry out a
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   634
    // lazy inorder traversal of the recursion tree (meaning we only move
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   635
    // through the tree when we need the next subdivided curve). This saves
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   636
    // us a lot of memory because at any one time we only need to store
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   637
    // limit+1 curves - one for each level of the tree + 1.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   638
    // NOTE: the way we do things here is not enough to traverse a general
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   639
    // tree; however, the trees we are interested in have the property that
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   640
    // every non leaf node has exactly 2 children
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   641
    static final class LengthIterator {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   642
        // Holds the curves at various levels of the recursion. The root
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   643
        // (i.e. the original curve) is at recCurveStack[0] (but then it
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   644
        // gets subdivided, the left half is put at 1, so most of the time
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   645
        // only the right half of the original curve is at 0)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   646
        private final float[][] recCurveStack; // dirty
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   647
        // sidesRight[i] indicates whether the node at level i+1 in the path from
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   648
        // the root to the current leaf is a left or right child of its parent.
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   649
        private final boolean[] sidesRight; // dirty
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   650
        private int curveType;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   651
        // lastT and nextT delimit the current leaf.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   652
        private float nextT;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   653
        private float lenAtNextT;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   654
        private float lastT;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   655
        private float lenAtLastT;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   656
        private float lenAtLastSplit;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   657
        private float lastSegLen;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   658
        // the current level in the recursion tree. 0 is the root. limit
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   659
        // is the deepest possible leaf.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   660
        private int recLevel;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   661
        private boolean done;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   662
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   663
        // the lengths of the lines of the control polygon. Only its first
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   664
        // curveType/2 - 1 elements are valid. This is an optimization. See
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   665
        // next() for more detail.
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   666
        private final float[] curLeafCtrlPolyLengths = new float[3];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   667
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   668
        LengthIterator() {
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 34417
diff changeset
   669
            this.recCurveStack = new float[REC_LIMIT + 1][8];
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   670
            this.sidesRight = new boolean[REC_LIMIT];
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   671
            // if any methods are called without first initializing this object
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   672
            // on a curve, we want it to fail ASAP.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   673
            this.nextT = Float.MAX_VALUE;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   674
            this.lenAtNextT = Float.MAX_VALUE;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   675
            this.lenAtLastSplit = Float.MIN_VALUE;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   676
            this.recLevel = Integer.MIN_VALUE;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   677
            this.lastSegLen = Float.MAX_VALUE;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   678
            this.done = true;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   679
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   680
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   681
        /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   682
         * Reset this LengthIterator.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   683
         */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   684
        void reset() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   685
            // keep data dirty
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   686
            // as it appears not useful to reset data:
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 34417
diff changeset
   687
            if (DO_CLEAN_DIRTY) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   688
                final int recLimit = recCurveStack.length - 1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   689
                for (int i = recLimit; i >= 0; i--) {
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   690
                    Arrays.fill(recCurveStack[i], 0.0f);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   691
                }
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   692
                Arrays.fill(sidesRight, false);
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   693
                Arrays.fill(curLeafCtrlPolyLengths, 0.0f);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   694
                Arrays.fill(nextRoots, 0.0f);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   695
                Arrays.fill(flatLeafCoefCache, 0.0f);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   696
                flatLeafCoefCache[2] = -1.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   697
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   698
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   699
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   700
        void initializeIterationOnCurve(final float[] pts, final int type) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   701
            // optimize arraycopy (8 values faster than 6 = type):
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   702
            System.arraycopy(pts, 0, recCurveStack[0], 0, 8);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   703
            this.curveType = type;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   704
            this.recLevel = 0;
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   705
            this.lastT = 0.0f;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   706
            this.lenAtLastT = 0.0f;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   707
            this.nextT = 0.0f;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   708
            this.lenAtNextT = 0.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   709
            goLeft(); // initializes nextT and lenAtNextT properly
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   710
            this.lenAtLastSplit = 0.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   711
            if (recLevel > 0) {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   712
                this.sidesRight[0] = false;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   713
                this.done = false;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   714
            } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   715
                // the root of the tree is a leaf so we're done.
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   716
                this.sidesRight[0] = true;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   717
                this.done = true;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   718
            }
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   719
            this.lastSegLen = 0.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   720
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   721
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   722
        // 0 == false, 1 == true, -1 == invalid cached value.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   723
        private int cachedHaveLowAcceleration = -1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   724
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   725
        private boolean haveLowAcceleration(final float err) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   726
            if (cachedHaveLowAcceleration == -1) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   727
                final float len1 = curLeafCtrlPolyLengths[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   728
                final float len2 = curLeafCtrlPolyLengths[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   729
                // the test below is equivalent to !within(len1/len2, 1, err).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   730
                // It is using a multiplication instead of a division, so it
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   731
                // should be a bit faster.
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   732
                if (!Helpers.within(len1, len2, err * len2)) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   733
                    cachedHaveLowAcceleration = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   734
                    return false;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   735
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   736
                if (curveType == 8) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   737
                    final float len3 = curLeafCtrlPolyLengths[2];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   738
                    // if len1 is close to 2 and 2 is close to 3, that probably
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   739
                    // means 1 is close to 3 so the second part of this test might
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   740
                    // not be needed, but it doesn't hurt to include it.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   741
                    final float errLen3 = err * len3;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   742
                    if (!(Helpers.within(len2, len3, errLen3) &&
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   743
                          Helpers.within(len1, len3, errLen3))) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   744
                        cachedHaveLowAcceleration = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   745
                        return false;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   746
                    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   747
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   748
                cachedHaveLowAcceleration = 1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   749
                return true;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   750
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   751
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   752
            return (cachedHaveLowAcceleration == 1);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   753
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   754
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   755
        // we want to avoid allocations/gc so we keep this array so we
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   756
        // can put roots in it,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   757
        private final float[] nextRoots = new float[4];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   758
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   759
        // caches the coefficients of the current leaf in its flattened
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   760
        // form (see inside next() for what that means). The cache is
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   761
        // invalid when it's third element is negative, since in any
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   762
        // valid flattened curve, this would be >= 0.
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   763
        private final float[] flatLeafCoefCache = new float[]{0.0f, 0.0f, -1.0f, 0.0f};
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   764
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   765
        // returns the t value where the remaining curve should be split in
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   766
        // order for the left subdivided curve to have length len. If len
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   767
        // is >= than the length of the uniterated curve, it returns 1.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   768
        float next(final float len) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   769
            final float targetLength = lenAtLastSplit + len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   770
            while (lenAtNextT < targetLength) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   771
                if (done) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   772
                    lastSegLen = lenAtNextT - lenAtLastSplit;
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   773
                    return 1.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   774
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   775
                goToNextLeaf();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   776
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   777
            lenAtLastSplit = targetLength;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   778
            final float leaflen = lenAtNextT - lenAtLastT;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   779
            float t = (targetLength - lenAtLastT) / leaflen;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   780
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   781
            // cubicRootsInAB is a fairly expensive call, so we just don't do it
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   782
            // if the acceleration in this section of the curve is small enough.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   783
            if (!haveLowAcceleration(0.05f)) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   784
                // We flatten the current leaf along the x axis, so that we're
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   785
                // left with a, b, c which define a 1D Bezier curve. We then
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   786
                // solve this to get the parameter of the original leaf that
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   787
                // gives us the desired length.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   788
                final float[] _flatLeafCoefCache = flatLeafCoefCache;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   789
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   790
                if (_flatLeafCoefCache[2] < 0.0f) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   791
                    float x =     curLeafCtrlPolyLengths[0],
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   792
                          y = x + curLeafCtrlPolyLengths[1];
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   793
                    if (curveType == 8) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   794
                        float z = y + curLeafCtrlPolyLengths[2];
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   795
                        _flatLeafCoefCache[0] = 3.0f * (x - y) + z;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   796
                        _flatLeafCoefCache[1] = 3.0f * (y - 2.0f * x);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   797
                        _flatLeafCoefCache[2] = 3.0f * x;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   798
                        _flatLeafCoefCache[3] = -z;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   799
                    } else if (curveType == 6) {
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   800
                        _flatLeafCoefCache[0] = 0.0f;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   801
                        _flatLeafCoefCache[1] = y - 2.0f * x;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   802
                        _flatLeafCoefCache[2] = 2.0f * x;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   803
                        _flatLeafCoefCache[3] = -y;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   804
                    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   805
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   806
                float a = _flatLeafCoefCache[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   807
                float b = _flatLeafCoefCache[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   808
                float c = _flatLeafCoefCache[2];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   809
                float d = t * _flatLeafCoefCache[3];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   810
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   811
                // we use cubicRootsInAB here, because we want only roots in 0, 1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   812
                // and our quadratic root finder doesn't filter, so it's just a
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   813
                // matter of convenience.
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   814
                final int n = Helpers.cubicRootsInAB(a, b, c, d, nextRoots, 0, 0.0f, 1.0f);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   815
                if (n == 1 && !Float.isNaN(nextRoots[0])) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   816
                    t = nextRoots[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   817
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   818
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   819
            // t is relative to the current leaf, so we must make it a valid parameter
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   820
            // of the original curve.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   821
            t = t * (nextT - lastT) + lastT;
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   822
            if (t >= 1.0f) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   823
                t = 1.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   824
                done = true;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   825
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   826
            // even if done = true, if we're here, that means targetLength
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   827
            // is equal to, or very, very close to the total length of the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   828
            // curve, so lastSegLen won't be too high. In cases where len
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   829
            // overshoots the curve, this method will exit in the while
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   830
            // loop, and lastSegLen will still be set to the right value.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   831
            lastSegLen = len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   832
            return t;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   833
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   834
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   835
        float totalLength() {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   836
            while (!done) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   837
                goToNextLeaf();
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   838
            }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   839
            // reset LengthIterator:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   840
            reset();
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   841
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   842
            return lenAtNextT;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   843
        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   844
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   845
        float lastSegLen() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   846
            return lastSegLen;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   847
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   848
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   849
        // go to the next leaf (in an inorder traversal) in the recursion tree
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   850
        // preconditions: must be on a leaf, and that leaf must not be the root.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   851
        private void goToNextLeaf() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   852
            // We must go to the first ancestor node that has an unvisited
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   853
            // right child.
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   854
            final boolean[] _sides = sidesRight;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   855
            int _recLevel = recLevel;
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   856
            _recLevel--;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   857
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   858
            while(_sides[_recLevel]) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   859
                if (_recLevel == 0) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   860
                    recLevel = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   861
                    done = true;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   862
                    return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   863
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   864
                _recLevel--;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   865
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   866
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   867
            _sides[_recLevel] = true;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   868
            // optimize arraycopy (8 values faster than 6 = type):
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   869
            System.arraycopy(recCurveStack[_recLevel++], 0,
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   870
                             recCurveStack[_recLevel], 0, 8);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   871
            recLevel = _recLevel;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   872
            goLeft();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   873
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   874
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   875
        // go to the leftmost node from the current node. Return its length.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   876
        private void goLeft() {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   877
            final float len = onLeaf();
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   878
            if (len >= 0.0f) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   879
                lastT = nextT;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   880
                lenAtLastT = lenAtNextT;
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 34417
diff changeset
   881
                nextT += (1 << (REC_LIMIT - recLevel)) * MIN_T_INC;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   882
                lenAtNextT += len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   883
                // invalidate caches
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   884
                flatLeafCoefCache[2] = -1.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   885
                cachedHaveLowAcceleration = -1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   886
            } else {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   887
                Helpers.subdivide(recCurveStack[recLevel],
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   888
                                  recCurveStack[recLevel + 1],
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   889
                                  recCurveStack[recLevel], curveType);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   890
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   891
                sidesRight[recLevel] = false;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   892
                recLevel++;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   893
                goLeft();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   894
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   895
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   896
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   897
        // this is a bit of a hack. It returns -1 if we're not on a leaf, and
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   898
        // the length of the leaf if we are on a leaf.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   899
        private float onLeaf() {
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   900
            final float[] curve = recCurveStack[recLevel];
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   901
            final int _curveType = curveType;
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   902
            float polyLen = 0.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   903
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   904
            float x0 = curve[0], y0 = curve[1];
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   905
            for (int i = 2; i < _curveType; i += 2) {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   906
                final float x1 = curve[i], y1 = curve[i + 1];
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   907
                final float len = Helpers.linelen(x0, y0, x1, y1);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   908
                polyLen += len;
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   909
                curLeafCtrlPolyLengths[(i >> 1) - 1] = len;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   910
                x0 = x1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   911
                y0 = y1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   912
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   913
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   914
            final float lineLen = Helpers.linelen(curve[0], curve[1], x0, y0);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   915
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   916
            if ((polyLen - lineLen) < CURVE_LEN_ERR || recLevel == REC_LIMIT) {
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   917
                return (polyLen + lineLen) / 2.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   918
            }
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents: 40421
diff changeset
   919
            return -1.0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   920
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   921
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   922
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   923
    @Override
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   924
    public void curveTo(final float x1, final float y1,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   925
                        final float x2, final float y2,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
   926
                        final float x3, final float y3)
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   927
    {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   928
        final int outcode0 = this.cOutCode;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   929
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   930
        if (clipRect != null) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   931
            final int outcode1 = Helpers.outcode(x1, y1, clipRect);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   932
            final int outcode2 = Helpers.outcode(x2, y2, clipRect);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   933
            final int outcode3 = Helpers.outcode(x3, y3, clipRect);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   934
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   935
            // Should clip
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   936
            final int orCode = (outcode0 | outcode1 | outcode2 | outcode3);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   937
            if (orCode != 0) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   938
                final int sideCode = outcode0 & outcode1 & outcode2 & outcode3;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   939
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   940
                // basic rejection criteria:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   941
                if (sideCode == 0) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   942
                    // ovelap clip:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   943
                    if (subdivide) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   944
                        // avoid reentrance
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   945
                        subdivide = false;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   946
                        // subdivide curve => callback with subdivided parts:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   947
                        boolean ret = curveSplitter.splitCurve(cx0, cy0, x1, y1, x2, y2, x3, y3,
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   948
                                                               orCode, this);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   949
                        // reentrance is done:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   950
                        subdivide = true;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   951
                        if (ret) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   952
                            return;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   953
                        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   954
                    }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   955
                    // already subdivided so render it
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   956
                } else {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   957
                    this.cOutCode = outcode3;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   958
                    skipCurveTo(x1, y1, x2, y2, x3, y3);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   959
                    return;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   960
                }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   961
            }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   962
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   963
            this.cOutCode = outcode3;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   964
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   965
            if (this.outside) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   966
                this.outside = false;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   967
                // Adjust current index, phase & dash:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   968
                skipLen();
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   969
            }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   970
        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   971
        _curveTo(x1, y1, x2, y2, x3, y3);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   972
    }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   973
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   974
    private void _curveTo(final float x1, final float y1,
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   975
                          final float x2, final float y2,
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   976
                          final float x3, final float y3)
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   977
    {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   978
        final float[] _curCurvepts = curCurvepts;
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   979
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   980
        // monotonize curve:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   981
        final CurveBasicMonotonizer monotonizer
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   982
            = rdrCtx.monotonizer.curve(cx0, cy0, x1, y1, x2, y2, x3, y3);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   983
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   984
        final int nSplits = monotonizer.nbSplits;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   985
        final float[] mid = monotonizer.middle;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   986
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   987
        for (int i = 0, off = 0; i <= nSplits; i++, off += 6) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   988
            // optimize arraycopy (8 values faster than 6 = type):
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   989
            System.arraycopy(mid, off, _curCurvepts, 0, 8);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   990
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   991
            somethingTo(8);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   992
        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   993
    }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   994
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   995
    private void skipCurveTo(final float x1, final float y1,
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   996
                             final float x2, final float y2,
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   997
                             final float x3, final float y3)
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   998
    {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   999
        final float[] _curCurvepts = curCurvepts;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1000
        _curCurvepts[0] = cx0; _curCurvepts[1] = cy0;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1001
        _curCurvepts[2] = x1;  _curCurvepts[3] = y1;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1002
        _curCurvepts[4] = x2;  _curCurvepts[5] = y2;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1003
        _curCurvepts[6] = x3;  _curCurvepts[7] = y3;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1004
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1005
        skipSomethingTo(8);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1006
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1007
        this.cx0 = x3;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1008
        this.cy0 = y3;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1009
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1010
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1011
    @Override
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
  1012
    public void quadTo(final float x1, final float y1,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
  1013
                       final float x2, final float y2)
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
  1014
    {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1015
        final int outcode0 = this.cOutCode;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1016
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1017
        if (clipRect != null) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1018
            final int outcode1 = Helpers.outcode(x1, y1, clipRect);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1019
            final int outcode2 = Helpers.outcode(x2, y2, clipRect);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1020
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1021
            // Should clip
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1022
            final int orCode = (outcode0 | outcode1 | outcode2);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1023
            if (orCode != 0) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1024
                final int sideCode = outcode0 & outcode1 & outcode2;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1025
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1026
                // basic rejection criteria:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1027
                if (sideCode == 0) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1028
                    // ovelap clip:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1029
                    if (subdivide) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1030
                        // avoid reentrance
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1031
                        subdivide = false;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1032
                        // subdivide curve => call lineTo() with subdivided curves:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1033
                        boolean ret = curveSplitter.splitQuad(cx0, cy0, x1, y1,
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1034
                                                              x2, y2, orCode, this);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1035
                        // reentrance is done:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1036
                        subdivide = true;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1037
                        if (ret) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1038
                            return;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1039
                        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1040
                    }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1041
                    // already subdivided so render it
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1042
                } else {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1043
                    this.cOutCode = outcode2;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1044
                    skipQuadTo(x1, y1, x2, y2);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1045
                    return;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1046
                }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1047
            }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1048
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1049
            this.cOutCode = outcode2;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1050
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1051
            if (this.outside) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1052
                this.outside = false;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1053
                // Adjust current index, phase & dash:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1054
                skipLen();
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1055
            }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1056
        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1057
        _quadTo(x1, y1, x2, y2);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1058
    }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1059
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1060
    private void _quadTo(final float x1, final float y1,
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1061
                         final float x2, final float y2)
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1062
    {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1063
        final float[] _curCurvepts = curCurvepts;
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1064
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1065
        // monotonize quad:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1066
        final CurveBasicMonotonizer monotonizer
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1067
            = rdrCtx.monotonizer.quad(cx0, cy0, x1, y1, x2, y2);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1068
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1069
        final int nSplits = monotonizer.nbSplits;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1070
        final float[] mid = monotonizer.middle;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1071
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1072
        for (int i = 0, off = 0; i <= nSplits; i++, off += 4) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1073
            // optimize arraycopy (8 values faster than 6 = type):
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1074
            System.arraycopy(mid, off, _curCurvepts, 0, 8);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1075
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1076
            somethingTo(6);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1077
        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1078
    }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1079
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1080
    private void skipQuadTo(final float x1, final float y1,
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1081
                            final float x2, final float y2)
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1082
    {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1083
        final float[] _curCurvepts = curCurvepts;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1084
        _curCurvepts[0] = cx0; _curCurvepts[1] = cy0;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1085
        _curCurvepts[2] = x1;  _curCurvepts[3] = y1;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1086
        _curCurvepts[4] = x2;  _curCurvepts[5] = y2;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1087
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1088
        skipSomethingTo(6);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1089
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1090
        this.cx0 = x2;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1091
        this.cy0 = y2;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1092
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1093
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1094
    @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1095
    public void closePath() {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1096
        if (cx0 != sx0 || cy0 != sy0) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1097
            lineTo(sx0, sy0);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1098
        }
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
  1099
        if (firstSegidx != 0) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1100
            if (!dashOn || needsMoveTo) {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1101
                out.moveTo(sx0, sy0);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1102
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1103
            emitFirstSegments();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1104
        }
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1105
        moveTo(sx0, sy0);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1106
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1107
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1108
    @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1109
    public void pathDone() {
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47216
diff changeset
  1110
        if (firstSegidx != 0) {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1111
            out.moveTo(sx0, sy0);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1112
            emitFirstSegments();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1113
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1114
        out.pathDone();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1115
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1116
        // Dispose this instance:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1117
        dispose();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1118
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1119
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1120
    @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1121
    public long getNativeConsumer() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1122
        throw new InternalError("Dasher does not use a native consumer");
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1123
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1124
}
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1125