1 Clazz.declarePackage ("jssun.awt.geom");
\r
2 Clazz.load (null, "jssun.awt.geom.AreaOp", ["java.lang.InternalError", "java.util.Arrays", "$.Vector", "jssun.awt.geom.ChainEnd", "$.CurveLink", "$.Edge"], function () {
\r
3 c$ = Clazz.declareType (jssun.awt.geom, "AreaOp");
\r
4 Clazz.defineMethod (c$, "calculate",
\r
5 function (left, right) {
\r
6 var edges = new java.util.Vector ();
\r
7 jssun.awt.geom.AreaOp.addEdges (edges, left, 0);
\r
8 jssun.awt.geom.AreaOp.addEdges (edges, right, 1);
\r
9 edges = this.pruneEdges (edges);
\r
11 System.out.println ("result: ");
\r
12 var numcurves = edges.size ();
\r
13 var curvelist = edges.toArray ( new Array (numcurves));
\r
14 for (var i = 0; i < numcurves; i++) {
\r
15 System.out.println ("curvelist[" + i + "] = " + curvelist[i]);
\r
18 }, "java.util.Vector,java.util.Vector");
\r
19 c$.addEdges = Clazz.defineMethod (c$, "addEdges",
\r
20 function (edges, curves, curvetag) {
\r
21 var enum_ = curves.elements ();
\r
22 while (enum_.hasMoreElements ()) {
\r
23 var c = enum_.nextElement ();
\r
24 if (c.getOrder () > 0) {
\r
25 edges.add ( new jssun.awt.geom.Edge (c, curvetag));
\r
27 }, "java.util.Vector,java.util.Vector,~N");
\r
28 Clazz.defineMethod (c$, "pruneEdges",
\r
30 var numedges = edges.size ();
\r
33 }var edgelist = edges.toArray ( new Array (numedges));
\r
34 java.util.Arrays.sort (edgelist, jssun.awt.geom.AreaOp.YXTopComparator);
\r
36 System.out.println ("pruning: ");
\r
37 for (var i = 0; i < numedges; i++) {
\r
38 System.out.println ("edgelist[" + i + "] = " + edgelist[i]);
\r
45 var yrange = Clazz.newDoubleArray (2, 0);
\r
46 var subcurves = new java.util.Vector ();
\r
47 var chains = new java.util.Vector ();
\r
48 var links = new java.util.Vector ();
\r
49 while (left < numedges) {
\r
51 for (cur = next = right - 1; cur >= left; cur--) {
\r
53 if (e.getCurve ().getYBot () > y) {
\r
59 if (left >= right) {
\r
60 if (right >= numedges) {
\r
62 }y = edgelist[right].getCurve ().getYTop ();
\r
63 if (y > yrange[0]) {
\r
64 jssun.awt.geom.AreaOp.finalizeSubCurves (subcurves, chains);
\r
66 }while (right < numedges) {
\r
67 e = edgelist[right];
\r
68 if (e.getCurve ().getYTop () > y) {
\r
72 yrange[1] = edgelist[left].getCurve ().getYBot ();
\r
73 if (right < numedges) {
\r
74 y = edgelist[right].getCurve ().getYTop ();
\r
75 if (yrange[1] > y) {
\r
78 System.out.println ("current line: y = [" + yrange[0] + ", " + yrange[1] + "]");
\r
79 for (cur = left; cur < right; cur++) {
\r
80 System.out.println (" " + edgelist[cur]);
\r
83 for (cur = left; cur < right; cur++) {
\r
85 e.setEquivalence (0);
\r
86 for (next = cur; next > left; next--) {
\r
87 var prevedge = edgelist[next - 1];
\r
88 var ordering = e.compareTo (prevedge, yrange);
\r
89 if (yrange[1] <= yrange[0]) {
\r
90 throw new InternalError ("backstepping to " + yrange[1] + " from " + yrange[0]);
\r
91 }if (ordering >= 0) {
\r
92 if (ordering == 0) {
\r
93 var eq = prevedge.getEquivalence ();
\r
96 prevedge.setEquivalence (eq);
\r
97 }e.setEquivalence (eq);
\r
99 }edgelist[next] = prevedge;
\r
101 edgelist[next] = e;
\r
104 System.out.println ("current sorted line: y = [" + yrange[0] + ", " + yrange[1] + "]");
\r
105 for (cur = left; cur < right; cur++) {
\r
106 System.out.println (" " + edgelist[cur]);
\r
109 var ystart = yrange[0];
\r
110 var yend = yrange[1];
\r
111 for (cur = left; cur < right; cur++) {
\r
114 var eq = e.getEquivalence ();
\r
116 var origstate = this.getState ();
\r
117 etag = (origstate == 1 ? -1 : 1);
\r
118 var activematch = null;
\r
119 var longestmatch = e;
\r
120 var furthesty = yend;
\r
123 if (activematch == null && e.isActiveFor (ystart, etag)) {
\r
125 }y = e.getCurve ().getYBot ();
\r
126 if (y > furthesty) {
\r
129 }} while (++cur < right && (e = edgelist[cur]).getEquivalence () == eq);
\r
131 if (this.getState () == origstate) {
\r
134 e = (activematch != null ? activematch : longestmatch);
\r
136 etag = this.classify (e);
\r
138 e.record (yend, etag);
\r
139 links.add ( new jssun.awt.geom.CurveLink (e.getCurve (), ystart, yend, etag));
\r
141 if (this.getState () != -1) {
\r
142 System.out.println ("Still inside at end of active edge list!");
\r
143 System.out.println ("num curves = " + (right - left));
\r
144 System.out.println ("num links = " + links.size ());
\r
145 System.out.println ("y top = " + yrange[0]);
\r
146 if (right < numedges) {
\r
147 System.out.println ("y top of next curve = " + edgelist[right].getCurve ().getYTop ());
\r
149 System.out.println ("no more curves");
\r
150 }for (cur = left; cur < right; cur++) {
\r
152 System.out.println (e);
\r
153 var eq = e.getEquivalence ();
\r
155 System.out.println (" was equal to " + eq + "...");
\r
158 System.out.println ("new links:");
\r
159 for (var i = 0; i < links.size (); i++) {
\r
160 var link = links.elementAt (i);
\r
161 System.out.println (" " + link.getSubCurve ());
\r
163 }jssun.awt.geom.AreaOp.resolveLinks (subcurves, chains, links);
\r
167 jssun.awt.geom.AreaOp.finalizeSubCurves (subcurves, chains);
\r
168 var ret = new java.util.Vector ();
\r
169 var enum_ = subcurves.elements ();
\r
170 while (enum_.hasMoreElements ()) {
\r
171 var link = enum_.nextElement ();
\r
172 ret.add (link.getMoveto ());
\r
173 var nextlink = link;
\r
174 while ((nextlink = nextlink.getNext ()) != null) {
\r
175 if (!link.absorb (nextlink)) {
\r
176 ret.add (link.getSubCurve ());
\r
179 ret.add (link.getSubCurve ());
\r
182 }, "java.util.Vector");
\r
183 c$.finalizeSubCurves = Clazz.defineMethod (c$, "finalizeSubCurves",
\r
184 function (subcurves, chains) {
\r
185 var numchains = chains.size ();
\r
186 if (numchains == 0) {
\r
188 }if ((numchains & 1) != 0) {
\r
189 throw new InternalError ("Odd number of chains!");
\r
190 }var endlist = new Array (numchains);
\r
191 chains.toArray (endlist);
\r
192 for (var i = 1; i < numchains; i += 2) {
\r
193 var open = endlist[i - 1];
\r
194 var close = endlist[i];
\r
195 var subcurve = open.linkTo (close);
\r
196 if (subcurve != null) {
\r
197 subcurves.add (subcurve);
\r
200 }, "java.util.Vector,java.util.Vector");
\r
201 c$.resolveLinks = Clazz.defineMethod (c$, "resolveLinks",
\r
202 function (subcurves, chains, links) {
\r
203 var numlinks = links.size ();
\r
205 if (numlinks == 0) {
\r
206 linklist = jssun.awt.geom.AreaOp.EmptyLinkList;
\r
208 if ((numlinks & 1) != 0) {
\r
209 throw new InternalError ("Odd number of new curves!");
\r
210 }linklist = new Array (numlinks + 2);
\r
211 links.toArray (linklist);
\r
212 }var numchains = chains.size ();
\r
214 if (numchains == 0) {
\r
215 endlist = jssun.awt.geom.AreaOp.EmptyChainList;
\r
217 if ((numchains & 1) != 0) {
\r
218 throw new InternalError ("Odd number of chains!");
\r
219 }endlist = new Array (numchains + 2);
\r
220 chains.toArray (endlist);
\r
224 var chain = endlist[0];
\r
225 var nextchain = endlist[1];
\r
226 var link = linklist[0];
\r
227 var nextlink = linklist[1];
\r
228 while (chain != null || link != null) {
\r
229 var connectchains = (link == null);
\r
230 var connectlinks = (chain == null);
\r
231 if (!connectchains && !connectlinks) {
\r
232 connectchains = ((curchain & 1) == 0 && chain.getX () == nextchain.getX ());
\r
233 connectlinks = ((curlink & 1) == 0 && link.getX () == nextlink.getX ());
\r
234 if (!connectchains && !connectlinks) {
\r
235 var cx = chain.getX ();
\r
236 var lx = link.getX ();
\r
237 connectchains = (nextchain != null && cx < lx && jssun.awt.geom.AreaOp.obstructs (nextchain.getX (), lx, curchain));
\r
238 connectlinks = (nextlink != null && lx < cx && jssun.awt.geom.AreaOp.obstructs (nextlink.getX (), cx, curlink));
\r
239 }}if (connectchains) {
\r
240 var subcurve = chain.linkTo (nextchain);
\r
241 if (subcurve != null) {
\r
242 subcurves.add (subcurve);
\r
244 chain = endlist[curchain];
\r
245 nextchain = endlist[curchain + 1];
\r
246 }if (connectlinks) {
\r
247 var openend = new jssun.awt.geom.ChainEnd (link, null);
\r
248 var closeend = new jssun.awt.geom.ChainEnd (nextlink, openend);
\r
249 openend.setOtherEnd (closeend);
\r
250 chains.add (openend);
\r
251 chains.add (closeend);
\r
253 link = linklist[curlink];
\r
254 nextlink = linklist[curlink + 1];
\r
255 }if (!connectchains && !connectlinks) {
\r
256 chain.addLink (link);
\r
257 chains.add (chain);
\r
260 nextchain = endlist[curchain + 1];
\r
263 nextlink = linklist[curlink + 1];
\r
265 if ((chains.size () & 1) != 0) {
\r
266 System.out.println ("Odd number of chains!");
\r
267 }}, "java.util.Vector,java.util.Vector,java.util.Vector");
\r
268 c$.obstructs = Clazz.defineMethod (c$, "obstructs",
\r
269 function (v1, v2, phase) {
\r
270 return (((phase & 1) == 0) ? (v1 <= v2) : (v1 < v2));
\r
272 c$.$AreaOp$1$ = function () {
\r
273 Clazz.pu$h(self.c$);
\r
274 c$ = Clazz.declareAnonymous (jssun.awt.geom, "AreaOp$1", null, java.util.Comparator);
\r
275 Clazz.overrideMethod (c$, "compare",
\r
276 function (o1, o2) {
\r
277 var c1 = (o1).getCurve ();
\r
278 var c2 = (o2).getCurve ();
\r
281 if ((v1 = c1.getYTop ()) == (v2 = c2.getYTop ())) {
\r
282 if ((v1 = c1.getXTop ()) == (v2 = c2.getXTop ())) {
\r
290 Clazz.pu$h(self.c$);
\r
291 c$ = Clazz.decorateAsClass (function () {
\r
292 this.inLeft = false;
\r
293 this.inRight = false;
\r
294 this.inResult = false;
\r
295 Clazz.instantialize (this, arguments);
\r
296 }, jssun.awt.geom.AreaOp, "CAGOp", jssun.awt.geom.AreaOp);
\r
297 Clazz.overrideMethod (c$, "newRow",
\r
299 this.inLeft = false;
\r
300 this.inRight = false;
\r
301 this.inResult = false;
\r
303 Clazz.overrideMethod (c$, "classify",
\r
305 if (a.getCurveTag () == 0) {
\r
306 this.inLeft = !this.inLeft;
\r
308 this.inRight = !this.inRight;
\r
309 }var b = this.newClassification (this.inLeft, this.inRight);
\r
310 if (this.inResult == b) {
\r
312 }this.inResult = b;
\r
313 return (b ? 1 : -1);
\r
314 }, "jssun.awt.geom.Edge");
\r
315 Clazz.overrideMethod (c$, "getState",
\r
317 return (this.inResult ? 1 : -1);
\r
320 Clazz.pu$h(self.c$);
\r
321 c$ = Clazz.declareType (jssun.awt.geom.AreaOp, "AddOp", jssun.awt.geom.AreaOp.CAGOp);
\r
322 Clazz.overrideMethod (c$, "newClassification",
\r
327 Clazz.pu$h(self.c$);
\r
328 c$ = Clazz.declareType (jssun.awt.geom.AreaOp, "SubOp", jssun.awt.geom.AreaOp.CAGOp);
\r
329 Clazz.overrideMethod (c$, "newClassification",
\r
334 Clazz.pu$h(self.c$);
\r
335 c$ = Clazz.declareType (jssun.awt.geom.AreaOp, "IntOp", jssun.awt.geom.AreaOp.CAGOp);
\r
336 Clazz.overrideMethod (c$, "newClassification",
\r
341 Clazz.pu$h(self.c$);
\r
342 c$ = Clazz.declareType (jssun.awt.geom.AreaOp, "XorOp", jssun.awt.geom.AreaOp.CAGOp);
\r
343 Clazz.overrideMethod (c$, "newClassification",
\r
348 Clazz.pu$h(self.c$);
\r
349 c$ = Clazz.decorateAsClass (function () {
\r
351 Clazz.instantialize (this, arguments);
\r
352 }, jssun.awt.geom.AreaOp, "NZWindOp", jssun.awt.geom.AreaOp);
\r
353 Clazz.overrideMethod (c$, "newRow",
\r
357 Clazz.overrideMethod (c$, "classify",
\r
359 var b = this.count;
\r
360 var c = (b == 0 ? 1 : 0);
\r
361 b += a.getCurve ().getDirection ();
\r
363 return (b == 0 ? -1 : c);
\r
364 }, "jssun.awt.geom.Edge");
\r
365 Clazz.overrideMethod (c$, "getState",
\r
367 return ((this.count == 0) ? -1 : 1);
\r
370 Clazz.pu$h(self.c$);
\r
371 c$ = Clazz.decorateAsClass (function () {
\r
372 this.inside = false;
\r
373 Clazz.instantialize (this, arguments);
\r
374 }, jssun.awt.geom.AreaOp, "EOWindOp", jssun.awt.geom.AreaOp);
\r
375 Clazz.overrideMethod (c$, "newRow",
\r
377 this.inside = false;
\r
379 Clazz.overrideMethod (c$, "classify",
\r
381 var b = !this.inside;
\r
383 return (b ? 1 : -1);
\r
384 }, "jssun.awt.geom.Edge");
\r
385 Clazz.overrideMethod (c$, "getState",
\r
387 return (this.inside ? 1 : -1);
\r
390 Clazz.defineStatics (c$,
\r
397 "RSTAG_OUTSIDE", -1);
\r
398 c$.YXTopComparator = c$.prototype.YXTopComparator = ((Clazz.isClassDefined ("jssun.awt.geom.AreaOp$1") ? 0 : jssun.awt.geom.AreaOp.$AreaOp$1$ ()), Clazz.innerTypeInstance (jssun.awt.geom.AreaOp$1, this, null));
\r
399 c$.EmptyLinkList = c$.prototype.EmptyLinkList = new Array (2);
\r
400 c$.EmptyChainList = c$.prototype.EmptyChainList = new Array (2);
\r