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