1 /*
2 * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package sun.java2d.marlin;
27
28 import java.awt.geom.Path2D;
29 import java.lang.ref.WeakReference;
30 import java.util.concurrent.atomic.AtomicInteger;
31 import sun.java2d.ReentrantContext;
32 import sun.java2d.marlin.ArrayCacheConst.CacheStats;
33 import sun.java2d.marlin.DMarlinRenderingEngine.NormalizingPathIterator;
34
35 /**
36 * This class is a renderer context dedicated to a single thread
37 */
38 final class DRendererContext extends ReentrantContext implements IRendererContext {
39
40 // RendererContext creation counter
41 private static final AtomicInteger CTX_COUNT = new AtomicInteger(1);
42
43 /**
44 * Create a new renderer context
45 *
46 * @return new RendererContext instance
47 */
48 static DRendererContext createContext() {
49 return new DRendererContext("ctx"
50 + Integer.toString(CTX_COUNT.getAndIncrement()));
51 }
52
53 // Smallest object used as Cleaner's parent reference
54 private final Object cleanerObj;
55 // dirty flag indicating an exception occured during pipeline in pathTo()
56 boolean dirty = false;
57 // shared data
58 final double[] double6 = new double[6];
59 // shared curve (dirty) (Renderer / Stroker)
60 final DCurve curve = new DCurve();
61 // MarlinRenderingEngine NormalizingPathIterator NearestPixelCenter:
62 final NormalizingPathIterator nPCPathIterator;
63 // MarlinRenderingEngine NearestPixelQuarter NormalizingPathIterator:
64 final NormalizingPathIterator nPQPathIterator;
65 // MarlinRenderingEngine.TransformingPathConsumer2D
66 final DTransformingPathConsumer2D transformerPC2D;
67 // recycled Path2D instance (weak)
68 private WeakReference<Path2D.Double> refPath2D = null;
69 final DRenderer renderer;
70 final DStroker stroker;
71 // Simplifies out collinear lines
72 final DCollinearSimplifier simplifier = new DCollinearSimplifier();
73 final DDasher dasher;
74 final MarlinTileGenerator ptg;
75 final MarlinCache cache;
76 // flag indicating the shape is stroked (1) or filled (0)
77 int stroking = 0;
78 // flag indicating to clip the shape
79 boolean doClip = false;
80 // flag indicating if the path is closed or not (in advance) to handle properly caps
81 boolean closedPath = false;
82 // clip rectangle (ymin, ymax, xmin, xmax):
83 final double[] clipRect = new double[4];
84
85 // Array caches:
86 /* clean int[] cache (zero-filled) = 5 refs */
87 private final IntArrayCache cleanIntCache = new IntArrayCache(true, 5);
88 /* dirty int[] cache = 5 refs */
89 private final IntArrayCache dirtyIntCache = new IntArrayCache(false, 5);
90 /* dirty double[] cache = 4 refs (2 polystack) */
91 private final DoubleArrayCache dirtyDoubleCache = new DoubleArrayCache(false, 4);
92 /* dirty byte[] cache = 2 ref (2 polystack) */
93 private final ByteArrayCache dirtyByteCache = new ByteArrayCache(false, 2);
94
95 // RendererContext statistics
96 final RendererStats stats;
97
98 final PathConsumer2DAdapter p2dAdapter = new PathConsumer2DAdapter();
99
100
101 /**
102 * Constructor
103 *
106 DRendererContext(final String name) {
107 if (LOG_CREATE_CONTEXT) {
108 MarlinUtils.logInfo("new RendererContext = " + name);
109 }
110 this.cleanerObj = new Object();
111
112 // create first stats (needed by newOffHeapArray):
113 if (DO_STATS || DO_MONITORS) {
114 stats = RendererStats.createInstance(cleanerObj, name);
115 // push cache stats:
116 stats.cacheStats = new CacheStats[] { cleanIntCache.stats,
117 dirtyIntCache.stats, dirtyDoubleCache.stats, dirtyByteCache.stats
118 };
119 } else {
120 stats = null;
121 }
122
123 // NormalizingPathIterator instances:
124 nPCPathIterator = new NormalizingPathIterator.NearestPixelCenter(double6);
125 nPQPathIterator = new NormalizingPathIterator.NearestPixelQuarter(double6);
126
127 // MarlinRenderingEngine.TransformingPathConsumer2D
128 transformerPC2D = new DTransformingPathConsumer2D(this);
129
130 // Renderer:
131 cache = new MarlinCache(this);
132 renderer = new DRenderer(this); // needs MarlinCache from rdrCtx.cache
133 ptg = new MarlinTileGenerator(stats, renderer, cache);
134
135 stroker = new DStroker(this);
136 dasher = new DDasher(this);
137 }
138
139 /**
140 * Disposes this renderer context:
141 * clean up before reusing this context
142 */
143 void dispose() {
144 if (DO_STATS) {
145 if (stats.totalOffHeap > stats.totalOffHeapMax) {
|
1 /*
2 * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package sun.java2d.marlin;
27
28 import java.awt.geom.Path2D;
29 import java.lang.ref.WeakReference;
30 import java.util.concurrent.atomic.AtomicInteger;
31 import sun.java2d.ReentrantContext;
32 import sun.java2d.marlin.ArrayCacheConst.CacheStats;
33 import sun.java2d.marlin.DMarlinRenderingEngine.NormalizingPathIterator;
34 import sun.java2d.marlin.DTransformingPathConsumer2D.CurveBasicMonotonizer;
35 import sun.java2d.marlin.DTransformingPathConsumer2D.CurveClipSplitter;
36
37 /**
38 * This class is a renderer context dedicated to a single thread
39 */
40 final class DRendererContext extends ReentrantContext implements IRendererContext {
41
42 // RendererContext creation counter
43 private static final AtomicInteger CTX_COUNT = new AtomicInteger(1);
44
45 /**
46 * Create a new renderer context
47 *
48 * @return new RendererContext instance
49 */
50 static DRendererContext createContext() {
51 return new DRendererContext("ctx"
52 + Integer.toString(CTX_COUNT.getAndIncrement()));
53 }
54
55 // Smallest object used as Cleaner's parent reference
56 private final Object cleanerObj;
57 // dirty flag indicating an exception occured during pipeline in pathTo()
58 boolean dirty = false;
59 // shared data
60 final double[] double6 = new double[6];
61 // shared curve (dirty) (Renderer / Stroker)
62 final DCurve curve = new DCurve();
63 // MarlinRenderingEngine NormalizingPathIterator NearestPixelCenter:
64 final NormalizingPathIterator nPCPathIterator;
65 // MarlinRenderingEngine NearestPixelQuarter NormalizingPathIterator:
66 final NormalizingPathIterator nPQPathIterator;
67 // MarlinRenderingEngine.TransformingPathConsumer2D
68 final DTransformingPathConsumer2D transformerPC2D;
69 // recycled Path2D instance (weak)
70 private WeakReference<Path2D.Double> refPath2D = null;
71 final DRenderer renderer;
72 final DStroker stroker;
73 // Simplifies out collinear lines
74 final DCollinearSimplifier simplifier = new DCollinearSimplifier();
75 // Simplifies path
76 final DPathSimplifier pathSimplifier = new DPathSimplifier();
77 final DDasher dasher;
78 final MarlinTileGenerator ptg;
79 final MarlinCache cache;
80 // flag indicating the shape is stroked (1) or filled (0)
81 int stroking = 0;
82 // flag indicating to clip the shape
83 boolean doClip = false;
84 // flag indicating if the path is closed or not (in advance) to handle properly caps
85 boolean closedPath = false;
86 // clip rectangle (ymin, ymax, xmin, xmax):
87 final double[] clipRect = new double[4];
88 // CurveBasicMonotonizer instance
89 final CurveBasicMonotonizer monotonizer;
90 // CurveClipSplitter instance
91 final CurveClipSplitter curveClipSplitter;
92
93 // Array caches:
94 /* clean int[] cache (zero-filled) = 5 refs */
95 private final IntArrayCache cleanIntCache = new IntArrayCache(true, 5);
96 /* dirty int[] cache = 5 refs */
97 private final IntArrayCache dirtyIntCache = new IntArrayCache(false, 5);
98 /* dirty double[] cache = 4 refs (2 polystack) */
99 private final DoubleArrayCache dirtyDoubleCache = new DoubleArrayCache(false, 4);
100 /* dirty byte[] cache = 2 ref (2 polystack) */
101 private final ByteArrayCache dirtyByteCache = new ByteArrayCache(false, 2);
102
103 // RendererContext statistics
104 final RendererStats stats;
105
106 final PathConsumer2DAdapter p2dAdapter = new PathConsumer2DAdapter();
107
108
109 /**
110 * Constructor
111 *
114 DRendererContext(final String name) {
115 if (LOG_CREATE_CONTEXT) {
116 MarlinUtils.logInfo("new RendererContext = " + name);
117 }
118 this.cleanerObj = new Object();
119
120 // create first stats (needed by newOffHeapArray):
121 if (DO_STATS || DO_MONITORS) {
122 stats = RendererStats.createInstance(cleanerObj, name);
123 // push cache stats:
124 stats.cacheStats = new CacheStats[] { cleanIntCache.stats,
125 dirtyIntCache.stats, dirtyDoubleCache.stats, dirtyByteCache.stats
126 };
127 } else {
128 stats = null;
129 }
130
131 // NormalizingPathIterator instances:
132 nPCPathIterator = new NormalizingPathIterator.NearestPixelCenter(double6);
133 nPQPathIterator = new NormalizingPathIterator.NearestPixelQuarter(double6);
134
135 // curve monotonizer & clip subdivider (before transformerPC2D init)
136 monotonizer = new CurveBasicMonotonizer(this);
137 curveClipSplitter = new CurveClipSplitter(this);
138
139 // MarlinRenderingEngine.TransformingPathConsumer2D
140 transformerPC2D = new DTransformingPathConsumer2D(this);
141
142 // Renderer:
143 cache = new MarlinCache(this);
144 renderer = new DRenderer(this); // needs MarlinCache from rdrCtx.cache
145 ptg = new MarlinTileGenerator(stats, renderer, cache);
146
147 stroker = new DStroker(this);
148 dasher = new DDasher(this);
149 }
150
151 /**
152 * Disposes this renderer context:
153 * clean up before reusing this context
154 */
155 void dispose() {
156 if (DO_STATS) {
157 if (stats.totalOffHeap > stats.totalOffHeapMax) {
|