1 /* |
|
2 * Copyright (c) 2019, 2019, 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.metal; |
|
27 |
|
28 import java.awt.Transparency; |
|
29 import java.awt.geom.Path2D; |
|
30 import sun.java2d.InvalidPipeException; |
|
31 import sun.java2d.SunGraphics2D; |
|
32 import sun.java2d.loops.GraphicsPrimitive; |
|
33 import sun.java2d.pipe.BufferedRenderPipe; |
|
34 import sun.java2d.pipe.ParallelogramPipe; |
|
35 import sun.java2d.pipe.RenderQueue; |
|
36 import sun.java2d.pipe.SpanIterator; |
|
37 import static sun.java2d.pipe.BufferedOpCodes.*; |
|
38 |
|
39 class MetalRenderer extends BufferedRenderPipe { |
|
40 |
|
41 MetalRenderer(RenderQueue rq) { |
|
42 super(rq); |
|
43 } |
|
44 |
|
45 @Override |
|
46 protected void validateContext(SunGraphics2D sg2d) { |
|
47 int ctxflags = |
|
48 sg2d.paint.getTransparency() == Transparency.OPAQUE ? |
|
49 MetalContext.SRC_IS_OPAQUE : MetalContext.NO_CONTEXT_FLAGS; |
|
50 MetalSurfaceData dstData; |
|
51 try { |
|
52 dstData = (MetalSurfaceData)sg2d.surfaceData; |
|
53 } catch (ClassCastException e) { |
|
54 throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData); |
|
55 } |
|
56 MetalContext.validateContext(dstData, dstData, |
|
57 sg2d.getCompClip(), sg2d.composite, |
|
58 null, sg2d.paint, sg2d, ctxflags); |
|
59 } |
|
60 |
|
61 @Override |
|
62 protected void validateContextAA(SunGraphics2D sg2d) { |
|
63 int ctxflags = MetalContext.NO_CONTEXT_FLAGS; |
|
64 MetalSurfaceData dstData; |
|
65 try { |
|
66 dstData = (MetalSurfaceData)sg2d.surfaceData; |
|
67 } catch (ClassCastException e) { |
|
68 throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData); |
|
69 } |
|
70 MetalContext.validateContext(dstData, dstData, |
|
71 sg2d.getCompClip(), sg2d.composite, |
|
72 null, sg2d.paint, sg2d, ctxflags); |
|
73 } |
|
74 |
|
75 void copyArea(SunGraphics2D sg2d, |
|
76 int x, int y, int w, int h, int dx, int dy) |
|
77 { |
|
78 rq.lock(); |
|
79 try { |
|
80 int ctxflags = |
|
81 sg2d.surfaceData.getTransparency() == Transparency.OPAQUE ? |
|
82 MetalContext.SRC_IS_OPAQUE : MetalContext.NO_CONTEXT_FLAGS; |
|
83 MetalSurfaceData dstData; |
|
84 try { |
|
85 dstData = (MetalSurfaceData)sg2d.surfaceData; |
|
86 } catch (ClassCastException e) { |
|
87 throw new InvalidPipeException("wrong surface data type: " + sg2d.surfaceData); |
|
88 } |
|
89 MetalContext.validateContext(dstData, dstData, |
|
90 sg2d.getCompClip(), sg2d.composite, |
|
91 null, null, null, ctxflags); |
|
92 |
|
93 rq.ensureCapacity(28); |
|
94 buf.putInt(COPY_AREA); |
|
95 buf.putInt(x).putInt(y).putInt(w).putInt(h); |
|
96 buf.putInt(dx).putInt(dy); |
|
97 } finally { |
|
98 rq.unlock(); |
|
99 } |
|
100 } |
|
101 |
|
102 @Override |
|
103 protected native void drawPoly(int[] xPoints, int[] yPoints, |
|
104 int nPoints, boolean isClosed, |
|
105 int transX, int transY); |
|
106 |
|
107 MetalRenderer traceWrap() { |
|
108 return new Tracer(this); |
|
109 } |
|
110 |
|
111 private class Tracer extends MetalRenderer { |
|
112 private MetalRenderer mtlr; |
|
113 Tracer(MetalRenderer mtlr) { |
|
114 super(mtlr.rq); |
|
115 this.mtlr = mtlr; |
|
116 } |
|
117 public ParallelogramPipe getAAParallelogramPipe() { |
|
118 final ParallelogramPipe realpipe = mtlr.getAAParallelogramPipe(); |
|
119 return new ParallelogramPipe() { |
|
120 public void fillParallelogram(SunGraphics2D sg2d, |
|
121 double ux1, double uy1, |
|
122 double ux2, double uy2, |
|
123 double x, double y, |
|
124 double dx1, double dy1, |
|
125 double dx2, double dy2) |
|
126 { |
|
127 GraphicsPrimitive.tracePrimitive("OGLFillAAParallelogram"); |
|
128 realpipe.fillParallelogram(sg2d, |
|
129 ux1, uy1, ux2, uy2, |
|
130 x, y, dx1, dy1, dx2, dy2); |
|
131 } |
|
132 public void drawParallelogram(SunGraphics2D sg2d, |
|
133 double ux1, double uy1, |
|
134 double ux2, double uy2, |
|
135 double x, double y, |
|
136 double dx1, double dy1, |
|
137 double dx2, double dy2, |
|
138 double lw1, double lw2) |
|
139 { |
|
140 GraphicsPrimitive.tracePrimitive("OGLDrawAAParallelogram"); |
|
141 realpipe.drawParallelogram(sg2d, |
|
142 ux1, uy1, ux2, uy2, |
|
143 x, y, dx1, dy1, dx2, dy2, |
|
144 lw1, lw2); |
|
145 } |
|
146 }; |
|
147 } |
|
148 protected void validateContext(SunGraphics2D sg2d) { |
|
149 mtlr.validateContext(sg2d); |
|
150 } |
|
151 public void drawLine(SunGraphics2D sg2d, |
|
152 int x1, int y1, int x2, int y2) |
|
153 { |
|
154 GraphicsPrimitive.tracePrimitive("OGLDrawLine"); |
|
155 mtlr.drawLine(sg2d, x1, y1, x2, y2); |
|
156 } |
|
157 public void drawRect(SunGraphics2D sg2d, int x, int y, int w, int h) { |
|
158 GraphicsPrimitive.tracePrimitive("OGLDrawRect"); |
|
159 mtlr.drawRect(sg2d, x, y, w, h); |
|
160 } |
|
161 protected void drawPoly(SunGraphics2D sg2d, |
|
162 int[] xPoints, int[] yPoints, |
|
163 int nPoints, boolean isClosed) |
|
164 { |
|
165 GraphicsPrimitive.tracePrimitive("OGLDrawPoly"); |
|
166 mtlr.drawPoly(sg2d, xPoints, yPoints, nPoints, isClosed); |
|
167 } |
|
168 public void fillRect(SunGraphics2D sg2d, int x, int y, int w, int h) { |
|
169 GraphicsPrimitive.tracePrimitive("OGLFillRect"); |
|
170 mtlr.fillRect(sg2d, x, y, w, h); |
|
171 } |
|
172 protected void drawPath(SunGraphics2D sg2d, |
|
173 Path2D.Float p2df, int transx, int transy) |
|
174 { |
|
175 GraphicsPrimitive.tracePrimitive("OGLDrawPath"); |
|
176 mtlr.drawPath(sg2d, p2df, transx, transy); |
|
177 } |
|
178 protected void fillPath(SunGraphics2D sg2d, |
|
179 Path2D.Float p2df, int transx, int transy) |
|
180 { |
|
181 GraphicsPrimitive.tracePrimitive("OGLFillPath"); |
|
182 mtlr.fillPath(sg2d, p2df, transx, transy); |
|
183 } |
|
184 protected void fillSpans(SunGraphics2D sg2d, SpanIterator si, |
|
185 int transx, int transy) |
|
186 { |
|
187 GraphicsPrimitive.tracePrimitive("OGLFillSpans"); |
|
188 mtlr.fillSpans(sg2d, si, transx, transy); |
|
189 } |
|
190 public void fillParallelogram(SunGraphics2D sg2d, |
|
191 double ux1, double uy1, |
|
192 double ux2, double uy2, |
|
193 double x, double y, |
|
194 double dx1, double dy1, |
|
195 double dx2, double dy2) |
|
196 { |
|
197 GraphicsPrimitive.tracePrimitive("OGLFillParallelogram"); |
|
198 mtlr.fillParallelogram(sg2d, |
|
199 ux1, uy1, ux2, uy2, |
|
200 x, y, dx1, dy1, dx2, dy2); |
|
201 } |
|
202 public void drawParallelogram(SunGraphics2D sg2d, |
|
203 double ux1, double uy1, |
|
204 double ux2, double uy2, |
|
205 double x, double y, |
|
206 double dx1, double dy1, |
|
207 double dx2, double dy2, |
|
208 double lw1, double lw2) |
|
209 { |
|
210 GraphicsPrimitive.tracePrimitive("OGLDrawParallelogram"); |
|
211 mtlr.drawParallelogram(sg2d, |
|
212 ux1, uy1, ux2, uy2, |
|
213 x, y, dx1, dy1, dx2, dy2, lw1, lw2); |
|
214 } |
|
215 public void copyArea(SunGraphics2D sg2d, |
|
216 int x, int y, int w, int h, int dx, int dy) |
|
217 { |
|
218 GraphicsPrimitive.tracePrimitive("OGLCopyArea"); |
|
219 mtlr.copyArea(sg2d, x, y, w, h, dx, dy); |
|
220 } |
|
221 } |
|
222 } |
|