jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java
author flar
Mon, 23 Nov 2015 14:35:55 -0800
changeset 34417 57a3863abbb4
child 36458 25786a73a5fc
permissions -rw-r--r--
8076529: Marlin antialiasing renderer integration 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
/*
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
     2
 * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
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.awt.BasicStroke;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    29
import java.awt.Shape;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    30
import java.awt.geom.AffineTransform;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    31
import java.awt.geom.Path2D;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    32
import java.awt.geom.PathIterator;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    33
import java.lang.ref.Reference;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    34
import java.security.AccessController;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    35
import java.util.concurrent.ConcurrentLinkedQueue;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    36
import static sun.java2d.marlin.MarlinUtils.logInfo;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    37
import sun.awt.geom.PathConsumer2D;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    38
import sun.java2d.pipe.AATileGenerator;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    39
import sun.java2d.pipe.Region;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    40
import sun.java2d.pipe.RenderingEngine;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    41
import sun.security.action.GetPropertyAction;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    42
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    43
/**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    44
 * Marlin RendererEngine implementation (derived from Pisces)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    45
 */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    46
public class MarlinRenderingEngine extends RenderingEngine
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    47
                                   implements MarlinConst
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    48
{
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    49
    private static enum NormMode {ON_WITH_AA, ON_NO_AA, OFF}
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    50
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    51
    private static final float MIN_PEN_SIZE = 1f / NORM_SUBPIXELS;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    52
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    53
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    54
     * Public constructor
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    55
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    56
    public MarlinRenderingEngine() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    57
        super();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    58
        logSettings(MarlinRenderingEngine.class.getName());
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
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    62
     * Create a widened path as specified by the parameters.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    63
     * <p>
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    64
     * The specified {@code src} {@link Shape} is widened according
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    65
     * to the specified attribute parameters as per the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    66
     * {@link BasicStroke} specification.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    67
     *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    68
     * @param src the source path to be widened
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    69
     * @param width the width of the widened path as per {@code BasicStroke}
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    70
     * @param caps the end cap decorations as per {@code BasicStroke}
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    71
     * @param join the segment join decorations as per {@code BasicStroke}
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    72
     * @param miterlimit the miter limit as per {@code BasicStroke}
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    73
     * @param dashes the dash length array as per {@code BasicStroke}
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    74
     * @param dashphase the initial dash phase as per {@code BasicStroke}
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    75
     * @return the widened path stored in a new {@code Shape} object
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    76
     * @since 1.7
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    77
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    78
    @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    79
    public Shape createStrokedShape(Shape src,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    80
                                    float width,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    81
                                    int caps,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    82
                                    int join,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    83
                                    float miterlimit,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    84
                                    float dashes[],
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    85
                                    float dashphase)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    86
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    87
        final RendererContext rdrCtx = getRendererContext();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    88
        try {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    89
            // initialize a large copyable Path2D to avoid a lot of array growing:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    90
            final Path2D.Float p2d =
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    91
                    (rdrCtx.p2d == null) ?
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    92
                    (rdrCtx.p2d = new Path2D.Float(Path2D.WIND_NON_ZERO,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    93
                                                   INITIAL_MEDIUM_ARRAY))
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    94
                    : rdrCtx.p2d;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    95
            // reset
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    96
            p2d.reset();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    97
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    98
            strokeTo(rdrCtx,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
    99
                     src,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   100
                     null,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   101
                     width,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   102
                     NormMode.OFF,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   103
                     caps,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   104
                     join,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   105
                     miterlimit,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   106
                     dashes,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   107
                     dashphase,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   108
                     rdrCtx.transformerPC2D.wrapPath2d(p2d)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   109
                    );
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   110
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   111
            // Use Path2D copy constructor (trim)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   112
            return new Path2D.Float(p2d);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   113
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   114
        } finally {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   115
            // recycle the RendererContext instance
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   116
            returnRendererContext(rdrCtx);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   117
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   118
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   119
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   120
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   121
     * Sends the geometry for a widened path as specified by the parameters
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   122
     * to the specified consumer.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   123
     * <p>
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   124
     * The specified {@code src} {@link Shape} is widened according
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   125
     * to the parameters specified by the {@link BasicStroke} object.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   126
     * Adjustments are made to the path as appropriate for the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   127
     * {@link VALUE_STROKE_NORMALIZE} hint if the {@code normalize}
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   128
     * boolean parameter is true.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   129
     * Adjustments are made to the path as appropriate for the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   130
     * {@link VALUE_ANTIALIAS_ON} hint if the {@code antialias}
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   131
     * boolean parameter is true.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   132
     * <p>
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   133
     * The geometry of the widened path is forwarded to the indicated
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   134
     * {@link PathConsumer2D} object as it is calculated.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   135
     *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   136
     * @param src the source path to be widened
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   137
     * @param bs the {@code BasicSroke} object specifying the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   138
     *           decorations to be applied to the widened path
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   139
     * @param normalize indicates whether stroke normalization should
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   140
     *                  be applied
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   141
     * @param antialias indicates whether or not adjustments appropriate
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   142
     *                  to antialiased rendering should be applied
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   143
     * @param consumer the {@code PathConsumer2D} instance to forward
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   144
     *                 the widened geometry to
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   145
     * @since 1.7
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   146
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   147
    @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   148
    public void strokeTo(Shape src,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   149
                         AffineTransform at,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   150
                         BasicStroke bs,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   151
                         boolean thin,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   152
                         boolean normalize,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   153
                         boolean antialias,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   154
                         final PathConsumer2D consumer)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   155
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   156
        final NormMode norm = (normalize) ?
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   157
                ((antialias) ? NormMode.ON_WITH_AA : NormMode.ON_NO_AA)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   158
                : NormMode.OFF;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   159
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   160
        final RendererContext rdrCtx = getRendererContext();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   161
        try {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   162
            strokeTo(rdrCtx, src, at, bs, thin, norm, antialias, consumer);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   163
        } finally {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   164
            // recycle the RendererContext instance
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   165
            returnRendererContext(rdrCtx);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   166
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   167
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   168
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   169
    final void strokeTo(final RendererContext rdrCtx,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   170
                        Shape src,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   171
                        AffineTransform at,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   172
                        BasicStroke bs,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   173
                        boolean thin,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   174
                        NormMode normalize,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   175
                        boolean antialias,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   176
                        PathConsumer2D pc2d)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   177
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   178
        float lw;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   179
        if (thin) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   180
            if (antialias) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   181
                lw = userSpaceLineWidth(at, MIN_PEN_SIZE);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   182
            } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   183
                lw = userSpaceLineWidth(at, 1.0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   184
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   185
        } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   186
            lw = bs.getLineWidth();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   187
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   188
        strokeTo(rdrCtx,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   189
                 src,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   190
                 at,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   191
                 lw,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   192
                 normalize,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   193
                 bs.getEndCap(),
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   194
                 bs.getLineJoin(),
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   195
                 bs.getMiterLimit(),
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   196
                 bs.getDashArray(),
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   197
                 bs.getDashPhase(),
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   198
                 pc2d);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   199
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   200
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   201
    private final float userSpaceLineWidth(AffineTransform at, float lw) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   202
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   203
        float widthScale;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   204
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   205
        if (at == null) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   206
            widthScale = 1.0f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   207
        } else if ((at.getType() & (AffineTransform.TYPE_GENERAL_TRANSFORM  |
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   208
                                    AffineTransform.TYPE_GENERAL_SCALE)) != 0) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   209
            widthScale = (float)Math.sqrt(at.getDeterminant());
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   210
        } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   211
            // First calculate the "maximum scale" of this transform.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   212
            double A = at.getScaleX();       // m00
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   213
            double C = at.getShearX();       // m01
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   214
            double B = at.getShearY();       // m10
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   215
            double D = at.getScaleY();       // m11
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   216
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   217
            /*
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   218
             * Given a 2 x 2 affine matrix [ A B ] such that
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   219
             *                             [ C D ]
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   220
             * v' = [x' y'] = [Ax + Cy, Bx + Dy], we want to
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   221
             * find the maximum magnitude (norm) of the vector v'
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   222
             * with the constraint (x^2 + y^2 = 1).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   223
             * The equation to maximize is
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   224
             *     |v'| = sqrt((Ax+Cy)^2+(Bx+Dy)^2)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   225
             * or  |v'| = sqrt((AA+BB)x^2 + 2(AC+BD)xy + (CC+DD)y^2).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   226
             * Since sqrt is monotonic we can maximize |v'|^2
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   227
             * instead and plug in the substitution y = sqrt(1 - x^2).
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   228
             * Trigonometric equalities can then be used to get
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   229
             * rid of most of the sqrt terms.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   230
             */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   231
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   232
            double EA = A*A + B*B;          // x^2 coefficient
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   233
            double EB = 2.0*(A*C + B*D);    // xy coefficient
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   234
            double EC = C*C + D*D;          // y^2 coefficient
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   235
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   236
            /*
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   237
             * There is a lot of calculus omitted here.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   238
             *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   239
             * Conceptually, in the interests of understanding the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   240
             * terms that the calculus produced we can consider
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   241
             * that EA and EC end up providing the lengths along
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   242
             * the major axes and the hypot term ends up being an
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   243
             * adjustment for the additional length along the off-axis
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   244
             * angle of rotated or sheared ellipses as well as an
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   245
             * adjustment for the fact that the equation below
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   246
             * averages the two major axis lengths.  (Notice that
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   247
             * the hypot term contains a part which resolves to the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   248
             * difference of these two axis lengths in the absence
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   249
             * of rotation.)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   250
             *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   251
             * In the calculus, the ratio of the EB and (EA-EC) terms
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   252
             * ends up being the tangent of 2*theta where theta is
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   253
             * the angle that the long axis of the ellipse makes
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   254
             * with the horizontal axis.  Thus, this equation is
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   255
             * calculating the length of the hypotenuse of a triangle
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   256
             * along that axis.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   257
             */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   258
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   259
            double hypot = Math.sqrt(EB*EB + (EA-EC)*(EA-EC));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   260
            // sqrt omitted, compare to squared limits below.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   261
            double widthsquared = ((EA + EC + hypot)/2.0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   262
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   263
            widthScale = (float)Math.sqrt(widthsquared);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   264
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   265
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   266
        return (lw / widthScale);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   267
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   268
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   269
    final void strokeTo(final RendererContext rdrCtx,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   270
                        Shape src,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   271
                        AffineTransform at,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   272
                        float width,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   273
                        NormMode normalize,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   274
                        int caps,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   275
                        int join,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   276
                        float miterlimit,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   277
                        float dashes[],
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   278
                        float dashphase,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   279
                        PathConsumer2D pc2d)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   280
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   281
        // We use strokerat and outat so that in Stroker and Dasher we can work only
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   282
        // with the pre-transformation coordinates. This will repeat a lot of
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   283
        // computations done in the path iterator, but the alternative is to
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   284
        // work with transformed paths and compute untransformed coordinates
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   285
        // as needed. This would be faster but I do not think the complexity
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   286
        // of working with both untransformed and transformed coordinates in
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   287
        // the same code is worth it.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   288
        // However, if a path's width is constant after a transformation,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   289
        // we can skip all this untransforming.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   290
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   291
        // If normalization is off we save some transformations by not
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   292
        // transforming the input to pisces. Instead, we apply the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   293
        // transformation after the path processing has been done.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   294
        // We can't do this if normalization is on, because it isn't a good
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   295
        // idea to normalize before the transformation is applied.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   296
        AffineTransform strokerat = null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   297
        AffineTransform outat = null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   298
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   299
        PathIterator pi;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   300
        int dashLen = -1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   301
        boolean recycleDashes = false;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   302
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   303
        if (at != null && !at.isIdentity()) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   304
            final double a = at.getScaleX();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   305
            final double b = at.getShearX();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   306
            final double c = at.getShearY();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   307
            final double d = at.getScaleY();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   308
            final double det = a * d - c * b;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   309
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   310
            if (Math.abs(det) <= (2f * Float.MIN_VALUE)) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   311
                // this rendering engine takes one dimensional curves and turns
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   312
                // them into 2D shapes by giving them width.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   313
                // However, if everything is to be passed through a singular
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   314
                // transformation, these 2D shapes will be squashed down to 1D
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   315
                // again so, nothing can be drawn.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   316
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   317
                // Every path needs an initial moveTo and a pathDone. If these
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   318
                // are not there this causes a SIGSEGV in libawt.so (at the time
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   319
                // of writing of this comment (September 16, 2010)). Actually,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   320
                // I am not sure if the moveTo is necessary to avoid the SIGSEGV
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   321
                // but the pathDone is definitely needed.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   322
                pc2d.moveTo(0f, 0f);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   323
                pc2d.pathDone();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   324
                return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   325
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   326
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   327
            // If the transform is a constant multiple of an orthogonal transformation
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   328
            // then every length is just multiplied by a constant, so we just
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   329
            // need to transform input paths to stroker and tell stroker
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   330
            // the scaled width. This condition is satisfied if
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   331
            // a*b == -c*d && a*a+c*c == b*b+d*d. In the actual check below, we
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   332
            // leave a bit of room for error.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   333
            if (nearZero(a*b + c*d) && nearZero(a*a + c*c - (b*b + d*d))) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   334
                final float scale = (float) Math.sqrt(a*a + c*c);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   335
                if (dashes != null) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   336
                    recycleDashes = true;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   337
                    dashLen = dashes.length;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   338
                    final float[] newDashes;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   339
                    if (dashLen <= INITIAL_ARRAY) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   340
                        newDashes = rdrCtx.dasher.dashes_initial;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   341
                    } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   342
                        if (doStats) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   343
                            RendererContext.stats.stat_array_dasher_dasher
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   344
                                .add(dashLen);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   345
                        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   346
                        newDashes = rdrCtx.getDirtyFloatArray(dashLen);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   347
                    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   348
                    System.arraycopy(dashes, 0, newDashes, 0, dashLen);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   349
                    dashes = newDashes;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   350
                    for (int i = 0; i < dashLen; i++) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   351
                        dashes[i] = scale * dashes[i];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   352
                    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   353
                    dashphase = scale * dashphase;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   354
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   355
                width = scale * width;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   356
                pi = getNormalizingPathIterator(rdrCtx, normalize,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   357
                                                src.getPathIterator(at));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   358
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   359
                // by now strokerat == null && outat == null. Input paths to
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   360
                // stroker (and maybe dasher) will have the full transform at
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   361
                // applied to them and nothing will happen to the output paths.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   362
            } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   363
                if (normalize != NormMode.OFF) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   364
                    strokerat = at;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   365
                    pi = getNormalizingPathIterator(rdrCtx, normalize,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   366
                                                    src.getPathIterator(at));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   367
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   368
                    // by now strokerat == at && outat == null. Input paths to
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   369
                    // stroker (and maybe dasher) will have the full transform at
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   370
                    // applied to them, then they will be normalized, and then
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   371
                    // the inverse of *only the non translation part of at* will
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   372
                    // be applied to the normalized paths. This won't cause problems
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   373
                    // in stroker, because, suppose at = T*A, where T is just the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   374
                    // translation part of at, and A is the rest. T*A has already
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   375
                    // been applied to Stroker/Dasher's input. Then Ainv will be
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   376
                    // applied. Ainv*T*A is not equal to T, but it is a translation,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   377
                    // which means that none of stroker's assumptions about its
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   378
                    // input will be violated. After all this, A will be applied
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   379
                    // to stroker's output.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   380
                } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   381
                    outat = at;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   382
                    pi = src.getPathIterator(null);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   383
                    // outat == at && strokerat == null. This is because if no
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   384
                    // normalization is done, we can just apply all our
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   385
                    // transformations to stroker's output.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   386
                }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   387
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   388
        } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   389
            // either at is null or it's the identity. In either case
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   390
            // we don't transform the path.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   391
            pi = getNormalizingPathIterator(rdrCtx, normalize,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   392
                                            src.getPathIterator(null));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   393
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   394
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   395
        if (useSimplifier) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   396
            // Use simplifier after stroker before Renderer
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   397
            // to remove collinear segments (notably due to cap square)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   398
            pc2d = rdrCtx.simplifier.init(pc2d);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   399
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   400
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   401
        // by now, at least one of outat and strokerat will be null. Unless at is not
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   402
        // a constant multiple of an orthogonal transformation, they will both be
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   403
        // null. In other cases, outat == at if normalization is off, and if
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   404
        // normalization is on, strokerat == at.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   405
        final TransformingPathConsumer2D transformerPC2D = rdrCtx.transformerPC2D;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   406
        pc2d = transformerPC2D.transformConsumer(pc2d, outat);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   407
        pc2d = transformerPC2D.deltaTransformConsumer(pc2d, strokerat);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   408
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   409
        pc2d = rdrCtx.stroker.init(pc2d, width, caps, join, miterlimit);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   410
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   411
        if (dashes != null) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   412
            if (!recycleDashes) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   413
                dashLen = dashes.length;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   414
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   415
            pc2d = rdrCtx.dasher.init(pc2d, dashes, dashLen, dashphase,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   416
                                      recycleDashes);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   417
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   418
        pc2d = transformerPC2D.inverseDeltaTransformConsumer(pc2d, strokerat);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   419
        pathTo(rdrCtx, pi, pc2d);
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
         * Pipeline seems to be:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   423
         *    shape.getPathIterator
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   424
         * -> NormalizingPathIterator
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   425
         * -> inverseDeltaTransformConsumer
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   426
         * -> Dasher
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   427
         * -> Stroker
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   428
         * -> deltaTransformConsumer OR transformConsumer
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   429
         *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   430
         * -> CollinearSimplifier to remove redundant segments
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   431
         *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   432
         * -> pc2d = Renderer (bounding box)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   433
         */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   434
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   435
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   436
    private static boolean nearZero(final double num) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   437
        return Math.abs(num) < 2.0 * Math.ulp(num);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   438
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   439
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   440
    PathIterator getNormalizingPathIterator(final RendererContext rdrCtx,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   441
                                            final NormMode mode,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   442
                                            final PathIterator src)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   443
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   444
        switch (mode) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   445
            case ON_WITH_AA:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   446
                // NormalizingPathIterator NearestPixelCenter:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   447
                return rdrCtx.nPCPathIterator.init(src);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   448
            case ON_NO_AA:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   449
                // NearestPixel NormalizingPathIterator:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   450
                return rdrCtx.nPQPathIterator.init(src);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   451
            case OFF:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   452
                // return original path iterator if normalization is disabled:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   453
                return src;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   454
            default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   455
                throw new InternalError("Unrecognized normalization mode");
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   456
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   457
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   458
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   459
    abstract static class NormalizingPathIterator implements PathIterator {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   460
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   461
        private PathIterator src;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   462
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   463
        // the adjustment applied to the current position.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   464
        private float curx_adjust, cury_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   465
        // the adjustment applied to the last moveTo position.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   466
        private float movx_adjust, movy_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   467
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   468
        private final float[] tmp;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   469
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   470
        NormalizingPathIterator(final float[] tmp) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   471
            this.tmp = tmp;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   472
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   473
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   474
        final NormalizingPathIterator init(final PathIterator src) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   475
            this.src = src;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   476
            return this; // fluent API
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   477
        }
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
         * Disposes this path iterator:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   481
         * clean up before reusing this instance
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   482
         */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   483
        final void dispose() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   484
            // free source PathIterator:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   485
            this.src = null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   486
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   487
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   488
        @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   489
        public final int currentSegment(final float[] coords) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   490
            if (doMonitors) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   491
                RendererContext.stats.mon_npi_currentSegment.start();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   492
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   493
            int lastCoord;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   494
            final int type = src.currentSegment(coords);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   495
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   496
            switch(type) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   497
                case PathIterator.SEG_MOVETO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   498
                case PathIterator.SEG_LINETO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   499
                    lastCoord = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   500
                    break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   501
                case PathIterator.SEG_QUADTO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   502
                    lastCoord = 2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   503
                    break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   504
                case PathIterator.SEG_CUBICTO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   505
                    lastCoord = 4;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   506
                    break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   507
                case PathIterator.SEG_CLOSE:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   508
                    // we don't want to deal with this case later. We just exit now
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   509
                    curx_adjust = movx_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   510
                    cury_adjust = movy_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   511
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   512
                    if (doMonitors) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   513
                        RendererContext.stats.mon_npi_currentSegment.stop();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   514
                    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   515
                    return type;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   516
                default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   517
                    throw new InternalError("Unrecognized curve type");
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
            // TODO: handle NaN, Inf and overflow
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   521
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   522
            // normalize endpoint
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   523
            float coord, x_adjust, y_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   524
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   525
            coord = coords[lastCoord];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   526
            x_adjust = normCoord(coord); // new coord
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   527
            coords[lastCoord] = x_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   528
            x_adjust -= coord;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   529
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   530
            coord = coords[lastCoord + 1];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   531
            y_adjust = normCoord(coord); // new coord
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   532
            coords[lastCoord + 1] = y_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   533
            y_adjust -= coord;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   534
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   535
            // now that the end points are done, normalize the control points
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   536
            switch(type) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   537
                case PathIterator.SEG_MOVETO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   538
                    movx_adjust = x_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   539
                    movy_adjust = y_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   540
                    break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   541
                case PathIterator.SEG_LINETO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   542
                    break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   543
                case PathIterator.SEG_QUADTO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   544
                    coords[0] += (curx_adjust + x_adjust) / 2f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   545
                    coords[1] += (cury_adjust + y_adjust) / 2f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   546
                    break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   547
                case PathIterator.SEG_CUBICTO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   548
                    coords[0] += curx_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   549
                    coords[1] += cury_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   550
                    coords[2] += x_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   551
                    coords[3] += y_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   552
                    break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   553
                case PathIterator.SEG_CLOSE:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   554
                    // handled earlier
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   555
                default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   556
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   557
            curx_adjust = x_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   558
            cury_adjust = y_adjust;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   559
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   560
            if (doMonitors) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   561
                RendererContext.stats.mon_npi_currentSegment.stop();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   562
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   563
            return type;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   564
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   565
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   566
        abstract float normCoord(final float coord);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   567
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   568
        @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   569
        public final int currentSegment(final double[] coords) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   570
            final float[] _tmp = tmp; // dirty
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   571
            int type = this.currentSegment(_tmp);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   572
            for (int i = 0; i < 6; i++) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   573
                coords[i] = _tmp[i];
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   574
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   575
            return type;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   576
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   577
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   578
        @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   579
        public final int getWindingRule() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   580
            return src.getWindingRule();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   581
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   582
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   583
        @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   584
        public final boolean isDone() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   585
            if (src.isDone()) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   586
                // Dispose this instance:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   587
                dispose();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   588
                return true;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   589
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   590
            return false;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   591
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   592
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   593
        @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   594
        public final void next() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   595
            src.next();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   596
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   597
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   598
        static final class NearestPixelCenter
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   599
                                extends NormalizingPathIterator
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   600
        {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   601
            NearestPixelCenter(final float[] tmp) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   602
                super(tmp);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   603
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   604
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   605
            @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   606
            float normCoord(final float coord) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   607
                // round to nearest pixel center
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   608
                return FloatMath.floor_f(coord) + 0.5f;
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
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   612
        static final class NearestPixelQuarter
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   613
                                extends NormalizingPathIterator
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   614
        {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   615
            NearestPixelQuarter(final float[] tmp) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   616
                super(tmp);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   617
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   618
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   619
            @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   620
            float normCoord(final float coord) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   621
                // round to nearest (0.25, 0.25) pixel quarter
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   622
                return FloatMath.floor_f(coord + 0.25f) + 0.25f;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   623
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   624
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   625
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   626
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   627
    private static void pathTo(final RendererContext rdrCtx, final PathIterator pi,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   628
                               final PathConsumer2D pc2d)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   629
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   630
        // mark context as DIRTY:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   631
        rdrCtx.dirty = true;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   632
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   633
        final float[] coords = rdrCtx.float6;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   634
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   635
        pathToLoop(coords, pi, pc2d);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   636
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   637
        // mark context as CLEAN:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   638
        rdrCtx.dirty = false;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   639
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   640
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   641
    private static void pathToLoop(final float[] coords, final PathIterator pi,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   642
                                   final PathConsumer2D pc2d)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   643
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   644
        for (; !pi.isDone(); pi.next()) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   645
            switch (pi.currentSegment(coords)) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   646
                case PathIterator.SEG_MOVETO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   647
                    pc2d.moveTo(coords[0], coords[1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   648
                    continue;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   649
                case PathIterator.SEG_LINETO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   650
                    pc2d.lineTo(coords[0], coords[1]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   651
                    continue;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   652
                case PathIterator.SEG_QUADTO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   653
                    pc2d.quadTo(coords[0], coords[1],
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   654
                                coords[2], coords[3]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   655
                    continue;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   656
                case PathIterator.SEG_CUBICTO:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   657
                    pc2d.curveTo(coords[0], coords[1],
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   658
                                 coords[2], coords[3],
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   659
                                 coords[4], coords[5]);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   660
                    continue;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   661
                case PathIterator.SEG_CLOSE:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   662
                    pc2d.closePath();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   663
                    continue;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   664
                default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   665
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   666
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   667
        pc2d.pathDone();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   668
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   669
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   670
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   671
     * Construct an antialiased tile generator for the given shape with
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   672
     * the given rendering attributes and store the bounds of the tile
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   673
     * iteration in the bbox parameter.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   674
     * The {@code at} parameter specifies a transform that should affect
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   675
     * both the shape and the {@code BasicStroke} attributes.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   676
     * The {@code clip} parameter specifies the current clip in effect
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   677
     * in device coordinates and can be used to prune the data for the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   678
     * operation, but the renderer is not required to perform any
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   679
     * clipping.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   680
     * If the {@code BasicStroke} parameter is null then the shape
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   681
     * should be filled as is, otherwise the attributes of the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   682
     * {@code BasicStroke} should be used to specify a draw operation.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   683
     * The {@code thin} parameter indicates whether or not the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   684
     * transformed {@code BasicStroke} represents coordinates smaller
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   685
     * than the minimum resolution of the antialiasing rasterizer as
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   686
     * specified by the {@code getMinimumAAPenWidth()} method.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   687
     * <p>
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   688
     * Upon returning, this method will fill the {@code bbox} parameter
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   689
     * with 4 values indicating the bounds of the iteration of the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   690
     * tile generator.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   691
     * The iteration order of the tiles will be as specified by the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   692
     * pseudo-code:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   693
     * <pre>
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   694
     *     for (y = bbox[1]; y < bbox[3]; y += tileheight) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   695
     *         for (x = bbox[0]; x < bbox[2]; x += tilewidth) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   696
     *         }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   697
     *     }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   698
     * </pre>
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   699
     * If there is no output to be rendered, this method may return
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   700
     * null.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   701
     *
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   702
     * @param s the shape to be rendered (fill or draw)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   703
     * @param at the transform to be applied to the shape and the
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   704
     *           stroke attributes
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   705
     * @param clip the current clip in effect in device coordinates
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   706
     * @param bs if non-null, a {@code BasicStroke} whose attributes
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   707
     *           should be applied to this operation
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   708
     * @param thin true if the transformed stroke attributes are smaller
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   709
     *             than the minimum dropout pen width
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   710
     * @param normalize true if the {@code VALUE_STROKE_NORMALIZE}
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   711
     *                  {@code RenderingHint} is in effect
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   712
     * @param bbox returns the bounds of the iteration
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   713
     * @return the {@code AATileGenerator} instance to be consulted
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   714
     *         for tile coverages, or null if there is no output to render
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   715
     * @since 1.7
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   716
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   717
    @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   718
    public AATileGenerator getAATileGenerator(Shape s,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   719
                                              AffineTransform at,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   720
                                              Region clip,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   721
                                              BasicStroke bs,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   722
                                              boolean thin,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   723
                                              boolean normalize,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   724
                                              int bbox[])
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   725
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   726
        MarlinTileGenerator ptg = null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   727
        Renderer r = null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   728
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   729
        final RendererContext rdrCtx = getRendererContext();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   730
        try {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   731
            // Test if at is identity:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   732
            final AffineTransform _at = (at != null && !at.isIdentity()) ? at
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   733
                                        : null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   734
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   735
            final NormMode norm = (normalize) ? NormMode.ON_WITH_AA : NormMode.OFF;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   736
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   737
            if (bs == null) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   738
                // fill shape:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   739
                final PathIterator pi = getNormalizingPathIterator(rdrCtx, norm,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   740
                                            s.getPathIterator(_at));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   741
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   742
                r = rdrCtx.renderer.init(clip.getLoX(), clip.getLoY(),
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   743
                                         clip.getWidth(), clip.getHeight(),
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   744
                                         pi.getWindingRule());
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   745
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   746
                // TODO: subdivide quad/cubic curves into monotonic curves ?
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   747
                pathTo(rdrCtx, pi, r);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   748
            } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   749
                // draw shape with given stroke:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   750
                r = rdrCtx.renderer.init(clip.getLoX(), clip.getLoY(),
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   751
                                         clip.getWidth(), clip.getHeight(),
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   752
                                         PathIterator.WIND_NON_ZERO);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   753
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   754
                strokeTo(rdrCtx, s, _at, bs, thin, norm, true, r);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   755
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   756
            if (r.endRendering()) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   757
                ptg = rdrCtx.ptg.init();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   758
                ptg.getBbox(bbox);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   759
                // note: do not returnRendererContext(rdrCtx)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   760
                // as it will be called later by MarlinTileGenerator.dispose()
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   761
                r = null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   762
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   763
        } finally {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   764
            if (r != null) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   765
                // dispose renderer:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   766
                r.dispose();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   767
                // recycle the RendererContext instance
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   768
                MarlinRenderingEngine.returnRendererContext(rdrCtx);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   769
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   770
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   771
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   772
        // Return null to cancel AA tile generation (nothing to render)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   773
        return ptg;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   774
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   775
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   776
    @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   777
    public final AATileGenerator getAATileGenerator(double x, double y,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   778
                                                    double dx1, double dy1,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   779
                                                    double dx2, double dy2,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   780
                                                    double lw1, double lw2,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   781
                                                    Region clip,
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   782
                                                    int bbox[])
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   783
    {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   784
        // REMIND: Deal with large coordinates!
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   785
        double ldx1, ldy1, ldx2, ldy2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   786
        boolean innerpgram = (lw1 > 0.0 && lw2 > 0.0);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   787
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   788
        if (innerpgram) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   789
            ldx1 = dx1 * lw1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   790
            ldy1 = dy1 * lw1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   791
            ldx2 = dx2 * lw2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   792
            ldy2 = dy2 * lw2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   793
            x -= (ldx1 + ldx2) / 2.0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   794
            y -= (ldy1 + ldy2) / 2.0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   795
            dx1 += ldx1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   796
            dy1 += ldy1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   797
            dx2 += ldx2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   798
            dy2 += ldy2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   799
            if (lw1 > 1.0 && lw2 > 1.0) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   800
                // Inner parallelogram was entirely consumed by stroke...
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   801
                innerpgram = false;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   802
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   803
        } else {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   804
            ldx1 = ldy1 = ldx2 = ldy2 = 0.0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   805
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   806
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   807
        MarlinTileGenerator ptg = null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   808
        Renderer r = null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   809
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   810
        final RendererContext rdrCtx = getRendererContext();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   811
        try {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   812
            r = rdrCtx.renderer.init(clip.getLoX(), clip.getLoY(),
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   813
                                         clip.getWidth(), clip.getHeight(),
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   814
                                         Renderer.WIND_EVEN_ODD);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   815
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   816
            r.moveTo((float) x, (float) y);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   817
            r.lineTo((float) (x+dx1), (float) (y+dy1));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   818
            r.lineTo((float) (x+dx1+dx2), (float) (y+dy1+dy2));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   819
            r.lineTo((float) (x+dx2), (float) (y+dy2));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   820
            r.closePath();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   821
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   822
            if (innerpgram) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   823
                x += ldx1 + ldx2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   824
                y += ldy1 + ldy2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   825
                dx1 -= 2.0 * ldx1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   826
                dy1 -= 2.0 * ldy1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   827
                dx2 -= 2.0 * ldx2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   828
                dy2 -= 2.0 * ldy2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   829
                r.moveTo((float) x, (float) y);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   830
                r.lineTo((float) (x+dx1), (float) (y+dy1));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   831
                r.lineTo((float) (x+dx1+dx2), (float) (y+dy1+dy2));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   832
                r.lineTo((float) (x+dx2), (float) (y+dy2));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   833
                r.closePath();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   834
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   835
            r.pathDone();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   836
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   837
            if (r.endRendering()) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   838
                ptg = rdrCtx.ptg.init();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   839
                ptg.getBbox(bbox);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   840
                // note: do not returnRendererContext(rdrCtx)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   841
                // as it will be called later by MarlinTileGenerator.dispose()
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   842
                r = null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   843
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   844
        } finally {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   845
            if (r != null) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   846
                // dispose renderer:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   847
                r.dispose();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   848
                // recycle the RendererContext instance
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   849
                MarlinRenderingEngine.returnRendererContext(rdrCtx);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   850
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   851
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   852
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   853
        // Return null to cancel AA tile generation (nothing to render)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   854
        return ptg;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   855
    }
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
     * Returns the minimum pen width that the antialiasing rasterizer
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   859
     * can represent without dropouts occuring.
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   860
     * @since 1.7
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   861
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   862
    @Override
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   863
    public float getMinimumAAPenSize() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   864
        return MIN_PEN_SIZE;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   865
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   866
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   867
    static {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   868
        if (PathIterator.WIND_NON_ZERO != Renderer.WIND_NON_ZERO ||
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   869
            PathIterator.WIND_EVEN_ODD != Renderer.WIND_EVEN_ODD ||
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   870
            BasicStroke.JOIN_MITER != Stroker.JOIN_MITER ||
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   871
            BasicStroke.JOIN_ROUND != Stroker.JOIN_ROUND ||
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   872
            BasicStroke.JOIN_BEVEL != Stroker.JOIN_BEVEL ||
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   873
            BasicStroke.CAP_BUTT != Stroker.CAP_BUTT ||
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   874
            BasicStroke.CAP_ROUND != Stroker.CAP_ROUND ||
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   875
            BasicStroke.CAP_SQUARE != Stroker.CAP_SQUARE)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   876
        {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   877
            throw new InternalError("mismatched renderer constants");
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   878
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   879
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   880
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   881
    // --- RendererContext handling ---
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   882
    // use ThreadLocal or ConcurrentLinkedQueue to get one RendererContext
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   883
    private static final boolean useThreadLocal;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   884
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   885
    // hard reference
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   886
    static final int REF_HARD = 0;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   887
    // soft reference
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   888
    static final int REF_SOFT = 1;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   889
    // weak reference
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   890
    static final int REF_WEAK = 2;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   891
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   892
    // reference type stored in either TL or CLQ
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   893
    static final int REF_TYPE;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   894
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   895
    // Per-thread RendererContext
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   896
    private static final ThreadLocal<Object> rdrCtxThreadLocal;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   897
    // RendererContext queue when ThreadLocal is disabled
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   898
    private static final ConcurrentLinkedQueue<Object> rdrCtxQueue;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   899
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   900
    // Static initializer to use TL or CLQ mode
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   901
    static {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   902
        // CLQ mode by default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   903
        useThreadLocal = MarlinProperties.isUseThreadLocal();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   904
        rdrCtxThreadLocal = (useThreadLocal) ? new ThreadLocal<Object>()
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   905
                                             : null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   906
        rdrCtxQueue = (!useThreadLocal) ? new ConcurrentLinkedQueue<Object>()
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   907
                                        : null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   908
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   909
        // Soft reference by default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   910
        String refType = AccessController.doPrivileged(
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   911
                            new GetPropertyAction("sun.java2d.renderer.useRef",
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   912
                            "soft"));
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   913
        switch (refType) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   914
            default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   915
            case "soft":
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   916
                REF_TYPE = REF_SOFT;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   917
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   918
            case "weak":
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   919
                REF_TYPE = REF_WEAK;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   920
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   921
            case "hard":
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   922
                REF_TYPE = REF_HARD;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   923
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   924
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   925
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   926
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   927
    private static boolean settingsLogged = !enableLogs;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   928
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   929
    private static void logSettings(final String reClass) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   930
        // log information at startup
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   931
        if (settingsLogged) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   932
            return;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   933
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   934
        settingsLogged = true;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   935
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   936
        String refType;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   937
        switch (REF_TYPE) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   938
            default:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   939
            case REF_HARD:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   940
                refType = "hard";
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   941
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   942
            case REF_SOFT:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   943
                refType = "soft";
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   944
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   945
            case REF_WEAK:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   946
                refType = "weak";
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   947
                break;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   948
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   949
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   950
        logInfo("=========================================================="
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   951
                + "=====================");
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   952
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   953
        logInfo("Marlin software rasterizer           = ENABLED");
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   954
        logInfo("Version                              = ["
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   955
                + Version.getVersion() + "]");
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   956
        logInfo("sun.java2d.renderer                  = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   957
                + reClass);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   958
        logInfo("sun.java2d.renderer.useThreadLocal   = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   959
                + useThreadLocal);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   960
        logInfo("sun.java2d.renderer.useRef           = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   961
                + refType);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   962
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   963
        logInfo("sun.java2d.renderer.pixelsize        = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   964
                + MarlinConst.INITIAL_PIXEL_DIM);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   965
        logInfo("sun.java2d.renderer.subPixel_log2_X  = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   966
                + MarlinConst.SUBPIXEL_LG_POSITIONS_X);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   967
        logInfo("sun.java2d.renderer.subPixel_log2_Y  = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   968
                + MarlinConst.SUBPIXEL_LG_POSITIONS_Y);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   969
        logInfo("sun.java2d.renderer.tileSize_log2    = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   970
                + MarlinConst.TILE_SIZE_LG);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   971
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   972
        logInfo("sun.java2d.renderer.blockSize_log2   = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   973
                + MarlinConst.BLOCK_SIZE_LG);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   974
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   975
        logInfo("sun.java2d.renderer.blockSize_log2   = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   976
                + MarlinConst.BLOCK_SIZE_LG);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   977
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   978
        // RLE / blockFlags settings
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   979
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   980
        logInfo("sun.java2d.renderer.forceRLE         = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   981
                + MarlinProperties.isForceRLE());
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   982
        logInfo("sun.java2d.renderer.forceNoRLE       = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   983
                + MarlinProperties.isForceNoRLE());
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   984
        logInfo("sun.java2d.renderer.useTileFlags     = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   985
                + MarlinProperties.isUseTileFlags());
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   986
        logInfo("sun.java2d.renderer.useTileFlags.useHeuristics = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   987
                + MarlinProperties.isUseTileFlagsWithHeuristics());
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   988
        logInfo("sun.java2d.renderer.rleMinWidth      = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   989
                + MarlinCache.RLE_MIN_WIDTH);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   990
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   991
        // optimisation parameters
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   992
        logInfo("sun.java2d.renderer.useSimplifier    = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   993
                + MarlinConst.useSimplifier);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   994
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   995
        // debugging parameters
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   996
        logInfo("sun.java2d.renderer.doStats          = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   997
                + MarlinConst.doStats);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   998
        logInfo("sun.java2d.renderer.doMonitors       = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
   999
                + MarlinConst.doMonitors);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1000
        logInfo("sun.java2d.renderer.doChecks         = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1001
                + MarlinConst.doChecks);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1002
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1003
        // logging parameters
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1004
        logInfo("sun.java2d.renderer.useLogger        = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1005
                + MarlinConst.useLogger);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1006
        logInfo("sun.java2d.renderer.logCreateContext = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1007
                + MarlinConst.logCreateContext);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1008
        logInfo("sun.java2d.renderer.logUnsafeMalloc  = "
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1009
                + MarlinConst.logUnsafeMalloc);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1010
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1011
        // quality settings
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1012
        logInfo("Renderer settings:");
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1013
        logInfo("CUB_COUNT_LG = " + Renderer.CUB_COUNT_LG);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1014
        logInfo("CUB_DEC_BND  = " + Renderer.CUB_DEC_BND);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1015
        logInfo("CUB_INC_BND  = " + Renderer.CUB_INC_BND);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1016
        logInfo("QUAD_DEC_BND = " + Renderer.QUAD_DEC_BND);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1017
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1018
        logInfo("=========================================================="
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1019
                + "=====================");
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1020
    }
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
     * Get the RendererContext instance dedicated to the current thread
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1024
     * @return RendererContext instance
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1025
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1026
    @SuppressWarnings({"unchecked"})
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1027
    static RendererContext getRendererContext() {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1028
        RendererContext rdrCtx = null;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1029
        final Object ref = (useThreadLocal) ? rdrCtxThreadLocal.get()
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1030
                           : rdrCtxQueue.poll();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1031
        if (ref != null) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1032
            // resolve reference:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1033
            rdrCtx = (REF_TYPE == REF_HARD) ? ((RendererContext) ref)
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1034
                     : ((Reference<RendererContext>) ref).get();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1035
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1036
        // create a new RendererContext if none is available
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1037
        if (rdrCtx == null) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1038
            rdrCtx = RendererContext.createContext();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1039
            if (useThreadLocal) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1040
                // update thread local reference:
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1041
                rdrCtxThreadLocal.set(rdrCtx.reference);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1042
            }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1043
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1044
        if (doMonitors) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1045
            RendererContext.stats.mon_pre_getAATileGenerator.start();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1046
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1047
        return rdrCtx;
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1048
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1049
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1050
    /**
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1051
     * Reset and return the given RendererContext instance for reuse
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1052
     * @param rdrCtx RendererContext instance
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1053
     */
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1054
    static void returnRendererContext(final RendererContext rdrCtx) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1055
        rdrCtx.dispose();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1056
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1057
        if (doMonitors) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1058
            RendererContext.stats.mon_pre_getAATileGenerator.stop();
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1059
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1060
        if (!useThreadLocal) {
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1061
            rdrCtxQueue.offer(rdrCtx.reference);
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1062
        }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1063
    }
57a3863abbb4 8076529: Marlin antialiasing renderer integration
flar
parents:
diff changeset
  1064
}