src/java.desktop/share/classes/sun/java2d/marlin/DMarlinRenderingEngine.java
author lbourges
Tue, 10 Sep 2019 21:20:51 +0200
changeset 58321 7f55aad34ac4
parent 51933 4ec74929fbfe
permissions -rw-r--r--
8230728: Thin stroked shapes are not rendered if affine transform has flip bit Summary: use abs(at.getDeterminant()) in userSpaceLineWidth() to ensure positive value Reviewed-by: prr, jdv
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
     1
/*
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
     2
 * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
     4
 *
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    10
 *
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    15
 * accompanied this code).
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    16
 *
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    20
 *
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    23
 * questions.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    24
 */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    25
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    26
package sun.java2d.marlin;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    27
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    28
import java.awt.BasicStroke;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    29
import java.awt.Shape;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    30
import java.awt.geom.AffineTransform;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    31
import java.awt.geom.Path2D;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    32
import java.awt.geom.PathIterator;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    33
import java.security.AccessController;
51933
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
    34
import java.util.Arrays;
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    35
import sun.awt.geom.PathConsumer2D;
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    36
import static sun.java2d.marlin.MarlinUtils.logInfo;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    37
import sun.java2d.ReentrantContextProvider;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    38
import sun.java2d.ReentrantContextProviderCLQ;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    39
import sun.java2d.ReentrantContextProviderTL;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    40
import sun.java2d.pipe.AATileGenerator;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    41
import sun.java2d.pipe.Region;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    42
import sun.java2d.pipe.RenderingEngine;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    43
import sun.security.action.GetPropertyAction;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    44
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    45
/**
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    46
 * Marlin RendererEngine implementation (derived from Pisces)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    47
 */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    48
public final class DMarlinRenderingEngine extends RenderingEngine
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    49
                                          implements MarlinConst
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    50
{
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    51
    // slightly slower ~2% if enabled stroker clipping (lines) but skipping cap / join handling is few percents faster in specific cases
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    52
    static final boolean DISABLE_2ND_STROKER_CLIPPING = true;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    53
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    54
    static final boolean DO_TRACE_PATH = false;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    55
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    56
    static final boolean DO_CLIP = MarlinProperties.isDoClip();
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    57
    static final boolean DO_CLIP_FILL = true;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    58
    static final boolean DO_CLIP_RUNTIME_ENABLE = MarlinProperties.isDoClipRuntimeFlag();
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    59
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    60
    private static final float MIN_PEN_SIZE = 1.0f / MIN_SUBPIXELS;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    61
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    62
    static final double UPPER_BND = Float.MAX_VALUE / 2.0d;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    63
    static final double LOWER_BND = -UPPER_BND;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    64
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
    65
    private enum NormMode {
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    66
        ON_WITH_AA {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    67
            @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    68
            PathIterator getNormalizingPathIterator(final DRendererContext rdrCtx,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    69
                                                    final PathIterator src)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    70
            {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    71
                // NormalizingPathIterator NearestPixelCenter:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    72
                return rdrCtx.nPCPathIterator.init(src);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    73
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    74
        },
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    75
        ON_NO_AA{
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    76
            @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    77
            PathIterator getNormalizingPathIterator(final DRendererContext rdrCtx,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    78
                                                    final PathIterator src)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    79
            {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    80
                // NearestPixel NormalizingPathIterator:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    81
                return rdrCtx.nPQPathIterator.init(src);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    82
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    83
        },
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    84
        OFF{
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    85
            @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    86
            PathIterator getNormalizingPathIterator(final DRendererContext rdrCtx,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    87
                                                    final PathIterator src)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    88
            {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    89
                // return original path iterator if normalization is disabled:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    90
                return src;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    91
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    92
        };
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    93
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    94
        abstract PathIterator getNormalizingPathIterator(DRendererContext rdrCtx,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    95
                                                         PathIterator src);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    96
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    97
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    98
    /**
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
    99
     * Public constructor
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   100
     */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   101
    public DMarlinRenderingEngine() {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   102
        super();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   103
        logSettings(DMarlinRenderingEngine.class.getName());
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   104
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   105
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   106
    /**
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   107
     * Create a widened path as specified by the parameters.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   108
     * <p>
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   109
     * The specified {@code src} {@link Shape} is widened according
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   110
     * to the specified attribute parameters as per the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   111
     * {@link BasicStroke} specification.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   112
     *
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   113
     * @param src the source path to be widened
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   114
     * @param width the width of the widened path as per {@code BasicStroke}
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   115
     * @param caps the end cap decorations as per {@code BasicStroke}
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   116
     * @param join the segment join decorations as per {@code BasicStroke}
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   117
     * @param miterlimit the miter limit as per {@code BasicStroke}
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   118
     * @param dashes the dash length array as per {@code BasicStroke}
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   119
     * @param dashphase the initial dash phase as per {@code BasicStroke}
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   120
     * @return the widened path stored in a new {@code Shape} object
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   121
     * @since 1.7
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   122
     */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   123
    @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   124
    public Shape createStrokedShape(Shape src,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   125
                                    float width,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   126
                                    int caps,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   127
                                    int join,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   128
                                    float miterlimit,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   129
                                    float[] dashes,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   130
                                    float dashphase)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   131
    {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   132
        final DRendererContext rdrCtx = getRendererContext();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   133
        try {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   134
            // initialize a large copyable Path2D to avoid a lot of array growing:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   135
            final Path2D.Double p2d = rdrCtx.getPath2D();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   136
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   137
            strokeTo(rdrCtx,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   138
                     src,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   139
                     null,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   140
                     width,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   141
                     NormMode.OFF,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   142
                     caps,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   143
                     join,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   144
                     miterlimit,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   145
                     dashes,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   146
                     dashphase,
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   147
                     rdrCtx.transformerPC2D.wrapPath2D(p2d)
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   148
                    );
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   149
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   150
            // Use Path2D copy constructor (trim)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   151
            return new Path2D.Double(p2d);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   152
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   153
        } finally {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   154
            // recycle the DRendererContext instance
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   155
            returnRendererContext(rdrCtx);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   156
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   157
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   158
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   159
    /**
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   160
     * Sends the geometry for a widened path as specified by the parameters
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   161
     * to the specified consumer.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   162
     * <p>
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   163
     * The specified {@code src} {@link Shape} is widened according
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   164
     * to the parameters specified by the {@link BasicStroke} object.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   165
     * Adjustments are made to the path as appropriate for the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   166
     * {@link java.awt.RenderingHints#VALUE_STROKE_NORMALIZE} hint if the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   167
     * {@code normalize} boolean parameter is true.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   168
     * Adjustments are made to the path as appropriate for the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   169
     * {@link java.awt.RenderingHints#VALUE_ANTIALIAS_ON} hint if the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   170
     * {@code antialias} boolean parameter is true.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   171
     * <p>
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   172
     * The geometry of the widened path is forwarded to the indicated
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   173
     * {@link DPathConsumer2D} object as it is calculated.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   174
     *
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   175
     * @param src the source path to be widened
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   176
     * @param bs the {@code BasicSroke} object specifying the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   177
     *           decorations to be applied to the widened path
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   178
     * @param normalize indicates whether stroke normalization should
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   179
     *                  be applied
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   180
     * @param antialias indicates whether or not adjustments appropriate
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   181
     *                  to antialiased rendering should be applied
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   182
     * @param consumer the {@code DPathConsumer2D} instance to forward
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   183
     *                 the widened geometry to
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   184
     * @since 1.7
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   185
     */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   186
    @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   187
    public void strokeTo(Shape src,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   188
                         AffineTransform at,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   189
                         BasicStroke bs,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   190
                         boolean thin,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   191
                         boolean normalize,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   192
                         boolean antialias,
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   193
                         final PathConsumer2D consumer)
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   194
    {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   195
        final NormMode norm = (normalize) ?
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   196
                ((antialias) ? NormMode.ON_WITH_AA : NormMode.ON_NO_AA)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   197
                : NormMode.OFF;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   198
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   199
        final DRendererContext rdrCtx = getRendererContext();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   200
        try {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   201
            strokeTo(rdrCtx, src, at, bs, thin, norm, antialias,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   202
                     rdrCtx.p2dAdapter.init(consumer));
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   203
        } finally {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   204
            // recycle the DRendererContext instance
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   205
            returnRendererContext(rdrCtx);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   206
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   207
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   208
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   209
    void strokeTo(final DRendererContext rdrCtx,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   210
                  Shape src,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   211
                  AffineTransform at,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   212
                  BasicStroke bs,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   213
                  boolean thin,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   214
                  NormMode normalize,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   215
                  boolean antialias,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   216
                  DPathConsumer2D pc2d)
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   217
    {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   218
        double lw;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   219
        if (thin) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   220
            if (antialias) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   221
                lw = userSpaceLineWidth(at, MIN_PEN_SIZE);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   222
            } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   223
                lw = userSpaceLineWidth(at, 1.0d);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   224
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   225
        } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   226
            lw = bs.getLineWidth();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   227
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   228
        strokeTo(rdrCtx,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   229
                 src,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   230
                 at,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   231
                 lw,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   232
                 normalize,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   233
                 bs.getEndCap(),
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   234
                 bs.getLineJoin(),
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   235
                 bs.getMiterLimit(),
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   236
                 bs.getDashArray(),
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   237
                 bs.getDashPhase(),
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   238
                 pc2d);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   239
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   240
47971
75686e8da573 8190228: Remove redundant modifiers in java.desktop module.
ssadetsky
parents: 47216
diff changeset
   241
    private double userSpaceLineWidth(AffineTransform at, double lw) {
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   242
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   243
        double widthScale;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   244
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   245
        if (at == null) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   246
            widthScale = 1.0d;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   247
        } else if ((at.getType() & (AffineTransform.TYPE_GENERAL_TRANSFORM  |
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   248
                                    AffineTransform.TYPE_GENERAL_SCALE)) != 0) {
58321
7f55aad34ac4 8230728: Thin stroked shapes are not rendered if affine transform has flip bit
lbourges
parents: 51933
diff changeset
   249
            // Determinant may be negative (flip), use its absolute value:
7f55aad34ac4 8230728: Thin stroked shapes are not rendered if affine transform has flip bit
lbourges
parents: 51933
diff changeset
   250
            widthScale = Math.sqrt(Math.abs(at.getDeterminant()));
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   251
        } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   252
            // First calculate the "maximum scale" of this transform.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   253
            double A = at.getScaleX();       // m00
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   254
            double C = at.getShearX();       // m01
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   255
            double B = at.getShearY();       // m10
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   256
            double D = at.getScaleY();       // m11
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   257
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   258
            /*
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   259
             * Given a 2 x 2 affine matrix [ A B ] such that
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   260
             *                             [ C D ]
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   261
             * v' = [x' y'] = [Ax + Cy, Bx + Dy], we want to
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   262
             * find the maximum magnitude (norm) of the vector v'
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   263
             * with the constraint (x^2 + y^2 = 1).
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   264
             * The equation to maximize is
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   265
             *     |v'| = sqrt((Ax+Cy)^2+(Bx+Dy)^2)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   266
             * or  |v'| = sqrt((AA+BB)x^2 + 2(AC+BD)xy + (CC+DD)y^2).
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   267
             * Since sqrt is monotonic we can maximize |v'|^2
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   268
             * instead and plug in the substitution y = sqrt(1 - x^2).
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   269
             * Trigonometric equalities can then be used to get
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   270
             * rid of most of the sqrt terms.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   271
             */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   272
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   273
            double EA = A*A + B*B;          // x^2 coefficient
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   274
            double EB = 2.0d * (A*C + B*D); // xy coefficient
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   275
            double EC = C*C + D*D;          // y^2 coefficient
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   276
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   277
            /*
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   278
             * There is a lot of calculus omitted here.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   279
             *
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   280
             * Conceptually, in the interests of understanding the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   281
             * terms that the calculus produced we can consider
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   282
             * that EA and EC end up providing the lengths along
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   283
             * the major axes and the hypot term ends up being an
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   284
             * adjustment for the additional length along the off-axis
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   285
             * angle of rotated or sheared ellipses as well as an
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   286
             * adjustment for the fact that the equation below
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   287
             * averages the two major axis lengths.  (Notice that
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   288
             * the hypot term contains a part which resolves to the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   289
             * difference of these two axis lengths in the absence
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   290
             * of rotation.)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   291
             *
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   292
             * In the calculus, the ratio of the EB and (EA-EC) terms
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   293
             * ends up being the tangent of 2*theta where theta is
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   294
             * the angle that the long axis of the ellipse makes
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   295
             * with the horizontal axis.  Thus, this equation is
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   296
             * calculating the length of the hypotenuse of a triangle
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   297
             * along that axis.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   298
             */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   299
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   300
            double hypot = Math.sqrt(EB*EB + (EA-EC)*(EA-EC));
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   301
            // sqrt omitted, compare to squared limits below.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   302
            double widthsquared = ((EA + EC + hypot) / 2.0d);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   303
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   304
            widthScale = Math.sqrt(widthsquared);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   305
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   306
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   307
        return (lw / widthScale);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   308
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   309
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   310
    void strokeTo(final DRendererContext rdrCtx,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   311
                  Shape src,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   312
                  AffineTransform at,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   313
                  double width,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   314
                  NormMode norm,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   315
                  int caps,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   316
                  int join,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   317
                  float miterlimit,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   318
                  float[] dashes,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   319
                  float dashphase,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   320
                  DPathConsumer2D pc2d)
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   321
    {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   322
        // We use strokerat so that in Stroker and Dasher we can work only
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   323
        // with the pre-transformation coordinates. This will repeat a lot of
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   324
        // computations done in the path iterator, but the alternative is to
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   325
        // work with transformed paths and compute untransformed coordinates
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   326
        // as needed. This would be faster but I do not think the complexity
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   327
        // of working with both untransformed and transformed coordinates in
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   328
        // the same code is worth it.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   329
        // However, if a path's width is constant after a transformation,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   330
        // we can skip all this untransforming.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   331
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   332
        // As pathTo() will check transformed coordinates for invalid values
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   333
        // (NaN / Infinity) to ignore such points, it is necessary to apply the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   334
        // transformation before the path processing.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   335
        AffineTransform strokerat = null;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   336
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   337
        int dashLen = -1;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   338
        boolean recycleDashes = false;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   339
        double[] dashesD = null;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   340
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   341
        // Ensure converting dashes to double precision:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   342
        if (dashes != null) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   343
            recycleDashes = true;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   344
            dashLen = dashes.length;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   345
            dashesD = rdrCtx.dasher.copyDashArray(dashes);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   346
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   347
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   348
        if (at != null && !at.isIdentity()) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   349
            final double a = at.getScaleX();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   350
            final double b = at.getShearX();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   351
            final double c = at.getShearY();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   352
            final double d = at.getScaleY();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   353
            final double det = a * d - c * b;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   354
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   355
            if (Math.abs(det) <= (2.0d * Double.MIN_VALUE)) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   356
                // this rendering engine takes one dimensional curves and turns
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   357
                // them into 2D shapes by giving them width.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   358
                // However, if everything is to be passed through a singular
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   359
                // transformation, these 2D shapes will be squashed down to 1D
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   360
                // again so, nothing can be drawn.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   361
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   362
                // Every path needs an initial moveTo and a pathDone. If these
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   363
                // are not there this causes a SIGSEGV in libawt.so (at the time
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   364
                // of writing of this comment (September 16, 2010)). Actually,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   365
                // I am not sure if the moveTo is necessary to avoid the SIGSEGV
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   366
                // but the pathDone is definitely needed.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   367
                pc2d.moveTo(0.0d, 0.0d);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   368
                pc2d.pathDone();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   369
                return;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   370
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   371
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   372
            // If the transform is a constant multiple of an orthogonal transformation
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   373
            // then every length is just multiplied by a constant, so we just
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   374
            // need to transform input paths to stroker and tell stroker
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   375
            // the scaled width. This condition is satisfied if
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   376
            // a*b == -c*d && a*a+c*c == b*b+d*d. In the actual check below, we
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   377
            // leave a bit of room for error.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   378
            if (nearZero(a*b + c*d) && nearZero(a*a + c*c - (b*b + d*d))) {
51933
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   379
                final double scale = Math.sqrt(a*a + c*c);
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   380
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   381
                if (dashesD != null) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   382
                    for (int i = 0; i < dashLen; i++) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   383
                        dashesD[i] *= scale;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   384
                    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   385
                    dashphase *= scale;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   386
                }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   387
                width *= scale;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   388
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   389
                // by now strokerat == null. Input paths to
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   390
                // stroker (and maybe dasher) will have the full transform at
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   391
                // applied to them and nothing will happen to the output paths.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   392
            } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   393
                strokerat = at;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   394
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   395
                // by now strokerat == at. Input paths to
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   396
                // stroker (and maybe dasher) will have the full transform at
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   397
                // applied to them, then they will be normalized, and then
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   398
                // the inverse of *only the non translation part of at* will
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   399
                // be applied to the normalized paths. This won't cause problems
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   400
                // in stroker, because, suppose at = T*A, where T is just the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   401
                // translation part of at, and A is the rest. T*A has already
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   402
                // been applied to Stroker/Dasher's input. Then Ainv will be
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   403
                // applied. Ainv*T*A is not equal to T, but it is a translation,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   404
                // which means that none of stroker's assumptions about its
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   405
                // input will be violated. After all this, A will be applied
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   406
                // to stroker's output.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   407
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   408
        } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   409
            // either at is null or it's the identity. In either case
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   410
            // we don't transform the path.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   411
            at = null;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   412
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   413
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   414
        final DTransformingPathConsumer2D transformerPC2D = rdrCtx.transformerPC2D;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   415
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   416
        if (DO_TRACE_PATH) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   417
            // trace Stroker:
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   418
            pc2d = transformerPC2D.traceStroker(pc2d);
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   419
        }
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   420
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   421
        if (USE_SIMPLIFIER) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   422
            // Use simplifier after stroker before Renderer
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   423
            // to remove collinear segments (notably due to cap square)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   424
            pc2d = rdrCtx.simplifier.init(pc2d);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   425
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   426
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   427
        // deltaTransformConsumer may adjust the clip rectangle:
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   428
        pc2d = transformerPC2D.deltaTransformConsumer(pc2d, strokerat);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   429
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   430
        // stroker will adjust the clip rectangle (width / miter limit):
51933
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   431
        pc2d = rdrCtx.stroker.init(pc2d, width, caps, join, miterlimit,
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   432
                (dashesD == null));
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   433
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   434
        // Curve Monotizer:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   435
        rdrCtx.monotonizer.init(width);
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   436
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   437
        if (dashesD != null) {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   438
            if (DO_TRACE_PATH) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   439
                pc2d = transformerPC2D.traceDasher(pc2d);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   440
            }
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   441
            pc2d = rdrCtx.dasher.init(pc2d, dashesD, dashLen, dashphase,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   442
                                      recycleDashes);
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   443
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   444
            if (DISABLE_2ND_STROKER_CLIPPING) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   445
                // disable stoker clipping:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   446
                rdrCtx.stroker.disableClipping();
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   447
            }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   448
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   449
        } else if (rdrCtx.doClip && (caps != Stroker.CAP_BUTT)) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   450
            if (DO_TRACE_PATH) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   451
                pc2d = transformerPC2D.traceClosedPathDetector(pc2d);
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   452
            }
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   453
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   454
            // If no dash and clip is enabled:
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   455
            // detect closedPaths (polygons) for caps
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   456
            pc2d = transformerPC2D.detectClosedPath(pc2d);
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   457
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   458
        pc2d = transformerPC2D.inverseDeltaTransformConsumer(pc2d, strokerat);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   459
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   460
        if (DO_TRACE_PATH) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   461
            // trace Input:
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   462
            pc2d = transformerPC2D.traceInput(pc2d);
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   463
        }
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   464
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   465
        final PathIterator pi = norm.getNormalizingPathIterator(rdrCtx,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   466
                                         src.getPathIterator(at));
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   467
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   468
        pathTo(rdrCtx, pi, pc2d);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   469
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   470
        /*
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   471
         * Pipeline seems to be:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   472
         * shape.getPathIterator(at)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   473
         * -> (NormalizingPathIterator)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   474
         * -> (inverseDeltaTransformConsumer)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   475
         * -> (Dasher)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   476
         * -> Stroker
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   477
         * -> (deltaTransformConsumer)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   478
         *
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   479
         * -> (CollinearSimplifier) to remove redundant segments
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   480
         *
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   481
         * -> pc2d = Renderer (bounding box)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   482
         */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   483
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   484
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   485
    private static boolean nearZero(final double num) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   486
        return Math.abs(num) < 2.0d * Math.ulp(num);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   487
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   488
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   489
    abstract static class NormalizingPathIterator implements PathIterator {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   490
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   491
        private PathIterator src;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   492
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   493
        // the adjustment applied to the current position.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   494
        private double curx_adjust, cury_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   495
        // the adjustment applied to the last moveTo position.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   496
        private double movx_adjust, movy_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   497
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   498
        private final double[] tmp;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   499
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   500
        NormalizingPathIterator(final double[] tmp) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   501
            this.tmp = tmp;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   502
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   503
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   504
        final NormalizingPathIterator init(final PathIterator src) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   505
            this.src = src;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   506
            return this; // fluent API
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   507
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   508
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   509
        /**
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   510
         * Disposes this path iterator:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   511
         * clean up before reusing this instance
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   512
         */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   513
        final void dispose() {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   514
            // free source PathIterator:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   515
            this.src = null;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   516
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   517
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   518
        @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   519
        public final int currentSegment(final double[] coords) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   520
            int lastCoord;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   521
            final int type = src.currentSegment(coords);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   522
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   523
            switch(type) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   524
                case PathIterator.SEG_MOVETO:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   525
                case PathIterator.SEG_LINETO:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   526
                    lastCoord = 0;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   527
                    break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   528
                case PathIterator.SEG_QUADTO:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   529
                    lastCoord = 2;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   530
                    break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   531
                case PathIterator.SEG_CUBICTO:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   532
                    lastCoord = 4;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   533
                    break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   534
                case PathIterator.SEG_CLOSE:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   535
                    // we don't want to deal with this case later. We just exit now
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   536
                    curx_adjust = movx_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   537
                    cury_adjust = movy_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   538
                    return type;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   539
                default:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   540
                    throw new InternalError("Unrecognized curve type");
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   541
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   542
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   543
            // normalize endpoint
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   544
            double coord, x_adjust, y_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   545
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   546
            coord = coords[lastCoord];
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   547
            x_adjust = normCoord(coord); // new coord
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   548
            coords[lastCoord] = x_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   549
            x_adjust -= coord;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   550
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   551
            coord = coords[lastCoord + 1];
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   552
            y_adjust = normCoord(coord); // new coord
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   553
            coords[lastCoord + 1] = y_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   554
            y_adjust -= coord;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   555
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   556
            // now that the end points are done, normalize the control points
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   557
            switch(type) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   558
                case PathIterator.SEG_MOVETO:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   559
                    movx_adjust = x_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   560
                    movy_adjust = y_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   561
                    break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   562
                case PathIterator.SEG_LINETO:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   563
                    break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   564
                case PathIterator.SEG_QUADTO:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   565
                    coords[0] += (curx_adjust + x_adjust) / 2.0d;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   566
                    coords[1] += (cury_adjust + y_adjust) / 2.0d;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   567
                    break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   568
                case PathIterator.SEG_CUBICTO:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   569
                    coords[0] += curx_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   570
                    coords[1] += cury_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   571
                    coords[2] += x_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   572
                    coords[3] += y_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   573
                    break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   574
                case PathIterator.SEG_CLOSE:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   575
                    // handled earlier
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   576
                default:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   577
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   578
            curx_adjust = x_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   579
            cury_adjust = y_adjust;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   580
            return type;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   581
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   582
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   583
        abstract double normCoord(final double coord);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   584
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   585
        @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   586
        public final int currentSegment(final float[] coords) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   587
            final double[] _tmp = tmp; // dirty
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   588
            int type = this.currentSegment(_tmp);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   589
            for (int i = 0; i < 6; i++) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   590
                coords[i] = (float)_tmp[i];
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   591
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   592
            return type;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   593
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   594
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   595
        @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   596
        public final int getWindingRule() {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   597
            return src.getWindingRule();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   598
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   599
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   600
        @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   601
        public final boolean isDone() {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   602
            if (src.isDone()) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   603
                // Dispose this instance:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   604
                dispose();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   605
                return true;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   606
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   607
            return false;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   608
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   609
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   610
        @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   611
        public final void next() {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   612
            src.next();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   613
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   614
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   615
        static final class NearestPixelCenter
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   616
                                extends NormalizingPathIterator
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   617
        {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   618
            NearestPixelCenter(final double[] tmp) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   619
                super(tmp);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   620
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   621
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   622
            @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   623
            double normCoord(final double coord) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   624
                // round to nearest pixel center
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   625
                return Math.floor(coord) + 0.5d;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   626
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   627
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   628
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   629
        static final class NearestPixelQuarter
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   630
                                extends NormalizingPathIterator
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   631
        {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   632
            NearestPixelQuarter(final double[] tmp) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   633
                super(tmp);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   634
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   635
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   636
            @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   637
            double normCoord(final double coord) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   638
                // round to nearest (0.25, 0.25) pixel quarter
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   639
                return Math.floor(coord + 0.25d) + 0.25d;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   640
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   641
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   642
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   643
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   644
    private static void pathTo(final DRendererContext rdrCtx, final PathIterator pi,
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   645
                               DPathConsumer2D pc2d)
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   646
    {
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   647
        if (USE_PATH_SIMPLIFIER) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   648
            // Use path simplifier at the first step
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   649
            // to remove useless points
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   650
            pc2d = rdrCtx.pathSimplifier.init(pc2d);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   651
        }
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
   652
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   653
        // mark context as DIRTY:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   654
        rdrCtx.dirty = true;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   655
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   656
        pathToLoop(rdrCtx.double6, pi, pc2d);
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   657
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   658
        // mark context as CLEAN:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   659
        rdrCtx.dirty = false;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   660
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   661
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   662
    private static void pathToLoop(final double[] coords, final PathIterator pi,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   663
                                   final DPathConsumer2D pc2d)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   664
    {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   665
        // ported from DuctusRenderingEngine.feedConsumer() but simplified:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   666
        // - removed skip flag = !subpathStarted
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   667
        // - removed pathClosed (ie subpathStarted not set to false)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   668
        boolean subpathStarted = false;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   669
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   670
        for (; !pi.isDone(); pi.next()) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   671
            switch (pi.currentSegment(coords)) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   672
            case PathIterator.SEG_MOVETO:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   673
                /* Checking SEG_MOVETO coordinates if they are out of the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   674
                 * [LOWER_BND, UPPER_BND] range. This check also handles NaN
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   675
                 * and Infinity values. Skipping next path segment in case of
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   676
                 * invalid data.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   677
                 */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   678
                if (coords[0] < UPPER_BND && coords[0] > LOWER_BND &&
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   679
                    coords[1] < UPPER_BND && coords[1] > LOWER_BND)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   680
                {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   681
                    pc2d.moveTo(coords[0], coords[1]);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   682
                    subpathStarted = true;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   683
                }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   684
                break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   685
            case PathIterator.SEG_LINETO:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   686
                /* Checking SEG_LINETO coordinates if they are out of the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   687
                 * [LOWER_BND, UPPER_BND] range. This check also handles NaN
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   688
                 * and Infinity values. Ignoring current path segment in case
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   689
                 * of invalid data. If segment is skipped its endpoint
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   690
                 * (if valid) is used to begin new subpath.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   691
                 */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   692
                if (coords[0] < UPPER_BND && coords[0] > LOWER_BND &&
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   693
                    coords[1] < UPPER_BND && coords[1] > LOWER_BND)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   694
                {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   695
                    if (subpathStarted) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   696
                        pc2d.lineTo(coords[0], coords[1]);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   697
                    } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   698
                        pc2d.moveTo(coords[0], coords[1]);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   699
                        subpathStarted = true;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   700
                    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   701
                }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   702
                break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   703
            case PathIterator.SEG_QUADTO:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   704
                // Quadratic curves take two points
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   705
                /* Checking SEG_QUADTO coordinates if they are out of the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   706
                 * [LOWER_BND, UPPER_BND] range. This check also handles NaN
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   707
                 * and Infinity values. Ignoring current path segment in case
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   708
                 * of invalid endpoints's data. Equivalent to the SEG_LINETO
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   709
                 * if endpoint coordinates are valid but there are invalid data
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   710
                 * among other coordinates
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   711
                 */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   712
                if (coords[2] < UPPER_BND && coords[2] > LOWER_BND &&
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   713
                    coords[3] < UPPER_BND && coords[3] > LOWER_BND)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   714
                {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   715
                    if (subpathStarted) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   716
                        if (coords[0] < UPPER_BND && coords[0] > LOWER_BND &&
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   717
                            coords[1] < UPPER_BND && coords[1] > LOWER_BND)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   718
                        {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   719
                            pc2d.quadTo(coords[0], coords[1],
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   720
                                        coords[2], coords[3]);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   721
                        } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   722
                            pc2d.lineTo(coords[2], coords[3]);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   723
                        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   724
                    } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   725
                        pc2d.moveTo(coords[2], coords[3]);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   726
                        subpathStarted = true;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   727
                    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   728
                }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   729
                break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   730
            case PathIterator.SEG_CUBICTO:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   731
                // Cubic curves take three points
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   732
                /* Checking SEG_CUBICTO coordinates if they are out of the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   733
                 * [LOWER_BND, UPPER_BND] range. This check also handles NaN
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   734
                 * and Infinity values. Ignoring current path segment in case
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   735
                 * of invalid endpoints's data. Equivalent to the SEG_LINETO
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   736
                 * if endpoint coordinates are valid but there are invalid data
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   737
                 * among other coordinates
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   738
                 */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   739
                if (coords[4] < UPPER_BND && coords[4] > LOWER_BND &&
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   740
                    coords[5] < UPPER_BND && coords[5] > LOWER_BND)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   741
                {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   742
                    if (subpathStarted) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   743
                        if (coords[0] < UPPER_BND && coords[0] > LOWER_BND &&
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   744
                            coords[1] < UPPER_BND && coords[1] > LOWER_BND &&
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   745
                            coords[2] < UPPER_BND && coords[2] > LOWER_BND &&
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   746
                            coords[3] < UPPER_BND && coords[3] > LOWER_BND)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   747
                        {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   748
                            pc2d.curveTo(coords[0], coords[1],
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   749
                                         coords[2], coords[3],
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   750
                                         coords[4], coords[5]);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   751
                        } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   752
                            pc2d.lineTo(coords[4], coords[5]);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   753
                        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   754
                    } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   755
                        pc2d.moveTo(coords[4], coords[5]);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   756
                        subpathStarted = true;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   757
                    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   758
                }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   759
                break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   760
            case PathIterator.SEG_CLOSE:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   761
                if (subpathStarted) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   762
                    pc2d.closePath();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   763
                    // do not set subpathStarted to false
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   764
                    // in case of missing moveTo() after close()
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   765
                }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   766
                break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   767
            default:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   768
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   769
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   770
        pc2d.pathDone();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   771
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   772
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   773
    /**
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   774
     * Construct an antialiased tile generator for the given shape with
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   775
     * the given rendering attributes and store the bounds of the tile
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   776
     * iteration in the bbox parameter.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   777
     * The {@code at} parameter specifies a transform that should affect
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   778
     * both the shape and the {@code BasicStroke} attributes.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   779
     * The {@code clip} parameter specifies the current clip in effect
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   780
     * in device coordinates and can be used to prune the data for the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   781
     * operation, but the renderer is not required to perform any
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   782
     * clipping.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   783
     * If the {@code BasicStroke} parameter is null then the shape
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   784
     * should be filled as is, otherwise the attributes of the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   785
     * {@code BasicStroke} should be used to specify a draw operation.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   786
     * The {@code thin} parameter indicates whether or not the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   787
     * transformed {@code BasicStroke} represents coordinates smaller
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   788
     * than the minimum resolution of the antialiasing rasterizer as
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   789
     * specified by the {@code getMinimumAAPenWidth()} method.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   790
     * <p>
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   791
     * Upon returning, this method will fill the {@code bbox} parameter
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   792
     * with 4 values indicating the bounds of the iteration of the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   793
     * tile generator.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   794
     * The iteration order of the tiles will be as specified by the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   795
     * pseudo-code:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   796
     * <pre>
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   797
     *     for (y = bbox[1]; y < bbox[3]; y += tileheight) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   798
     *         for (x = bbox[0]; x < bbox[2]; x += tilewidth) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   799
     *         }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   800
     *     }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   801
     * </pre>
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   802
     * If there is no output to be rendered, this method may return
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   803
     * null.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   804
     *
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   805
     * @param s the shape to be rendered (fill or draw)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   806
     * @param at the transform to be applied to the shape and the
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   807
     *           stroke attributes
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   808
     * @param clip the current clip in effect in device coordinates
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   809
     * @param bs if non-null, a {@code BasicStroke} whose attributes
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   810
     *           should be applied to this operation
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   811
     * @param thin true if the transformed stroke attributes are smaller
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   812
     *             than the minimum dropout pen width
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   813
     * @param normalize true if the {@code VALUE_STROKE_NORMALIZE}
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   814
     *                  {@code RenderingHint} is in effect
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   815
     * @param bbox returns the bounds of the iteration
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   816
     * @return the {@code AATileGenerator} instance to be consulted
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   817
     *         for tile coverages, or null if there is no output to render
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   818
     * @since 1.7
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   819
     */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   820
    @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   821
    public AATileGenerator getAATileGenerator(Shape s,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   822
                                              AffineTransform at,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   823
                                              Region clip,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   824
                                              BasicStroke bs,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   825
                                              boolean thin,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   826
                                              boolean normalize,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   827
                                              int[] bbox)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   828
    {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   829
        MarlinTileGenerator ptg = null;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   830
        DRenderer r = null;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   831
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   832
        final DRendererContext rdrCtx = getRendererContext();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   833
        try {
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   834
            if (DO_CLIP || (DO_CLIP_RUNTIME_ENABLE && MarlinProperties.isDoClipAtRuntime())) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   835
                // Define the initial clip bounds:
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   836
                final double[] clipRect = rdrCtx.clipRect;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   837
51933
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   838
                // Adjust the clipping rectangle with the renderer offsets
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   839
                final double rdrOffX = DRenderer.RDR_OFFSET_X;
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   840
                final double rdrOffY = DRenderer.RDR_OFFSET_Y;
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   841
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   842
                // add a small rounding error:
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   843
                final double margin = 1e-3d;
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   844
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   845
                clipRect[0] = clip.getLoY()
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   846
                                - margin + rdrOffY;
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   847
                clipRect[1] = clip.getLoY() + clip.getHeight()
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   848
                                + margin + rdrOffY;
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   849
                clipRect[2] = clip.getLoX()
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   850
                                - margin + rdrOffX;
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   851
                clipRect[3] = clip.getLoX() + clip.getWidth()
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   852
                                + margin + rdrOffX;
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   853
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   854
                if (MarlinConst.DO_LOG_CLIP) {
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   855
                    MarlinUtils.logInfo("clipRect (clip): "
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   856
                                        + Arrays.toString(rdrCtx.clipRect));
4ec74929fbfe 8210335: Clipping problems with complex affine transforms: negative scaling factors or small scaling factors
lbourges
parents: 49496
diff changeset
   857
                }
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   858
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   859
                // Enable clipping:
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   860
                rdrCtx.doClip = true;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   861
            }
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   862
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   863
            // Test if at is identity:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   864
            final AffineTransform _at = (at != null && !at.isIdentity()) ? at
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   865
                                        : null;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   866
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   867
            final NormMode norm = (normalize) ? NormMode.ON_WITH_AA : NormMode.OFF;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   868
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   869
            if (bs == null) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   870
                // fill shape:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   871
                final PathIterator pi = norm.getNormalizingPathIterator(rdrCtx,
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   872
                                                 s.getPathIterator(_at));
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   873
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   874
                // note: Winding rule may be EvenOdd ONLY for fill operations !
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   875
                r = rdrCtx.renderer.init(clip.getLoX(), clip.getLoY(),
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   876
                                         clip.getWidth(), clip.getHeight(),
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   877
                                         pi.getWindingRule());
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   878
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   879
                DPathConsumer2D pc2d = r;
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   880
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   881
                if (DO_CLIP_FILL && rdrCtx.doClip) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   882
                    if (DO_TRACE_PATH) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   883
                        // trace Filler:
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   884
                        pc2d = rdrCtx.transformerPC2D.traceFiller(pc2d);
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   885
                    }
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   886
                    pc2d = rdrCtx.transformerPC2D.pathClipper(pc2d);
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   887
                }
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   888
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   889
                if (DO_TRACE_PATH) {
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   890
                    // trace Input:
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   891
                    pc2d = rdrCtx.transformerPC2D.traceInput(pc2d);
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   892
                }
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   893
                pathTo(rdrCtx, pi, pc2d);
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   894
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   895
            } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   896
                // draw shape with given stroke:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   897
                r = rdrCtx.renderer.init(clip.getLoX(), clip.getLoY(),
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   898
                                         clip.getWidth(), clip.getHeight(),
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   899
                                         WIND_NON_ZERO);
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   900
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   901
                strokeTo(rdrCtx, s, _at, bs, thin, norm, true, r);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   902
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   903
            if (r.endRendering()) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   904
                ptg = rdrCtx.ptg.init();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   905
                ptg.getBbox(bbox);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   906
                // note: do not returnRendererContext(rdrCtx)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   907
                // as it will be called later by MarlinTileGenerator.dispose()
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   908
                r = null;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   909
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   910
        } finally {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   911
            if (r != null) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   912
                // dispose renderer and recycle the RendererContext instance:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   913
                r.dispose();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   914
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   915
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   916
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   917
        // Return null to cancel AA tile generation (nothing to render)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   918
        return ptg;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   919
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   920
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   921
    @Override
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   922
    public AATileGenerator getAATileGenerator(double x, double y,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   923
                                              double dx1, double dy1,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   924
                                              double dx2, double dy2,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   925
                                              double lw1, double lw2,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   926
                                              Region clip,
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   927
                                              int[] bbox)
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   928
    {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   929
        // REMIND: Deal with large coordinates!
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   930
        double ldx1, ldy1, ldx2, ldy2;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   931
        boolean innerpgram = (lw1 > 0.0d && lw2 > 0.0d);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   932
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   933
        if (innerpgram) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   934
            ldx1 = dx1 * lw1;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   935
            ldy1 = dy1 * lw1;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   936
            ldx2 = dx2 * lw2;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   937
            ldy2 = dy2 * lw2;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   938
            x -= (ldx1 + ldx2) / 2.0d;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   939
            y -= (ldy1 + ldy2) / 2.0d;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   940
            dx1 += ldx1;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   941
            dy1 += ldy1;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   942
            dx2 += ldx2;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   943
            dy2 += ldy2;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   944
            if (lw1 > 1.0d && lw2 > 1.0d) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   945
                // Inner parallelogram was entirely consumed by stroke...
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   946
                innerpgram = false;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   947
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   948
        } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   949
            ldx1 = ldy1 = ldx2 = ldy2 = 0.0d;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   950
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   951
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   952
        MarlinTileGenerator ptg = null;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   953
        DRenderer r = null;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   954
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   955
        final DRendererContext rdrCtx = getRendererContext();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   956
        try {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   957
            r = rdrCtx.renderer.init(clip.getLoX(), clip.getLoY(),
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   958
                                     clip.getWidth(), clip.getHeight(),
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
   959
                                     WIND_EVEN_ODD);
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   960
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   961
            r.moveTo( x,  y);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   962
            r.lineTo( (x+dx1),  (y+dy1));
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   963
            r.lineTo( (x+dx1+dx2),  (y+dy1+dy2));
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   964
            r.lineTo( (x+dx2),  (y+dy2));
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   965
            r.closePath();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   966
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   967
            if (innerpgram) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   968
                x += ldx1 + ldx2;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   969
                y += ldy1 + ldy2;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   970
                dx1 -= 2.0d * ldx1;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   971
                dy1 -= 2.0d * ldy1;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   972
                dx2 -= 2.0d * ldx2;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   973
                dy2 -= 2.0d * ldy2;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   974
                r.moveTo( x,  y);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   975
                r.lineTo( (x+dx1),  (y+dy1));
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   976
                r.lineTo( (x+dx1+dx2),  (y+dy1+dy2));
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   977
                r.lineTo( (x+dx2),  (y+dy2));
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   978
                r.closePath();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   979
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   980
            r.pathDone();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   981
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   982
            if (r.endRendering()) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   983
                ptg = rdrCtx.ptg.init();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   984
                ptg.getBbox(bbox);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   985
                // note: do not returnRendererContext(rdrCtx)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   986
                // as it will be called later by MarlinTileGenerator.dispose()
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   987
                r = null;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   988
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   989
        } finally {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   990
            if (r != null) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   991
                // dispose renderer and recycle the RendererContext instance:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   992
                r.dispose();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   993
            }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   994
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   995
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   996
        // Return null to cancel AA tile generation (nothing to render)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   997
        return ptg;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   998
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
   999
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1000
    /**
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1001
     * Returns the minimum pen width that the antialiasing rasterizer
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1002
     * can represent without dropouts occuring.
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1003
     * @since 1.7
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1004
     */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1005
    @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1006
    public float getMinimumAAPenSize() {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1007
        return MIN_PEN_SIZE;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1008
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1009
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1010
    static {
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1011
        if (PathIterator.WIND_NON_ZERO != WIND_NON_ZERO ||
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1012
            PathIterator.WIND_EVEN_ODD != WIND_EVEN_ODD ||
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1013
            BasicStroke.JOIN_MITER != JOIN_MITER ||
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1014
            BasicStroke.JOIN_ROUND != JOIN_ROUND ||
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1015
            BasicStroke.JOIN_BEVEL != JOIN_BEVEL ||
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1016
            BasicStroke.CAP_BUTT != CAP_BUTT ||
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1017
            BasicStroke.CAP_ROUND != CAP_ROUND ||
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1018
            BasicStroke.CAP_SQUARE != CAP_SQUARE)
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1019
        {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1020
            throw new InternalError("mismatched renderer constants");
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1021
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1022
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1023
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1024
    // --- DRendererContext handling ---
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1025
    // use ThreadLocal or ConcurrentLinkedQueue to get one DRendererContext
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1026
    private static final boolean USE_THREAD_LOCAL;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1027
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1028
    // reference type stored in either TL or CLQ
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1029
    static final int REF_TYPE;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1030
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1031
    // Per-thread DRendererContext
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1032
    private static final ReentrantContextProvider<DRendererContext> RDR_CTX_PROVIDER;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1033
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1034
    // Static initializer to use TL or CLQ mode
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1035
    static {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1036
        USE_THREAD_LOCAL = MarlinProperties.isUseThreadLocal();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1037
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1038
        // Soft reference by default:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1039
        final String refType = AccessController.doPrivileged(
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1040
                            new GetPropertyAction("sun.java2d.renderer.useRef",
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1041
                            "soft"));
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1042
        switch (refType) {
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1043
            default:
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1044
            case "soft":
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1045
                REF_TYPE = ReentrantContextProvider.REF_SOFT;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1046
                break;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1047
            case "weak":
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1048
                REF_TYPE = ReentrantContextProvider.REF_WEAK;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1049
                break;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1050
            case "hard":
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1051
                REF_TYPE = ReentrantContextProvider.REF_HARD;
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1052
                break;
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1053
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1054
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1055
        if (USE_THREAD_LOCAL) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1056
            RDR_CTX_PROVIDER = new ReentrantContextProviderTL<DRendererContext>(REF_TYPE)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1057
                {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1058
                    @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1059
                    protected DRendererContext newContext() {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1060
                        return DRendererContext.createContext();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1061
                    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1062
                };
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1063
        } else {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1064
            RDR_CTX_PROVIDER = new ReentrantContextProviderCLQ<DRendererContext>(REF_TYPE)
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1065
                {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1066
                    @Override
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1067
                    protected DRendererContext newContext() {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1068
                        return DRendererContext.createContext();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1069
                    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1070
                };
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1071
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1072
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1073
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1074
    private static boolean SETTINGS_LOGGED = !ENABLE_LOGS;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1075
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1076
    private static void logSettings(final String reClass) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1077
        // log information at startup
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1078
        if (SETTINGS_LOGGED) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1079
            return;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1080
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1081
        SETTINGS_LOGGED = true;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1082
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1083
        String refType;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1084
        switch (REF_TYPE) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1085
            default:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1086
            case ReentrantContextProvider.REF_HARD:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1087
                refType = "hard";
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1088
                break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1089
            case ReentrantContextProvider.REF_SOFT:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1090
                refType = "soft";
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1091
                break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1092
            case ReentrantContextProvider.REF_WEAK:
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1093
                refType = "weak";
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1094
                break;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1095
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1096
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1097
        logInfo("=========================================================="
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1098
                + "=====================");
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1099
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1100
        logInfo("Marlin software rasterizer           = ENABLED");
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1101
        logInfo("Version                              = ["
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1102
                + Version.getVersion() + "]");
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1103
        logInfo("sun.java2d.renderer                  = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1104
                + reClass);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1105
        logInfo("sun.java2d.renderer.useThreadLocal   = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1106
                + USE_THREAD_LOCAL);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1107
        logInfo("sun.java2d.renderer.useRef           = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1108
                + refType);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1109
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1110
        logInfo("sun.java2d.renderer.edges            = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1111
                + MarlinConst.INITIAL_EDGES_COUNT);
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1112
        logInfo("sun.java2d.renderer.pixelWidth       = "
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1113
                + MarlinConst.INITIAL_PIXEL_WIDTH);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1114
        logInfo("sun.java2d.renderer.pixelHeight      = "
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1115
                + MarlinConst.INITIAL_PIXEL_HEIGHT);
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1116
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1117
        logInfo("sun.java2d.renderer.subPixel_log2_X  = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1118
                + MarlinConst.SUBPIXEL_LG_POSITIONS_X);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1119
        logInfo("sun.java2d.renderer.subPixel_log2_Y  = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1120
                + MarlinConst.SUBPIXEL_LG_POSITIONS_Y);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1121
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1122
        logInfo("sun.java2d.renderer.tileSize_log2    = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1123
                + MarlinConst.TILE_H_LG);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1124
        logInfo("sun.java2d.renderer.tileWidth_log2   = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1125
                + MarlinConst.TILE_W_LG);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1126
        logInfo("sun.java2d.renderer.blockSize_log2   = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1127
                + MarlinConst.BLOCK_SIZE_LG);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1128
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1129
        // RLE / blockFlags settings
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1130
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1131
        logInfo("sun.java2d.renderer.forceRLE         = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1132
                + MarlinProperties.isForceRLE());
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1133
        logInfo("sun.java2d.renderer.forceNoRLE       = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1134
                + MarlinProperties.isForceNoRLE());
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1135
        logInfo("sun.java2d.renderer.useTileFlags     = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1136
                + MarlinProperties.isUseTileFlags());
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1137
        logInfo("sun.java2d.renderer.useTileFlags.useHeuristics = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1138
                + MarlinProperties.isUseTileFlagsWithHeuristics());
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1139
        logInfo("sun.java2d.renderer.rleMinWidth      = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1140
                + MarlinCache.RLE_MIN_WIDTH);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1141
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1142
        // optimisation parameters
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1143
        logInfo("sun.java2d.renderer.useSimplifier    = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1144
                + MarlinConst.USE_SIMPLIFIER);
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1145
        logInfo("sun.java2d.renderer.usePathSimplifier= "
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1146
                + MarlinConst.USE_PATH_SIMPLIFIER);
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1147
        logInfo("sun.java2d.renderer.pathSimplifier.pixTol = "
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1148
                + MarlinProperties.getPathSimplifierPixelTolerance());
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1149
48284
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1150
        logInfo("sun.java2d.renderer.clip             = "
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1151
                + MarlinProperties.isDoClip());
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1152
        logInfo("sun.java2d.renderer.clip.runtime.enable = "
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1153
                + MarlinProperties.isDoClipRuntimeFlag());
fd7fbc929001 8191814: Marlin rasterizer spends time computing geometry for stroked segments that do not intersect the clip
lbourges
parents: 47971
diff changeset
  1154
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1155
        logInfo("sun.java2d.renderer.clip.subdivider  = "
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1156
                + MarlinProperties.isDoClipSubdivider());
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1157
        logInfo("sun.java2d.renderer.clip.subdivider.minLength = "
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1158
                + MarlinProperties.getSubdividerMinLength());
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1159
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1160
        // debugging parameters
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1161
        logInfo("sun.java2d.renderer.doStats          = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1162
                + MarlinConst.DO_STATS);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1163
        logInfo("sun.java2d.renderer.doMonitors       = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1164
                + MarlinConst.DO_MONITORS);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1165
        logInfo("sun.java2d.renderer.doChecks         = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1166
                + MarlinConst.DO_CHECKS);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1167
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1168
        // logging parameters
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1169
        logInfo("sun.java2d.renderer.useLogger        = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1170
                + MarlinConst.USE_LOGGER);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1171
        logInfo("sun.java2d.renderer.logCreateContext = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1172
                + MarlinConst.LOG_CREATE_CONTEXT);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1173
        logInfo("sun.java2d.renderer.logUnsafeMalloc  = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1174
                + MarlinConst.LOG_UNSAFE_MALLOC);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1175
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1176
        // quality settings
49496
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1177
        logInfo("sun.java2d.renderer.curve_len_err    = "
1ea202af7a97 8198885: upgrade Marlin (java2d) to 0.9.1
lbourges
parents: 48284
diff changeset
  1178
                + MarlinProperties.getCurveLengthError());
47126
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1179
        logInfo("sun.java2d.renderer.cubic_dec_d2     = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1180
                + MarlinProperties.getCubicDecD2());
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1181
        logInfo("sun.java2d.renderer.cubic_inc_d1     = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1182
                + MarlinProperties.getCubicIncD1());
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1183
        logInfo("sun.java2d.renderer.quad_dec_d2      = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1184
                + MarlinProperties.getQuadDecD2());
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1185
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1186
        logInfo("Renderer settings:");
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1187
        logInfo("CUB_DEC_BND  = " + DRenderer.CUB_DEC_BND);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1188
        logInfo("CUB_INC_BND  = " + DRenderer.CUB_INC_BND);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1189
        logInfo("QUAD_DEC_BND = " + DRenderer.QUAD_DEC_BND);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1190
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1191
        logInfo("INITIAL_EDGES_CAPACITY               = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1192
                + MarlinConst.INITIAL_EDGES_CAPACITY);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1193
        logInfo("INITIAL_CROSSING_COUNT               = "
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1194
                + DRenderer.INITIAL_CROSSING_COUNT);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1195
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1196
        logInfo("=========================================================="
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1197
                + "=====================");
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1198
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1199
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1200
    /**
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1201
     * Get the DRendererContext instance dedicated to the current thread
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1202
     * @return DRendererContext instance
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1203
     */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1204
    @SuppressWarnings({"unchecked"})
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1205
    static DRendererContext getRendererContext() {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1206
        final DRendererContext rdrCtx = RDR_CTX_PROVIDER.acquire();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1207
        if (DO_MONITORS) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1208
            rdrCtx.stats.mon_pre_getAATileGenerator.start();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1209
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1210
        return rdrCtx;
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1211
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1212
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1213
    /**
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1214
     * Reset and return the given DRendererContext instance for reuse
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1215
     * @param rdrCtx DRendererContext instance
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1216
     */
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1217
    static void returnRendererContext(final DRendererContext rdrCtx) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1218
        rdrCtx.dispose();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1219
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1220
        if (DO_MONITORS) {
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1221
            rdrCtx.stats.mon_pre_getAATileGenerator.stop();
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1222
        }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1223
        RDR_CTX_PROVIDER.release(rdrCtx);
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1224
    }
188ef162f019 8180055: Upgrade the Marlin renderer in Java2D
lbourges
parents:
diff changeset
  1225
}