jdk/src/java.desktop/share/classes/sun/java2d/marlin/Stroker.java
author lbourges
Wed, 15 Jun 2016 21:43:39 +0200
changeset 39519 21bfc4452441
parent 36902 bb30d89aa00e
child 40421 d5ee65e2b0fb
permissions -rw-r--r--
8159093: Fix coding conventions in Marlin renderer Summary: capital letters for constants and use rdrCtx.stats (field) Reviewed-by: flar, prr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     1
/*
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
     2
 * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     4
 *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    10
 *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    15
 * accompanied this code).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    16
 *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    20
 *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    23
 * questions.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    24
 */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    25
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    26
package sun.java2d.marlin;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    27
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    28
import java.util.Arrays;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    29
import static java.lang.Math.ulp;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    30
import static java.lang.Math.sqrt;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    31
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    32
import sun.awt.geom.PathConsumer2D;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    33
import sun.java2d.marlin.Curve.BreakPtrIterator;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    34
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    35
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    36
// TODO: some of the arithmetic here is too verbose and prone to hard to
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    37
// debug typos. We should consider making a small Point/Vector class that
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    38
// has methods like plus(Point), minus(Point), dot(Point), cross(Point)and such
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    39
final class Stroker implements PathConsumer2D, MarlinConst {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    40
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    41
    private static final int MOVE_TO = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    42
    private static final int DRAWING_OP_TO = 1; // ie. curve, line, or quad
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    43
    private static final int CLOSE = 2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    44
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    45
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    46
     * Constant value for join style.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    47
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    48
    public static final int JOIN_MITER = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    49
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    50
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    51
     * Constant value for join style.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    52
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    53
    public static final int JOIN_ROUND = 1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    54
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    55
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    56
     * Constant value for join style.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    57
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    58
    public static final int JOIN_BEVEL = 2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    59
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    60
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    61
     * Constant value for end cap style.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    62
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    63
    public static final int CAP_BUTT = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    64
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    65
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    66
     * Constant value for end cap style.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    67
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    68
    public static final int CAP_ROUND = 1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    69
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    70
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    71
     * Constant value for end cap style.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    72
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    73
    public static final int CAP_SQUARE = 2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    74
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    75
    // pisces used to use fixed point arithmetic with 16 decimal digits. I
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    76
    // didn't want to change the values of the constant below when I converted
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    77
    // it to floating point, so that's why the divisions by 2^16 are there.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    78
    private static final float ROUND_JOIN_THRESHOLD = 1000/65536f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    79
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    80
    private static final float C = 0.5522847498307933f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    81
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    82
    private static final int MAX_N_CURVES = 11;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    83
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    84
    private PathConsumer2D out;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    85
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    86
    private int capStyle;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    87
    private int joinStyle;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    88
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    89
    private float lineWidth2;
35645
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
    90
    private float invHalfLineWidth2Sq;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    91
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    92
    private final float[] offset0 = new float[2];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    93
    private final float[] offset1 = new float[2];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    94
    private final float[] offset2 = new float[2];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    95
    private final float[] miter = new float[2];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    96
    private float miterLimitSq;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    97
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    98
    private int prev;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    99
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   100
    // The starting point of the path, and the slope there.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   101
    private float sx0, sy0, sdx, sdy;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   102
    // the current point and the slope there.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   103
    private float cx0, cy0, cdx, cdy; // c stands for current
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   104
    // vectors that when added to (sx0,sy0) and (cx0,cy0) respectively yield the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   105
    // first and last points on the left parallel path. Since this path is
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   106
    // parallel, it's slope at any point is parallel to the slope of the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   107
    // original path (thought they may have different directions), so these
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   108
    // could be computed from sdx,sdy and cdx,cdy (and vice versa), but that
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   109
    // would be error prone and hard to read, so we keep these anyway.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   110
    private float smx, smy, cmx, cmy;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   111
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   112
    private final PolyStack reverse;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   113
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   114
    // This is where the curve to be processed is put. We give it
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   115
    // enough room to store 2 curves: one for the current subdivision, the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   116
    // other for the rest of the curve.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   117
    private final float[] middle = new float[2 * 8];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   118
    private final float[] lp = new float[8];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   119
    private final float[] rp = new float[8];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   120
    private final float[] subdivTs = new float[MAX_N_CURVES - 1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   121
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   122
    // per-thread renderer context
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   123
    final RendererContext rdrCtx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   124
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   125
    // dirty curve
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   126
    final Curve curve;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   127
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   128
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   129
     * Constructs a <code>Stroker</code>.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   130
     * @param rdrCtx per-thread renderer context
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   131
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   132
    Stroker(final RendererContext rdrCtx) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   133
        this.rdrCtx = rdrCtx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   134
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   135
        this.reverse = new PolyStack(rdrCtx);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   136
        this.curve = rdrCtx.curve;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   137
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   138
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   139
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   140
     * Inits the <code>Stroker</code>.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   141
     *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   142
     * @param pc2d an output <code>PathConsumer2D</code>.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   143
     * @param lineWidth the desired line width in pixels
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   144
     * @param capStyle the desired end cap style, one of
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   145
     * <code>CAP_BUTT</code>, <code>CAP_ROUND</code> or
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   146
     * <code>CAP_SQUARE</code>.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   147
     * @param joinStyle the desired line join style, one of
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   148
     * <code>JOIN_MITER</code>, <code>JOIN_ROUND</code> or
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   149
     * <code>JOIN_BEVEL</code>.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   150
     * @param miterLimit the desired miter limit
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   151
     * @return this instance
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   152
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   153
    Stroker init(PathConsumer2D pc2d,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   154
              float lineWidth,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   155
              int capStyle,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   156
              int joinStyle,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   157
              float miterLimit)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   158
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   159
        this.out = pc2d;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   160
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   161
        this.lineWidth2 = lineWidth / 2f;
35645
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   162
        this.invHalfLineWidth2Sq = 1f / (2f * lineWidth2 * lineWidth2);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   163
        this.capStyle = capStyle;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   164
        this.joinStyle = joinStyle;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   165
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   166
        float limit = miterLimit * lineWidth2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   167
        this.miterLimitSq = limit * limit;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   168
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   169
        this.prev = CLOSE;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   170
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   171
        rdrCtx.stroking = 1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   172
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   173
        return this; // fluent API
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   174
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   175
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   176
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   177
     * Disposes this stroker:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   178
     * clean up before reusing this instance
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   179
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   180
    void dispose() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   181
        reverse.dispose();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   182
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   183
        if (DO_CLEAN_DIRTY) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   184
            // Force zero-fill dirty arrays:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   185
            Arrays.fill(offset0, 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   186
            Arrays.fill(offset1, 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   187
            Arrays.fill(offset2, 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   188
            Arrays.fill(miter, 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   189
            Arrays.fill(middle, 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   190
            Arrays.fill(lp, 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   191
            Arrays.fill(rp, 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   192
            Arrays.fill(subdivTs, 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   193
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   194
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   195
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   196
    private static void computeOffset(final float lx, final float ly,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   197
                                      final float w, final float[] m)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   198
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   199
        float len = lx*lx + ly*ly;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   200
        if (len == 0f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   201
            m[0] = 0f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   202
            m[1] = 0f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   203
        } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   204
            len = (float) sqrt(len);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   205
            m[0] =  (ly * w) / len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   206
            m[1] = -(lx * w) / len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   207
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   208
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   209
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   210
    // Returns true if the vectors (dx1, dy1) and (dx2, dy2) are
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   211
    // clockwise (if dx1,dy1 needs to be rotated clockwise to close
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   212
    // the smallest angle between it and dx2,dy2).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   213
    // This is equivalent to detecting whether a point q is on the right side
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   214
    // of a line passing through points p1, p2 where p2 = p1+(dx1,dy1) and
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   215
    // q = p2+(dx2,dy2), which is the same as saying p1, p2, q are in a
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   216
    // clockwise order.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   217
    // NOTE: "clockwise" here assumes coordinates with 0,0 at the bottom left.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   218
    private static boolean isCW(final float dx1, final float dy1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   219
                                final float dx2, final float dy2)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   220
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   221
        return dx1 * dy2 <= dy1 * dx2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   222
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   223
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   224
    private void drawRoundJoin(float x, float y,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   225
                               float omx, float omy, float mx, float my,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   226
                               boolean rev,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   227
                               float threshold)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   228
    {
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   229
        if ((omx == 0f && omy == 0f) || (mx == 0f && my == 0f)) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   230
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   231
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   232
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   233
        float domx = omx - mx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   234
        float domy = omy - my;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   235
        float len = domx*domx + domy*domy;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   236
        if (len < threshold) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   237
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   238
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   239
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   240
        if (rev) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   241
            omx = -omx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   242
            omy = -omy;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   243
            mx  = -mx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   244
            my  = -my;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   245
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   246
        drawRoundJoin(x, y, omx, omy, mx, my, rev);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   247
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   248
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   249
    private void drawRoundJoin(float cx, float cy,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   250
                               float omx, float omy,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   251
                               float mx, float my,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   252
                               boolean rev)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   253
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   254
        // The sign of the dot product of mx,my and omx,omy is equal to the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   255
        // the sign of the cosine of ext
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   256
        // (ext is the angle between omx,omy and mx,my).
35645
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   257
        final float cosext = omx * mx + omy * my;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   258
        // If it is >=0, we know that abs(ext) is <= 90 degrees, so we only
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   259
        // need 1 curve to approximate the circle section that joins omx,omy
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   260
        // and mx,my.
35645
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   261
        final int numCurves = (cosext >= 0f) ? 1 : 2;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   262
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   263
        switch (numCurves) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   264
        case 1:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   265
            drawBezApproxForArc(cx, cy, omx, omy, mx, my, rev);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   266
            break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   267
        case 2:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   268
            // we need to split the arc into 2 arcs spanning the same angle.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   269
            // The point we want will be one of the 2 intersections of the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   270
            // perpendicular bisector of the chord (omx,omy)->(mx,my) and the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   271
            // circle. We could find this by scaling the vector
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   272
            // (omx+mx, omy+my)/2 so that it has length=lineWidth2 (and thus lies
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   273
            // on the circle), but that can have numerical problems when the angle
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   274
            // between omx,omy and mx,my is close to 180 degrees. So we compute a
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   275
            // normal of (omx,omy)-(mx,my). This will be the direction of the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   276
            // perpendicular bisector. To get one of the intersections, we just scale
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   277
            // this vector that its length is lineWidth2 (this works because the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   278
            // perpendicular bisector goes through the origin). This scaling doesn't
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   279
            // have numerical problems because we know that lineWidth2 divided by
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   280
            // this normal's length is at least 0.5 and at most sqrt(2)/2 (because
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   281
            // we know the angle of the arc is > 90 degrees).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   282
            float nx = my - omy, ny = omx - mx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   283
            float nlen = (float) sqrt(nx*nx + ny*ny);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   284
            float scale = lineWidth2/nlen;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   285
            float mmx = nx * scale, mmy = ny * scale;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   286
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   287
            // if (isCW(omx, omy, mx, my) != isCW(mmx, mmy, mx, my)) then we've
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   288
            // computed the wrong intersection so we get the other one.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   289
            // The test above is equivalent to if (rev).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   290
            if (rev) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   291
                mmx = -mmx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   292
                mmy = -mmy;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   293
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   294
            drawBezApproxForArc(cx, cy, omx, omy, mmx, mmy, rev);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   295
            drawBezApproxForArc(cx, cy, mmx, mmy, mx, my, rev);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   296
            break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   297
        default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   298
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   299
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   300
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   301
    // the input arc defined by omx,omy and mx,my must span <= 90 degrees.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   302
    private void drawBezApproxForArc(final float cx, final float cy,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   303
                                     final float omx, final float omy,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   304
                                     final float mx, final float my,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   305
                                     boolean rev)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   306
    {
35645
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   307
        final float cosext2 = (omx * mx + omy * my) * invHalfLineWidth2Sq;
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   308
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   309
        // check round off errors producing cos(ext) > 1 and a NaN below
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   310
        // cos(ext) == 1 implies colinear segments and an empty join anyway
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   311
        if (cosext2 >= 0.5f) {
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   312
            // just return to avoid generating a flat curve:
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   313
            return;
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   314
        }
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   315
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   316
        // cv is the length of P1-P0 and P2-P3 divided by the radius of the arc
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   317
        // (so, cv assumes the arc has radius 1). P0, P1, P2, P3 are the points that
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   318
        // define the bezier curve we're computing.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   319
        // It is computed using the constraints that P1-P0 and P3-P2 are parallel
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   320
        // to the arc tangents at the endpoints, and that |P1-P0|=|P3-P2|.
35645
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   321
        float cv = (float) ((4.0 / 3.0) * sqrt(0.5 - cosext2) /
a96d68e3fda2 8144718: Pisces / Marlin Strokers may generate invalid curves with huge coordinates and round joins
lbourges
parents: 34815
diff changeset
   322
                            (1.0 + sqrt(cosext2 + 0.5)));
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   323
        // if clockwise, we need to negate cv.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   324
        if (rev) { // rev is equivalent to isCW(omx, omy, mx, my)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   325
            cv = -cv;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   326
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   327
        final float x1 = cx + omx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   328
        final float y1 = cy + omy;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   329
        final float x2 = x1 - cv * omy;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   330
        final float y2 = y1 + cv * omx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   331
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   332
        final float x4 = cx + mx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   333
        final float y4 = cy + my;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   334
        final float x3 = x4 + cv * my;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   335
        final float y3 = y4 - cv * mx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   336
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   337
        emitCurveTo(x1, y1, x2, y2, x3, y3, x4, y4, rev);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   338
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   339
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   340
    private void drawRoundCap(float cx, float cy, float mx, float my) {
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   341
        final float Cmx = C * mx;
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   342
        final float Cmy = C * my;
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   343
        emitCurveTo(cx + mx - Cmy, cy + my + Cmx,
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   344
                    cx - my + Cmx, cy + mx + Cmy,
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   345
                    cx - my,       cy + mx);
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   346
        emitCurveTo(cx - my - Cmx, cy + mx - Cmy,
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   347
                    cx - mx - Cmy, cy - my + Cmx,
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   348
                    cx - mx,       cy - my);
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   349
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   350
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   351
    // Put the intersection point of the lines (x0, y0) -> (x1, y1)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   352
    // and (x0p, y0p) -> (x1p, y1p) in m[off] and m[off+1].
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   353
    // If the lines are parallel, it will put a non finite number in m.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   354
    private static void computeIntersection(final float x0, final float y0,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   355
                                            final float x1, final float y1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   356
                                            final float x0p, final float y0p,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   357
                                            final float x1p, final float y1p,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   358
                                            final float[] m, int off)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   359
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   360
        float x10 = x1 - x0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   361
        float y10 = y1 - y0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   362
        float x10p = x1p - x0p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   363
        float y10p = y1p - y0p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   364
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   365
        float den = x10*y10p - x10p*y10;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   366
        float t = x10p*(y0-y0p) - y10p*(x0-x0p);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   367
        t /= den;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   368
        m[off++] = x0 + t*x10;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   369
        m[off]   = y0 + t*y10;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   370
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   371
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   372
    private void drawMiter(final float pdx, final float pdy,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   373
                           final float x0, final float y0,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   374
                           final float dx, final float dy,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   375
                           float omx, float omy, float mx, float my,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   376
                           boolean rev)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   377
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   378
        if ((mx == omx && my == omy) ||
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   379
            (pdx == 0f && pdy == 0f) ||
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   380
            (dx == 0f && dy == 0f))
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   381
        {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   382
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   383
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   384
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   385
        if (rev) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   386
            omx = -omx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   387
            omy = -omy;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   388
            mx  = -mx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   389
            my  = -my;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   390
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   391
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   392
        computeIntersection((x0 - pdx) + omx, (y0 - pdy) + omy, x0 + omx, y0 + omy,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   393
                            (dx + x0) + mx, (dy + y0) + my, x0 + mx, y0 + my,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   394
                            miter, 0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   395
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   396
        final float miterX = miter[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   397
        final float miterY = miter[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   398
        float lenSq = (miterX-x0)*(miterX-x0) + (miterY-y0)*(miterY-y0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   399
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   400
        // If the lines are parallel, lenSq will be either NaN or +inf
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   401
        // (actually, I'm not sure if the latter is possible. The important
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   402
        // thing is that -inf is not possible, because lenSq is a square).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   403
        // For both of those values, the comparison below will fail and
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   404
        // no miter will be drawn, which is correct.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   405
        if (lenSq < miterLimitSq) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   406
            emitLineTo(miterX, miterY, rev);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   407
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   408
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   409
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   410
    @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   411
    public void moveTo(float x0, float y0) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   412
        if (prev == DRAWING_OP_TO) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   413
            finish();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   414
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   415
        this.sx0 = this.cx0 = x0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   416
        this.sy0 = this.cy0 = y0;
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   417
        this.cdx = this.sdx = 1f;
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   418
        this.cdy = this.sdy = 0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   419
        this.prev = MOVE_TO;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   420
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   421
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   422
    @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   423
    public void lineTo(float x1, float y1) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   424
        float dx = x1 - cx0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   425
        float dy = y1 - cy0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   426
        if (dx == 0f && dy == 0f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   427
            dx = 1f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   428
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   429
        computeOffset(dx, dy, lineWidth2, offset0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   430
        final float mx = offset0[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   431
        final float my = offset0[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   432
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   433
        drawJoin(cdx, cdy, cx0, cy0, dx, dy, cmx, cmy, mx, my);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   434
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   435
        emitLineTo(cx0 + mx, cy0 + my);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   436
        emitLineTo( x1 + mx,  y1 + my);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   437
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   438
        emitLineToRev(cx0 - mx, cy0 - my);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   439
        emitLineToRev( x1 - mx,  y1 - my);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   440
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   441
        this.cmx = mx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   442
        this.cmy = my;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   443
        this.cdx = dx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   444
        this.cdy = dy;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   445
        this.cx0 = x1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   446
        this.cy0 = y1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   447
        this.prev = DRAWING_OP_TO;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   448
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   449
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   450
    @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   451
    public void closePath() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   452
        if (prev != DRAWING_OP_TO) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   453
            if (prev == CLOSE) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   454
                return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   455
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   456
            emitMoveTo(cx0, cy0 - lineWidth2);
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   457
            this.cmx = this.smx = 0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   458
            this.cmy = this.smy = -lineWidth2;
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   459
            this.cdx = this.sdx = 1f;
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
   460
            this.cdy = this.sdy = 0f;
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   461
            finish();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   462
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   463
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   464
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   465
        if (cx0 != sx0 || cy0 != sy0) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   466
            lineTo(sx0, sy0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   467
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   468
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   469
        drawJoin(cdx, cdy, cx0, cy0, sdx, sdy, cmx, cmy, smx, smy);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   470
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   471
        emitLineTo(sx0 + smx, sy0 + smy);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   472
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   473
        emitMoveTo(sx0 - smx, sy0 - smy);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   474
        emitReverse();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   475
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   476
        this.prev = CLOSE;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   477
        emitClose();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   478
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   479
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   480
    private void emitReverse() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   481
        reverse.popAll(out);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   482
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   483
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   484
    @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   485
    public void pathDone() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   486
        if (prev == DRAWING_OP_TO) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   487
            finish();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   488
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   489
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   490
        out.pathDone();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   491
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   492
        // this shouldn't matter since this object won't be used
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   493
        // after the call to this method.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   494
        this.prev = CLOSE;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   495
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   496
        // Dispose this instance:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   497
        dispose();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   498
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   499
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   500
    private void finish() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   501
        if (capStyle == CAP_ROUND) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   502
            drawRoundCap(cx0, cy0, cmx, cmy);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   503
        } else if (capStyle == CAP_SQUARE) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   504
            emitLineTo(cx0 - cmy + cmx, cy0 + cmx + cmy);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   505
            emitLineTo(cx0 - cmy - cmx, cy0 + cmx - cmy);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   506
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   507
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   508
        emitReverse();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   509
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   510
        if (capStyle == CAP_ROUND) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   511
            drawRoundCap(sx0, sy0, -smx, -smy);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   512
        } else if (capStyle == CAP_SQUARE) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   513
            emitLineTo(sx0 + smy - smx, sy0 - smx - smy);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   514
            emitLineTo(sx0 + smy + smx, sy0 - smx + smy);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   515
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   516
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   517
        emitClose();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   518
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   519
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   520
    private void emitMoveTo(final float x0, final float y0) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   521
        out.moveTo(x0, y0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   522
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   523
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   524
    private void emitLineTo(final float x1, final float y1) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   525
        out.lineTo(x1, y1);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   526
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   527
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   528
    private void emitLineToRev(final float x1, final float y1) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   529
        reverse.pushLine(x1, y1);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   530
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   531
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   532
    private void emitLineTo(final float x1, final float y1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   533
                            final boolean rev)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   534
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   535
        if (rev) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   536
            emitLineToRev(x1, y1);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   537
        } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   538
            emitLineTo(x1, y1);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   539
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   540
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   541
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   542
    private void emitQuadTo(final float x1, final float y1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   543
                            final float x2, final float y2)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   544
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   545
        out.quadTo(x1, y1, x2, y2);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   546
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   547
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   548
    private void emitQuadToRev(final float x0, final float y0,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   549
                               final float x1, final float y1)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   550
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   551
        reverse.pushQuad(x0, y0, x1, y1);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   552
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   553
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   554
    private void emitCurveTo(final float x1, final float y1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   555
                             final float x2, final float y2,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   556
                             final float x3, final float y3)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   557
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   558
        out.curveTo(x1, y1, x2, y2, x3, y3);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   559
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   560
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   561
    private void emitCurveToRev(final float x0, final float y0,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   562
                                final float x1, final float y1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   563
                                final float x2, final float y2)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   564
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   565
        reverse.pushCubic(x0, y0, x1, y1, x2, y2);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   566
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   567
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   568
    private void emitCurveTo(final float x0, final float y0,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   569
                             final float x1, final float y1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   570
                             final float x2, final float y2,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   571
                             final float x3, final float y3, final boolean rev)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   572
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   573
        if (rev) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   574
            reverse.pushCubic(x0, y0, x1, y1, x2, y2);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   575
        } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   576
            out.curveTo(x1, y1, x2, y2, x3, y3);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   577
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   578
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   579
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   580
    private void emitClose() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   581
        out.closePath();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   582
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   583
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   584
    private void drawJoin(float pdx, float pdy,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   585
                          float x0, float y0,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   586
                          float dx, float dy,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   587
                          float omx, float omy,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   588
                          float mx, float my)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   589
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   590
        if (prev != DRAWING_OP_TO) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   591
            emitMoveTo(x0 + mx, y0 + my);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   592
            this.sdx = dx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   593
            this.sdy = dy;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   594
            this.smx = mx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   595
            this.smy = my;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   596
        } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   597
            boolean cw = isCW(pdx, pdy, dx, dy);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   598
            if (joinStyle == JOIN_MITER) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   599
                drawMiter(pdx, pdy, x0, y0, dx, dy, omx, omy, mx, my, cw);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   600
            } else if (joinStyle == JOIN_ROUND) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   601
                drawRoundJoin(x0, y0,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   602
                              omx, omy,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   603
                              mx, my, cw,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   604
                              ROUND_JOIN_THRESHOLD);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   605
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   606
            emitLineTo(x0, y0, !cw);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   607
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   608
        prev = DRAWING_OP_TO;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   609
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   610
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   611
    private static boolean within(final float x1, final float y1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   612
                                  final float x2, final float y2,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   613
                                  final float ERR)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   614
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   615
        assert ERR > 0 : "";
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   616
        // compare taxicab distance. ERR will always be small, so using
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   617
        // true distance won't give much benefit
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   618
        return (Helpers.within(x1, x2, ERR) &&  // we want to avoid calling Math.abs
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   619
                Helpers.within(y1, y2, ERR)); // this is just as good.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   620
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   621
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   622
    private void getLineOffsets(float x1, float y1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   623
                                float x2, float y2,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   624
                                float[] left, float[] right) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   625
        computeOffset(x2 - x1, y2 - y1, lineWidth2, offset0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   626
        final float mx = offset0[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   627
        final float my = offset0[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   628
        left[0] = x1 + mx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   629
        left[1] = y1 + my;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   630
        left[2] = x2 + mx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   631
        left[3] = y2 + my;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   632
        right[0] = x1 - mx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   633
        right[1] = y1 - my;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   634
        right[2] = x2 - mx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   635
        right[3] = y2 - my;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   636
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   637
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   638
    private int computeOffsetCubic(float[] pts, final int off,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   639
                                   float[] leftOff, float[] rightOff)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   640
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   641
        // if p1=p2 or p3=p4 it means that the derivative at the endpoint
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   642
        // vanishes, which creates problems with computeOffset. Usually
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   643
        // this happens when this stroker object is trying to winden
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   644
        // a curve with a cusp. What happens is that curveTo splits
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   645
        // the input curve at the cusp, and passes it to this function.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   646
        // because of inaccuracies in the splitting, we consider points
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   647
        // equal if they're very close to each other.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   648
        final float x1 = pts[off + 0], y1 = pts[off + 1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   649
        final float x2 = pts[off + 2], y2 = pts[off + 3];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   650
        final float x3 = pts[off + 4], y3 = pts[off + 5];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   651
        final float x4 = pts[off + 6], y4 = pts[off + 7];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   652
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   653
        float dx4 = x4 - x3;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   654
        float dy4 = y4 - y3;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   655
        float dx1 = x2 - x1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   656
        float dy1 = y2 - y1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   657
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   658
        // if p1 == p2 && p3 == p4: draw line from p1->p4, unless p1 == p4,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   659
        // in which case ignore if p1 == p2
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   660
        final boolean p1eqp2 = within(x1,y1,x2,y2, 6f * ulp(y2));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   661
        final boolean p3eqp4 = within(x3,y3,x4,y4, 6f * ulp(y4));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   662
        if (p1eqp2 && p3eqp4) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   663
            getLineOffsets(x1, y1, x4, y4, leftOff, rightOff);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   664
            return 4;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   665
        } else if (p1eqp2) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   666
            dx1 = x3 - x1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   667
            dy1 = y3 - y1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   668
        } else if (p3eqp4) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   669
            dx4 = x4 - x2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   670
            dy4 = y4 - y2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   671
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   672
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   673
        // if p2-p1 and p4-p3 are parallel, that must mean this curve is a line
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   674
        float dotsq = (dx1 * dx4 + dy1 * dy4);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   675
        dotsq *= dotsq;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   676
        float l1sq = dx1 * dx1 + dy1 * dy1, l4sq = dx4 * dx4 + dy4 * dy4;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   677
        if (Helpers.within(dotsq, l1sq * l4sq, 4f * ulp(dotsq))) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   678
            getLineOffsets(x1, y1, x4, y4, leftOff, rightOff);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   679
            return 4;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   680
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   681
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   682
//      What we're trying to do in this function is to approximate an ideal
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   683
//      offset curve (call it I) of the input curve B using a bezier curve Bp.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   684
//      The constraints I use to get the equations are:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   685
//
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   686
//      1. The computed curve Bp should go through I(0) and I(1). These are
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   687
//      x1p, y1p, x4p, y4p, which are p1p and p4p. We still need to find
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   688
//      4 variables: the x and y components of p2p and p3p (i.e. x2p, y2p, x3p, y3p).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   689
//
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   690
//      2. Bp should have slope equal in absolute value to I at the endpoints. So,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   691
//      (by the way, the operator || in the comments below means "aligned with".
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   692
//      It is defined on vectors, so when we say I'(0) || Bp'(0) we mean that
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   693
//      vectors I'(0) and Bp'(0) are aligned, which is the same as saying
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   694
//      that the tangent lines of I and Bp at 0 are parallel. Mathematically
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   695
//      this means (I'(t) || Bp'(t)) <==> (I'(t) = c * Bp'(t)) where c is some
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   696
//      nonzero constant.)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   697
//      I'(0) || Bp'(0) and I'(1) || Bp'(1). Obviously, I'(0) || B'(0) and
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   698
//      I'(1) || B'(1); therefore, Bp'(0) || B'(0) and Bp'(1) || B'(1).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   699
//      We know that Bp'(0) || (p2p-p1p) and Bp'(1) || (p4p-p3p) and the same
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   700
//      is true for any bezier curve; therefore, we get the equations
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   701
//          (1) p2p = c1 * (p2-p1) + p1p
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   702
//          (2) p3p = c2 * (p4-p3) + p4p
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   703
//      We know p1p, p4p, p2, p1, p3, and p4; therefore, this reduces the number
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   704
//      of unknowns from 4 to 2 (i.e. just c1 and c2).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   705
//      To eliminate these 2 unknowns we use the following constraint:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   706
//
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   707
//      3. Bp(0.5) == I(0.5). Bp(0.5)=(x,y) and I(0.5)=(xi,yi), and I should note
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   708
//      that I(0.5) is *the only* reason for computing dxm,dym. This gives us
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   709
//          (3) Bp(0.5) = (p1p + 3 * (p2p + p3p) + p4p)/8, which is equivalent to
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   710
//          (4) p2p + p3p = (Bp(0.5)*8 - p1p - p4p) / 3
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   711
//      We can substitute (1) and (2) from above into (4) and we get:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   712
//          (5) c1*(p2-p1) + c2*(p4-p3) = (Bp(0.5)*8 - p1p - p4p)/3 - p1p - p4p
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   713
//      which is equivalent to
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   714
//          (6) c1*(p2-p1) + c2*(p4-p3) = (4/3) * (Bp(0.5) * 2 - p1p - p4p)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   715
//
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   716
//      The right side of this is a 2D vector, and we know I(0.5), which gives us
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   717
//      Bp(0.5), which gives us the value of the right side.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   718
//      The left side is just a matrix vector multiplication in disguise. It is
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   719
//
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   720
//      [x2-x1, x4-x3][c1]
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   721
//      [y2-y1, y4-y3][c2]
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   722
//      which, is equal to
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   723
//      [dx1, dx4][c1]
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   724
//      [dy1, dy4][c2]
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   725
//      At this point we are left with a simple linear system and we solve it by
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   726
//      getting the inverse of the matrix above. Then we use [c1,c2] to compute
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   727
//      p2p and p3p.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   728
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   729
        float x = (x1 + 3f * (x2 + x3) + x4) / 8f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   730
        float y = (y1 + 3f * (y2 + y3) + y4) / 8f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   731
        // (dxm,dym) is some tangent of B at t=0.5. This means it's equal to
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   732
        // c*B'(0.5) for some constant c.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   733
        float dxm = x3 + x4 - x1 - x2, dym = y3 + y4 - y1 - y2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   734
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   735
        // this computes the offsets at t=0, 0.5, 1, using the property that
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   736
        // for any bezier curve the vectors p2-p1 and p4-p3 are parallel to
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   737
        // the (dx/dt, dy/dt) vectors at the endpoints.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   738
        computeOffset(dx1, dy1, lineWidth2, offset0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   739
        computeOffset(dxm, dym, lineWidth2, offset1);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   740
        computeOffset(dx4, dy4, lineWidth2, offset2);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   741
        float x1p = x1 + offset0[0]; // start
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   742
        float y1p = y1 + offset0[1]; // point
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   743
        float xi  = x  + offset1[0]; // interpolation
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   744
        float yi  = y  + offset1[1]; // point
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   745
        float x4p = x4 + offset2[0]; // end
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   746
        float y4p = y4 + offset2[1]; // point
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   747
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   748
        float invdet43 = 4f / (3f * (dx1 * dy4 - dy1 * dx4));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   749
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   750
        float two_pi_m_p1_m_p4x = 2f * xi - x1p - x4p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   751
        float two_pi_m_p1_m_p4y = 2f * yi - y1p - y4p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   752
        float c1 = invdet43 * (dy4 * two_pi_m_p1_m_p4x - dx4 * two_pi_m_p1_m_p4y);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   753
        float c2 = invdet43 * (dx1 * two_pi_m_p1_m_p4y - dy1 * two_pi_m_p1_m_p4x);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   754
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   755
        float x2p, y2p, x3p, y3p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   756
        x2p = x1p + c1*dx1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   757
        y2p = y1p + c1*dy1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   758
        x3p = x4p + c2*dx4;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   759
        y3p = y4p + c2*dy4;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   760
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   761
        leftOff[0] = x1p; leftOff[1] = y1p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   762
        leftOff[2] = x2p; leftOff[3] = y2p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   763
        leftOff[4] = x3p; leftOff[5] = y3p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   764
        leftOff[6] = x4p; leftOff[7] = y4p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   765
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   766
        x1p = x1 - offset0[0]; y1p = y1 - offset0[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   767
        xi = xi - 2f * offset1[0]; yi = yi - 2f * offset1[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   768
        x4p = x4 - offset2[0]; y4p = y4 - offset2[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   769
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   770
        two_pi_m_p1_m_p4x = 2f * xi - x1p - x4p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   771
        two_pi_m_p1_m_p4y = 2f * yi - y1p - y4p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   772
        c1 = invdet43 * (dy4 * two_pi_m_p1_m_p4x - dx4 * two_pi_m_p1_m_p4y);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   773
        c2 = invdet43 * (dx1 * two_pi_m_p1_m_p4y - dy1 * two_pi_m_p1_m_p4x);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   774
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   775
        x2p = x1p + c1*dx1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   776
        y2p = y1p + c1*dy1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   777
        x3p = x4p + c2*dx4;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   778
        y3p = y4p + c2*dy4;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   779
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   780
        rightOff[0] = x1p; rightOff[1] = y1p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   781
        rightOff[2] = x2p; rightOff[3] = y2p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   782
        rightOff[4] = x3p; rightOff[5] = y3p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   783
        rightOff[6] = x4p; rightOff[7] = y4p;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   784
        return 8;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   785
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   786
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   787
    // return the kind of curve in the right and left arrays.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   788
    private int computeOffsetQuad(float[] pts, final int off,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   789
                                  float[] leftOff, float[] rightOff)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   790
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   791
        final float x1 = pts[off + 0], y1 = pts[off + 1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   792
        final float x2 = pts[off + 2], y2 = pts[off + 3];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   793
        final float x3 = pts[off + 4], y3 = pts[off + 5];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   794
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   795
        final float dx3 = x3 - x2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   796
        final float dy3 = y3 - y2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   797
        final float dx1 = x2 - x1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   798
        final float dy1 = y2 - y1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   799
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   800
        // this computes the offsets at t = 0, 1
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   801
        computeOffset(dx1, dy1, lineWidth2, offset0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   802
        computeOffset(dx3, dy3, lineWidth2, offset1);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   803
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   804
        leftOff[0]  = x1 + offset0[0]; leftOff[1]  = y1 + offset0[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   805
        leftOff[4]  = x3 + offset1[0]; leftOff[5]  = y3 + offset1[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   806
        rightOff[0] = x1 - offset0[0]; rightOff[1] = y1 - offset0[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   807
        rightOff[4] = x3 - offset1[0]; rightOff[5] = y3 - offset1[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   808
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   809
        float x1p = leftOff[0]; // start
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   810
        float y1p = leftOff[1]; // point
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   811
        float x3p = leftOff[4]; // end
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   812
        float y3p = leftOff[5]; // point
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   813
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   814
        // Corner cases:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   815
        // 1. If the two control vectors are parallel, we'll end up with NaN's
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   816
        //    in leftOff (and rightOff in the body of the if below), so we'll
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   817
        //    do getLineOffsets, which is right.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   818
        // 2. If the first or second two points are equal, then (dx1,dy1)==(0,0)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   819
        //    or (dx3,dy3)==(0,0), so (x1p, y1p)==(x1p+dx1, y1p+dy1)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   820
        //    or (x3p, y3p)==(x3p-dx3, y3p-dy3), which means that
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   821
        //    computeIntersection will put NaN's in leftOff and right off, and
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   822
        //    we will do getLineOffsets, which is right.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   823
        computeIntersection(x1p, y1p, x1p+dx1, y1p+dy1, x3p, y3p, x3p-dx3, y3p-dy3, leftOff, 2);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   824
        float cx = leftOff[2];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   825
        float cy = leftOff[3];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   826
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   827
        if (!(isFinite(cx) && isFinite(cy))) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   828
            // maybe the right path is not degenerate.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   829
            x1p = rightOff[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   830
            y1p = rightOff[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   831
            x3p = rightOff[4];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   832
            y3p = rightOff[5];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   833
            computeIntersection(x1p, y1p, x1p+dx1, y1p+dy1, x3p, y3p, x3p-dx3, y3p-dy3, rightOff, 2);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   834
            cx = rightOff[2];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   835
            cy = rightOff[3];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   836
            if (!(isFinite(cx) && isFinite(cy))) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   837
                // both are degenerate. This curve is a line.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   838
                getLineOffsets(x1, y1, x3, y3, leftOff, rightOff);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   839
                return 4;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   840
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   841
            // {left,right}Off[0,1,4,5] are already set to the correct values.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   842
            leftOff[2] = 2f * x2 - cx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   843
            leftOff[3] = 2f * y2 - cy;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   844
            return 6;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   845
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   846
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   847
        // rightOff[2,3] = (x2,y2) - ((left_x2, left_y2) - (x2, y2))
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   848
        // == 2*(x2, y2) - (left_x2, left_y2)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   849
        rightOff[2] = 2f * x2 - cx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   850
        rightOff[3] = 2f * y2 - cy;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   851
        return 6;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   852
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   853
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   854
    private static boolean isFinite(float x) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   855
        return (Float.NEGATIVE_INFINITY < x && x < Float.POSITIVE_INFINITY);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   856
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   857
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   858
    // If this class is compiled with ecj, then Hotspot crashes when OSR
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   859
    // compiling this function. See bugs 7004570 and 6675699
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   860
    // TODO: until those are fixed, we should work around that by
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   861
    // manually inlining this into curveTo and quadTo.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   862
/******************************* WORKAROUND **********************************
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   863
    private void somethingTo(final int type) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   864
        // need these so we can update the state at the end of this method
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   865
        final float xf = middle[type-2], yf = middle[type-1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   866
        float dxs = middle[2] - middle[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   867
        float dys = middle[3] - middle[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   868
        float dxf = middle[type - 2] - middle[type - 4];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   869
        float dyf = middle[type - 1] - middle[type - 3];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   870
        switch(type) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   871
        case 6:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   872
            if ((dxs == 0f && dys == 0f) ||
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   873
                (dxf == 0f && dyf == 0f)) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   874
               dxs = dxf = middle[4] - middle[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   875
               dys = dyf = middle[5] - middle[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   876
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   877
            break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   878
        case 8:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   879
            boolean p1eqp2 = (dxs == 0f && dys == 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   880
            boolean p3eqp4 = (dxf == 0f && dyf == 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   881
            if (p1eqp2) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   882
                dxs = middle[4] - middle[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   883
                dys = middle[5] - middle[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   884
                if (dxs == 0f && dys == 0f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   885
                    dxs = middle[6] - middle[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   886
                    dys = middle[7] - middle[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   887
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   888
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   889
            if (p3eqp4) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   890
                dxf = middle[6] - middle[2];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   891
                dyf = middle[7] - middle[3];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   892
                if (dxf == 0f && dyf == 0f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   893
                    dxf = middle[6] - middle[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   894
                    dyf = middle[7] - middle[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   895
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   896
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   897
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   898
        if (dxs == 0f && dys == 0f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   899
            // this happens iff the "curve" is just a point
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   900
            lineTo(middle[0], middle[1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   901
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   902
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   903
        // if these vectors are too small, normalize them, to avoid future
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   904
        // precision problems.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   905
        if (Math.abs(dxs) < 0.1f && Math.abs(dys) < 0.1f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   906
            float len = (float) sqrt(dxs*dxs + dys*dys);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   907
            dxs /= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   908
            dys /= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   909
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   910
        if (Math.abs(dxf) < 0.1f && Math.abs(dyf) < 0.1f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   911
            float len = (float) sqrt(dxf*dxf + dyf*dyf);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   912
            dxf /= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   913
            dyf /= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   914
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   915
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   916
        computeOffset(dxs, dys, lineWidth2, offset0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   917
        final float mx = offset0[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   918
        final float my = offset0[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   919
        drawJoin(cdx, cdy, cx0, cy0, dxs, dys, cmx, cmy, mx, my);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   920
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   921
        int nSplits = findSubdivPoints(curve, middle, subdivTs, type, lineWidth2);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   922
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   923
        int kind = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   924
        BreakPtrIterator it = curve.breakPtsAtTs(middle, type, subdivTs, nSplits);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   925
        while(it.hasNext()) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   926
            int curCurveOff = it.next();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   927
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   928
            switch (type) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   929
            case 8:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   930
                kind = computeOffsetCubic(middle, curCurveOff, lp, rp);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   931
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   932
            case 6:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   933
                kind = computeOffsetQuad(middle, curCurveOff, lp, rp);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   934
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   935
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   936
            emitLineTo(lp[0], lp[1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   937
            switch(kind) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   938
            case 8:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   939
                emitCurveTo(lp[2], lp[3], lp[4], lp[5], lp[6], lp[7]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   940
                emitCurveToRev(rp[0], rp[1], rp[2], rp[3], rp[4], rp[5]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   941
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   942
            case 6:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   943
                emitQuadTo(lp[2], lp[3], lp[4], lp[5]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   944
                emitQuadToRev(rp[0], rp[1], rp[2], rp[3]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   945
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   946
            case 4:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   947
                emitLineTo(lp[2], lp[3]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   948
                emitLineTo(rp[0], rp[1], true);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   949
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   950
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   951
            emitLineTo(rp[kind - 2], rp[kind - 1], true);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   952
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   953
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   954
        this.cmx = (lp[kind - 2] - rp[kind - 2]) / 2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   955
        this.cmy = (lp[kind - 1] - rp[kind - 1]) / 2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   956
        this.cdx = dxf;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   957
        this.cdy = dyf;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   958
        this.cx0 = xf;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   959
        this.cy0 = yf;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   960
        this.prev = DRAWING_OP_TO;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   961
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   962
****************************** END WORKAROUND *******************************/
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   963
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   964
    // finds values of t where the curve in pts should be subdivided in order
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   965
    // to get good offset curves a distance of w away from the middle curve.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   966
    // Stores the points in ts, and returns how many of them there were.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   967
    private static int findSubdivPoints(final Curve c, float[] pts, float[] ts,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   968
                                        final int type, final float w)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   969
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   970
        final float x12 = pts[2] - pts[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   971
        final float y12 = pts[3] - pts[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   972
        // if the curve is already parallel to either axis we gain nothing
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   973
        // from rotating it.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   974
        if (y12 != 0f && x12 != 0f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   975
            // we rotate it so that the first vector in the control polygon is
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   976
            // parallel to the x-axis. This will ensure that rotated quarter
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   977
            // circles won't be subdivided.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   978
            final float hypot = (float) sqrt(x12 * x12 + y12 * y12);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   979
            final float cos = x12 / hypot;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   980
            final float sin = y12 / hypot;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   981
            final float x1 = cos * pts[0] + sin * pts[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   982
            final float y1 = cos * pts[1] - sin * pts[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   983
            final float x2 = cos * pts[2] + sin * pts[3];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   984
            final float y2 = cos * pts[3] - sin * pts[2];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   985
            final float x3 = cos * pts[4] + sin * pts[5];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   986
            final float y3 = cos * pts[5] - sin * pts[4];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   987
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   988
            switch(type) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   989
            case 8:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   990
                final float x4 = cos * pts[6] + sin * pts[7];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   991
                final float y4 = cos * pts[7] - sin * pts[6];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   992
                c.set(x1, y1, x2, y2, x3, y3, x4, y4);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   993
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   994
            case 6:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   995
                c.set(x1, y1, x2, y2, x3, y3);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   996
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   997
            default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   998
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   999
        } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1000
            c.set(pts, type);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1001
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1002
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1003
        int ret = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1004
        // we subdivide at values of t such that the remaining rotated
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1005
        // curves are monotonic in x and y.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1006
        ret += c.dxRoots(ts, ret);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1007
        ret += c.dyRoots(ts, ret);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1008
        // subdivide at inflection points.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1009
        if (type == 8) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1010
            // quadratic curves can't have inflection points
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1011
            ret += c.infPoints(ts, ret);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1012
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1013
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1014
        // now we must subdivide at points where one of the offset curves will have
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1015
        // a cusp. This happens at ts where the radius of curvature is equal to w.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1016
        ret += c.rootsOfROCMinusW(ts, ret, w, 0.0001f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1017
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1018
        ret = Helpers.filterOutNotInAB(ts, 0, ret, 0.0001f, 0.9999f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1019
        Helpers.isort(ts, 0, ret);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1020
        return ret;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1021
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1022
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1023
    @Override public void curveTo(float x1, float y1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1024
                                  float x2, float y2,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1025
                                  float x3, float y3)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1026
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1027
        final float[] mid = middle;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1028
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1029
        mid[0] = cx0; mid[1] = cy0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1030
        mid[2] = x1;  mid[3] = y1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1031
        mid[4] = x2;  mid[5] = y2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1032
        mid[6] = x3;  mid[7] = y3;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1033
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1034
        // inlined version of somethingTo(8);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1035
        // See the TODO on somethingTo
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1036
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1037
        // need these so we can update the state at the end of this method
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1038
        final float xf = mid[6], yf = mid[7];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1039
        float dxs = mid[2] - mid[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1040
        float dys = mid[3] - mid[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1041
        float dxf = mid[6] - mid[4];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1042
        float dyf = mid[7] - mid[5];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1043
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1044
        boolean p1eqp2 = (dxs == 0f && dys == 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1045
        boolean p3eqp4 = (dxf == 0f && dyf == 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1046
        if (p1eqp2) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1047
            dxs = mid[4] - mid[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1048
            dys = mid[5] - mid[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1049
            if (dxs == 0f && dys == 0f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1050
                dxs = mid[6] - mid[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1051
                dys = mid[7] - mid[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1052
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1053
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1054
        if (p3eqp4) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1055
            dxf = mid[6] - mid[2];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1056
            dyf = mid[7] - mid[3];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1057
            if (dxf == 0f && dyf == 0f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1058
                dxf = mid[6] - mid[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1059
                dyf = mid[7] - mid[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1060
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1061
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1062
        if (dxs == 0f && dys == 0f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1063
            // this happens if the "curve" is just a point
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1064
            lineTo(mid[0], mid[1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1065
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1066
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1067
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1068
        // if these vectors are too small, normalize them, to avoid future
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1069
        // precision problems.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1070
        if (Math.abs(dxs) < 0.1f && Math.abs(dys) < 0.1f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1071
            float len = (float) sqrt(dxs*dxs + dys*dys);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1072
            dxs /= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1073
            dys /= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1074
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1075
        if (Math.abs(dxf) < 0.1f && Math.abs(dyf) < 0.1f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1076
            float len = (float) sqrt(dxf*dxf + dyf*dyf);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1077
            dxf /= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1078
            dyf /= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1079
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1080
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1081
        computeOffset(dxs, dys, lineWidth2, offset0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1082
        drawJoin(cdx, cdy, cx0, cy0, dxs, dys, cmx, cmy, offset0[0], offset0[1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1083
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1084
        int nSplits = findSubdivPoints(curve, mid, subdivTs, 8, lineWidth2);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1085
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1086
        final float[] l = lp;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1087
        final float[] r = rp;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1088
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1089
        int kind = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1090
        BreakPtrIterator it = curve.breakPtsAtTs(mid, 8, subdivTs, nSplits);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1091
        while(it.hasNext()) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1092
            int curCurveOff = it.next();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1093
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1094
            kind = computeOffsetCubic(mid, curCurveOff, l, r);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1095
            emitLineTo(l[0], l[1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1096
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1097
            switch(kind) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1098
            case 8:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1099
                emitCurveTo(l[2], l[3], l[4], l[5], l[6], l[7]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1100
                emitCurveToRev(r[0], r[1], r[2], r[3], r[4], r[5]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1101
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1102
            case 4:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1103
                emitLineTo(l[2], l[3]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1104
                emitLineToRev(r[0], r[1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1105
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1106
            default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1107
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1108
            emitLineToRev(r[kind - 2], r[kind - 1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1109
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1110
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1111
        this.cmx = (l[kind - 2] - r[kind - 2]) / 2f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1112
        this.cmy = (l[kind - 1] - r[kind - 1]) / 2f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1113
        this.cdx = dxf;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1114
        this.cdy = dyf;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1115
        this.cx0 = xf;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1116
        this.cy0 = yf;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1117
        this.prev = DRAWING_OP_TO;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1118
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1119
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1120
    @Override public void quadTo(float x1, float y1, float x2, float y2) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1121
        final float[] mid = middle;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1122
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1123
        mid[0] = cx0; mid[1] = cy0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1124
        mid[2] = x1;  mid[3] = y1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1125
        mid[4] = x2;  mid[5] = y2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1126
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1127
        // inlined version of somethingTo(8);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1128
        // See the TODO on somethingTo
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1129
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1130
        // need these so we can update the state at the end of this method
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1131
        final float xf = mid[4], yf = mid[5];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1132
        float dxs = mid[2] - mid[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1133
        float dys = mid[3] - mid[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1134
        float dxf = mid[4] - mid[2];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1135
        float dyf = mid[5] - mid[3];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1136
        if ((dxs == 0f && dys == 0f) || (dxf == 0f && dyf == 0f)) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1137
            dxs = dxf = mid[4] - mid[0];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1138
            dys = dyf = mid[5] - mid[1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1139
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1140
        if (dxs == 0f && dys == 0f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1141
            // this happens if the "curve" is just a point
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1142
            lineTo(mid[0], mid[1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1143
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1144
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1145
        // if these vectors are too small, normalize them, to avoid future
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1146
        // precision problems.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1147
        if (Math.abs(dxs) < 0.1f && Math.abs(dys) < 0.1f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1148
            float len = (float) sqrt(dxs*dxs + dys*dys);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1149
            dxs /= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1150
            dys /= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1151
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1152
        if (Math.abs(dxf) < 0.1f && Math.abs(dyf) < 0.1f) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1153
            float len = (float) sqrt(dxf*dxf + dyf*dyf);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1154
            dxf /= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1155
            dyf /= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1156
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1157
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1158
        computeOffset(dxs, dys, lineWidth2, offset0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1159
        drawJoin(cdx, cdy, cx0, cy0, dxs, dys, cmx, cmy, offset0[0], offset0[1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1160
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1161
        int nSplits = findSubdivPoints(curve, mid, subdivTs, 6, lineWidth2);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1162
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1163
        final float[] l = lp;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1164
        final float[] r = rp;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1165
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1166
        int kind = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1167
        BreakPtrIterator it = curve.breakPtsAtTs(mid, 6, subdivTs, nSplits);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1168
        while(it.hasNext()) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1169
            int curCurveOff = it.next();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1170
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1171
            kind = computeOffsetQuad(mid, curCurveOff, l, r);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1172
            emitLineTo(l[0], l[1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1173
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1174
            switch(kind) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1175
            case 6:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1176
                emitQuadTo(l[2], l[3], l[4], l[5]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1177
                emitQuadToRev(r[0], r[1], r[2], r[3]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1178
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1179
            case 4:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1180
                emitLineTo(l[2], l[3]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1181
                emitLineToRev(r[0], r[1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1182
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1183
            default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1184
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1185
            emitLineToRev(r[kind - 2], r[kind - 1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1186
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1187
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1188
        this.cmx = (l[kind - 2] - r[kind - 2]) / 2f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1189
        this.cmy = (l[kind - 1] - r[kind - 1]) / 2f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1190
        this.cdx = dxf;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1191
        this.cdy = dyf;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1192
        this.cx0 = xf;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1193
        this.cy0 = yf;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1194
        this.prev = DRAWING_OP_TO;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1195
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1196
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1197
    @Override public long getNativeConsumer() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1198
        throw new InternalError("Stroker doesn't use a native consumer");
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1199
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1200
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1201
    // a stack of polynomial curves where each curve shares endpoints with
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1202
    // adjacent ones.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1203
    static final class PolyStack {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1204
        private static final byte TYPE_LINETO  = (byte) 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1205
        private static final byte TYPE_QUADTO  = (byte) 1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1206
        private static final byte TYPE_CUBICTO = (byte) 2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1207
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1208
        float[] curves;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1209
        int end;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1210
        byte[] curveTypes;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1211
        int numCurves;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1212
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1213
        // per-thread renderer context
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1214
        final RendererContext rdrCtx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1215
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1216
        // per-thread initial arrays (large enough to satisfy most usages: 8192)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1217
        // +1 to avoid recycling in Helpers.widenArray()
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1218
        private final float[] curves_initial = new float[INITIAL_LARGE_ARRAY + 1]; // 32K
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1219
        private final byte[] curveTypes_initial = new byte[INITIAL_LARGE_ARRAY + 1]; // 8K
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1220
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1221
        // used marks (stats only)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1222
        int curveTypesUseMark;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1223
        int curvesUseMark;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1224
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1225
        /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1226
         * Constructor
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1227
         * @param rdrCtx per-thread renderer context
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1228
         */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1229
        PolyStack(final RendererContext rdrCtx) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1230
            this.rdrCtx = rdrCtx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1231
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1232
            curves = curves_initial;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1233
            curveTypes = curveTypes_initial;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1234
            end = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1235
            numCurves = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1236
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
  1237
            if (DO_STATS) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1238
                curveTypesUseMark = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1239
                curvesUseMark = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1240
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1241
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1242
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1243
        /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1244
         * Disposes this PolyStack:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1245
         * clean up before reusing this instance
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1246
         */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1247
        void dispose() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1248
            end = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1249
            numCurves = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1250
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
  1251
            if (DO_STATS) {
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
  1252
                rdrCtx.stats.stat_rdr_poly_stack_types
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1253
                    .add(curveTypesUseMark);
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
  1254
                rdrCtx.stats.stat_rdr_poly_stack_curves
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1255
                    .add(curvesUseMark);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1256
                // reset marks
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1257
                curveTypesUseMark = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1258
                curvesUseMark = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1259
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1260
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1261
            // Return arrays:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1262
            // curves and curveTypes are kept dirty
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1263
            if (curves != curves_initial) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1264
                rdrCtx.putDirtyFloatArray(curves);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1265
                curves = curves_initial;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1266
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1267
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1268
            if (curveTypes != curveTypes_initial) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1269
                rdrCtx.putDirtyByteArray(curveTypes);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1270
                curveTypes = curveTypes_initial;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1271
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1272
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1273
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1274
        private void ensureSpace(final int n) {
34815
81e87daa9876 8144445: Maximum size checking in Marlin ArrayCache utility methods is not optimal
lbourges
parents: 34417
diff changeset
  1275
            // use substraction to avoid integer overflow:
81e87daa9876 8144445: Maximum size checking in Marlin ArrayCache utility methods is not optimal
lbourges
parents: 34417
diff changeset
  1276
            if (curves.length - end < n) {
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
  1277
                if (DO_STATS) {
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
  1278
                    rdrCtx.stats.stat_array_stroker_polystack_curves
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1279
                        .add(end + n);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1280
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1281
                curves = rdrCtx.widenDirtyFloatArray(curves, end, end + n);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1282
            }
34815
81e87daa9876 8144445: Maximum size checking in Marlin ArrayCache utility methods is not optimal
lbourges
parents: 34417
diff changeset
  1283
            if (curveTypes.length <= numCurves) {
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
  1284
                if (DO_STATS) {
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
  1285
                    rdrCtx.stats.stat_array_stroker_polystack_curveTypes
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1286
                        .add(numCurves + 1);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1287
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1288
                curveTypes = rdrCtx.widenDirtyByteArray(curveTypes,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1289
                                                        numCurves,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1290
                                                        numCurves + 1);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1291
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1292
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1293
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1294
        void pushCubic(float x0, float y0,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1295
                       float x1, float y1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1296
                       float x2, float y2)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1297
        {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1298
            ensureSpace(6);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1299
            curveTypes[numCurves++] = TYPE_CUBICTO;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1300
            // we reverse the coordinate order to make popping easier
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1301
            final float[] _curves = curves;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1302
            int e = end;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1303
            _curves[e++] = x2;    _curves[e++] = y2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1304
            _curves[e++] = x1;    _curves[e++] = y1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1305
            _curves[e++] = x0;    _curves[e++] = y0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1306
            end = e;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1307
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1308
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1309
        void pushQuad(float x0, float y0,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1310
                      float x1, float y1)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1311
        {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1312
            ensureSpace(4);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1313
            curveTypes[numCurves++] = TYPE_QUADTO;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1314
            final float[] _curves = curves;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1315
            int e = end;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1316
            _curves[e++] = x1;    _curves[e++] = y1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1317
            _curves[e++] = x0;    _curves[e++] = y0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1318
            end = e;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1319
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1320
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1321
        void pushLine(float x, float y) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1322
            ensureSpace(2);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1323
            curveTypes[numCurves++] = TYPE_LINETO;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1324
            curves[end++] = x;    curves[end++] = y;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1325
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1326
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1327
        void popAll(PathConsumer2D io) {
39519
21bfc4452441 8159093: Fix coding conventions in Marlin renderer
lbourges
parents: 36902
diff changeset
  1328
            if (DO_STATS) {
34417
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1329
                // update used marks:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1330
                if (numCurves > curveTypesUseMark) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1331
                    curveTypesUseMark = numCurves;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1332
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1333
                if (end > curvesUseMark) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1334
                    curvesUseMark = end;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1335
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1336
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1337
            final byte[]  _curveTypes = curveTypes;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1338
            final float[] _curves = curves;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1339
            int nc = numCurves;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1340
            int e  = end;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1341
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1342
            while (nc != 0) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1343
                switch(_curveTypes[--nc]) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1344
                case TYPE_LINETO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1345
                    e -= 2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1346
                    io.lineTo(_curves[e], _curves[e+1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1347
                    continue;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1348
                case TYPE_QUADTO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1349
                    e -= 4;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1350
                    io.quadTo(_curves[e+0], _curves[e+1],
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1351
                              _curves[e+2], _curves[e+3]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1352
                    continue;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1353
                case TYPE_CUBICTO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1354
                    e -= 6;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1355
                    io.curveTo(_curves[e+0], _curves[e+1],
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1356
                               _curves[e+2], _curves[e+3],
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1357
                               _curves[e+4], _curves[e+5]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1358
                    continue;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1359
                default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1360
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1361
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1362
            numCurves = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1363
            end = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1364
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1365
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1366
        @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1367
        public String toString() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1368
            String ret = "";
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1369
            int nc = numCurves;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1370
            int e  = end;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1371
            int len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1372
            while (nc != 0) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1373
                switch(curveTypes[--nc]) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1374
                case TYPE_LINETO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1375
                    len = 2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1376
                    ret += "line: ";
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1377
                    break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1378
                case TYPE_QUADTO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1379
                    len = 4;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1380
                    ret += "quad: ";
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1381
                    break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1382
                case TYPE_CUBICTO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1383
                    len = 6;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1384
                    ret += "cubic: ";
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1385
                    break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1386
                default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1387
                    len = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1388
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1389
                e -= len;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1390
                ret += Arrays.toString(Arrays.copyOfRange(curves, e, e+len))
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1391
                                       + "\n";
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1392
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1393
            return ret;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1394
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1395
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1396
}