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/pipe/RegionSpanIterator.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/java2d/pipe/RegionSpanIterator.java+210−0
@@ -0,0 +1,210 @@
1/*
2 * Copyright (c) 1999, 2002, 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.pipe;
27
28/**
29 * This class implements the ShapeIterator interface for a Region.
30 * This is useful as the source iterator of a device clip region
31 * (in its native guise), and also as the result of clipping a
32 * Region to a rectangle.
33 */
34public class RegionSpanIterator implements SpanIterator {
35 // The RegionIterator that we use to do the work
36 RegionIterator ri;
37
38 // Clipping bounds
39 int lox, loy, hix, hiy;
40
41 // Current Y band limits
42 int curloy, curhiy;
43
44 // Are we done?
45 boolean done = false;
46
47 // Is the associated Region rectangular?
48 boolean isrect;
49
50/*
51 REMIND: For native implementation
52 long pData; // Private storage of rect info
53
54 static {
55 initIDs();
56 }
57
58 public static native void initIDs();
59*/
60
61 /**
62 * Constructs an instance based on the given Region
63 */
64 public RegionSpanIterator(Region r) {
65 int[] bounds = new int[4];
66
67 r.getBounds(bounds);
68 lox = bounds[0];
69 loy = bounds[1];
70 hix = bounds[2];
71 hiy = bounds[3];
72 isrect = r.isRectangular();
73
74 ri = r.getIterator();
75 }
76
77 /**
78 * Gets the bbox of the available region spans.
79 */
80 public void getPathBox(int pathbox[]) {
81 pathbox[0] = lox;
82 pathbox[1] = loy;
83 pathbox[2] = hix;
84 pathbox[3] = hiy;
85 }
86
87 /**
88 * Intersect the box used for clipping the output spans with the
89 * given box.
90 */
91 public void intersectClipBox(int clox, int cloy, int chix, int chiy) {
92 if (clox > lox) {
93 lox = clox;
94 }
95 if (cloy > loy) {
96 loy = cloy;
97 }
98 if (chix < hix) {
99 hix = chix;
100 }
101 if (chiy < hiy) {
102 hiy = chiy;
103 }
104 done = lox >= hix || loy >= hiy;
105 }
106
107 /**
108 * Fetches the next span that needs to be operated on.
109 * If the return value is false then there are no more spans.
110 */
111 public boolean nextSpan(int spanbox[]) {
112
113 // Quick test for end conditions
114 if (done) {
115 return false;
116 }
117
118 // If the Region is rectangular, we store our bounds (possibly
119 // clipped via intersectClipBox()) in spanbox and return true
120 // so that the caller will process the single span. We set done
121 // to true to ensure that this will be the last span processed.
122 if (isrect) {
123 getPathBox(spanbox);
124 done = true;
125 return true;
126 }
127
128 // Local cache of current span's bounds
129 int curlox, curhix;
130 int curloy = this.curloy;
131 int curhiy = this.curhiy;
132
133 while (true) {
134 if (!ri.nextXBand(spanbox)) {
135 if (!ri.nextYRange(spanbox)) {
136 done = true;
137 return false;
138 }
139 // Update the current y band and clip it
140 curloy = spanbox[1];
141 curhiy = spanbox[3];
142 if (curloy < loy) {
143 curloy = loy;
144 }
145 if (curhiy > hiy) {
146 curhiy = hiy;
147 }
148 // Check for moving below the clip rect
149 if (curloy >= hiy) {
150 done = true;
151 return false;
152 }
153 continue;
154 }
155 // Clip the x box
156 curlox = spanbox[0];
157 curhix = spanbox[2];
158 if (curlox < lox) {
159 curlox = lox;
160 }
161 if (curhix > hix) {
162 curhix = hix;
163 }
164 // If it's non- box, we're done
165 if (curlox < curhix && curloy < curhiy) {
166 break;
167 }
168 }
169
170 // Update the result and the store y range
171 spanbox[0] = curlox;
172 spanbox[1] = this.curloy = curloy;
173 spanbox[2] = curhix;
174 spanbox[3] = this.curhiy = curhiy;
175 return true;
176 }
177
178 /**
179 * This method tells the iterator that it may skip all spans
180 * whose Y range is completely above the indicated Y coordinate.
181 */
182 public void skipDownTo(int y) {
183 loy = y;
184 }
185
186 /**
187 * This method returns a native pointer to a function block that
188 * can be used by a native method to perform the same iteration
189 * cycle that the above methods provide while avoiding upcalls to
190 * the Java object.
191 * The definition of the structure whose pointer is returned by
192 * this method is defined in:
193 * <pre>
194 * src/share/native/sun/java2d/pipe/SpanIterator.h
195 * </pre>
196 */
197 public long getNativeIterator() {
198 return 0;
199 }
200
201 /*
202 * Cleans out all internal data structures.
203 * REMIND: Native implementation
204 public native void dispose();
205
206 protected void finalize() {
207 dispose();
208 }
209 */
210}