History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/java2d/loops/MaskFill.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/java2d/loops/MaskFill.java+273−0
@@ -0,0 +1,273 @@
1/*
2 * Copyright (c) 1999, 2010, 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
26package sun.java2d.loops;
27
28import java.awt.Paint;
29import java.awt.PaintContext;
30import java.awt.Composite;
31import java.awt.Rectangle;
32import java.awt.image.ColorModel;
33import java.awt.image.BufferedImage;
34import java.awt.image.WritableRaster;
35import sun.awt.image.BufImgSurfaceData;
36import sun.java2d.loops.GraphicsPrimitive;
37import sun.java2d.SunGraphics2D;
38import sun.java2d.SurfaceData;
39
40/**
41 * MaskFill
42 * 1) fills rectangles of pixels on a surface
43 * 2) performs compositing of colors based upon a Composite
44 * parameter
45 * 3) blends result of composite with destination using an
46 * alpha coverage mask
47 * 4) the mask may be null in which case it should be treated
48 * as if it were an array of all opaque values (0xff)
49 */
50public class MaskFill extends GraphicsPrimitive
51{
52 public static final String methodSignature = "MaskFill(...)".toString();
53 public static final String fillPgramSignature =
54 "FillAAPgram(...)".toString();
55 public static final String drawPgramSignature =
56 "DrawAAPgram(...)".toString();
57
58 public static final int primTypeID = makePrimTypeID();
59
60 private static RenderCache fillcache = new RenderCache(10);
61
62 public static MaskFill locate(SurfaceType srctype,
63 CompositeType comptype,
64 SurfaceType dsttype)
65 {
66 return (MaskFill)
67 GraphicsPrimitiveMgr.locate(primTypeID,
68 srctype, comptype, dsttype);
69 }
70
71 public static MaskFill locatePrim(SurfaceType srctype,
72 CompositeType comptype,
73 SurfaceType dsttype)
74 {
75 return (MaskFill)
76 GraphicsPrimitiveMgr.locatePrim(primTypeID,
77 srctype, comptype, dsttype);
78 }
79
80 /*
81 * Note that this uses locatePrim, not locate, so it can return
82 * null if there is no specific loop to handle this op...
83 */
84 public static MaskFill getFromCache(SurfaceType src,
85 CompositeType comp,
86 SurfaceType dst)
87 {
88 Object o = fillcache.get(src, comp, dst);
89 if (o != null) {
90 return (MaskFill) o;
91 }
92 MaskFill fill = locatePrim(src, comp, dst);
93 if (fill != null) {
94 fillcache.put(src, comp, dst, fill);
95 }
96 return fill;
97 }
98
99 protected MaskFill(String alternateSignature,
100 SurfaceType srctype,
101 CompositeType comptype,
102 SurfaceType dsttype)
103 {
104 super(alternateSignature, primTypeID, srctype, comptype, dsttype);
105 }
106
107 protected MaskFill(SurfaceType srctype,
108 CompositeType comptype,
109 SurfaceType dsttype)
110 {
111 super(methodSignature, primTypeID, srctype, comptype, dsttype);
112 }
113
114 public MaskFill(long pNativePrim,
115 SurfaceType srctype,
116 CompositeType comptype,
117 SurfaceType dsttype)
118 {
119 super(pNativePrim, methodSignature, primTypeID, srctype, comptype, dsttype);
120 }
121
122 /**
123 * All MaskFill implementors must have this invoker method
124 */
125 public native void MaskFill(SunGraphics2D sg2d, SurfaceData sData,
126 Composite comp,
127 int x, int y, int w, int h,
128 byte[] mask, int maskoff, int maskscan);
129
130 public native void FillAAPgram(SunGraphics2D sg2d, SurfaceData sData,
131 Composite comp,
132 double x, double y,
133 double dx1, double dy1,
134 double dx2, double dy2);
135
136 public native void DrawAAPgram(SunGraphics2D sg2d, SurfaceData sData,
137 Composite comp,
138 double x, double y,
139 double dx1, double dy1,
140 double dx2, double dy2,
141 double lw1, double lw2);
142
143 public boolean canDoParallelograms() {
144 return (getNativePrim() != 0);
145 }
146
147 static {
148 GraphicsPrimitiveMgr.registerGeneral(new MaskFill(null, null, null));
149 }
150
151 public GraphicsPrimitive makePrimitive(SurfaceType srctype,
152 CompositeType comptype,
153 SurfaceType dsttype)
154 {
155 if (SurfaceType.OpaqueColor.equals(srctype) ||
156 SurfaceType.AnyColor.equals(srctype))
157 {
158 if (CompositeType.Xor.equals(comptype)) {
159 throw new InternalError("Cannot construct MaskFill for " +
160 "XOR mode");
161 } else {
162 return new General(srctype, comptype, dsttype);
163 }
164 } else {
165 throw new InternalError("MaskFill can only fill with colors");
166 }
167 }
168
169 private static class General extends MaskFill {
170 FillRect fillop;
171 MaskBlit maskop;
172
173 public General(SurfaceType srctype,
174 CompositeType comptype,
175 SurfaceType dsttype)
176 {
177 super(srctype, comptype, dsttype);
178 fillop = FillRect.locate(srctype,
179 CompositeType.SrcNoEa,
180 SurfaceType.IntArgb);
181 maskop = MaskBlit.locate(SurfaceType.IntArgb, comptype, dsttype);
182 }
183
184 public void MaskFill(SunGraphics2D sg2d,
185 SurfaceData sData,
186 Composite comp,
187 int x, int y, int w, int h,
188 byte mask[], int offset, int scan)
189 {
190 BufferedImage dstBI =
191 new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
192 SurfaceData tmpData = BufImgSurfaceData.createData(dstBI);
193
194 // REMIND: This is not pretty. It would be nicer if we
195 // passed a "FillData" object to the Pixel loops, instead
196 // of a SunGraphics2D parameter...
197 int pixel = sg2d.pixel;
198 sg2d.pixel = tmpData.pixelFor(sg2d.getColor());
199 fillop.FillRect(sg2d, tmpData, 0, 0, w, h);
200 sg2d.pixel = pixel;
201
202 maskop.MaskBlit(tmpData, sData, comp, null,
203 0, 0, x, y, w, h,
204 mask, offset, scan);
205 }
206 }
207
208 public GraphicsPrimitive traceWrap() {
209 return new TraceMaskFill(this);
210 }
211
212 private static class TraceMaskFill extends MaskFill {
213 MaskFill target;
214 MaskFill fillPgramTarget;
215 MaskFill drawPgramTarget;
216
217 public TraceMaskFill(MaskFill target) {
218 super(target.getSourceType(),
219 target.getCompositeType(),
220 target.getDestType());
221 this.target = target;
222 this.fillPgramTarget = new MaskFill(fillPgramSignature,
223 target.getSourceType(),
224 target.getCompositeType(),
225 target.getDestType());
226 this.drawPgramTarget = new MaskFill(drawPgramSignature,
227 target.getSourceType(),
228 target.getCompositeType(),
229 target.getDestType());
230 }
231
232 public GraphicsPrimitive traceWrap() {
233 return this;
234 }
235
236 public void MaskFill(SunGraphics2D sg2d, SurfaceData sData,
237 Composite comp,
238 int x, int y, int w, int h,
239 byte[] mask, int maskoff, int maskscan)
240 {
241 tracePrimitive(target);
242 target.MaskFill(sg2d, sData, comp, x, y, w, h,
243 mask, maskoff, maskscan);
244 }
245
246 public void FillAAPgram(SunGraphics2D sg2d, SurfaceData sData,
247 Composite comp,
248 double x, double y,
249 double dx1, double dy1,
250 double dx2, double dy2)
251 {
252 tracePrimitive(fillPgramTarget);
253 target.FillAAPgram(sg2d, sData, comp,
254 x, y, dx1, dy1, dx2, dy2);
255 }
256
257 public void DrawAAPgram(SunGraphics2D sg2d, SurfaceData sData,
258 Composite comp,
259 double x, double y,
260 double dx1, double dy1,
261 double dx2, double dy2,
262 double lw1, double lw2)
263 {
264 tracePrimitive(drawPgramTarget);
265 target.DrawAAPgram(sg2d, sData, comp,
266 x, y, dx1, dy1, dx2, dy2, lw1, lw2);
267 }
268
269 public boolean canDoParallelograms() {
270 return target.canDoParallelograms();
271 }
272 }
273}