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