Merge branch 'master' of https://source.jalview.org/git/jalviewjs.git
[jalviewjs.git] / site / swingjs / j2s / jssun / awt / geom / AreaOp.js
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);
10 if (false) {
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]);
16 }
17 }return edges;
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));
26 }}
27 }, "java.util.Vector,java.util.Vector,~N");
28 Clazz.defineMethod (c$, "pruneEdges", 
29  function (edges) {
30 var numedges = edges.size ();
31 if (numedges < 2) {
32 return edges;
33 }var edgelist = edges.toArray ( new Array (numedges));
34 java.util.Arrays.sort (edgelist, jssun.awt.geom.AreaOp.YXTopComparator);
35 if (false) {
36 System.out.println ("pruning: ");
37 for (var i = 0; i < numedges; i++) {
38 System.out.println ("edgelist[" + i + "] = " + edgelist[i]);
39 }
40 }var e;
41 var left = 0;
42 var right = 0;
43 var cur = 0;
44 var next = 0;
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) {
50 var y = yrange[0];
51 for (cur = next = right - 1; cur >= left; cur--) {
52 e = edgelist[cur];
53 if (e.getCurve ().getYBot () > y) {
54 if (next > cur) {
55 edgelist[next] = e;
56 }next--;
57 }}
58 left = next + 1;
59 if (left >= right) {
60 if (right >= numedges) {
61 break;
62 }y = edgelist[right].getCurve ().getYTop ();
63 if (y > yrange[0]) {
64 jssun.awt.geom.AreaOp.finalizeSubCurves (subcurves, chains);
65 }yrange[0] = y;
66 }while (right < numedges) {
67 e = edgelist[right];
68 if (e.getCurve ().getYTop () > y) {
69 break;
70 }right++;
71 }
72 yrange[1] = edgelist[left].getCurve ().getYBot ();
73 if (right < numedges) {
74 y = edgelist[right].getCurve ().getYTop ();
75 if (yrange[1] > y) {
76 yrange[1] = y;
77 }}if (false) {
78 System.out.println ("current line: y = [" + yrange[0] + ", " + yrange[1] + "]");
79 for (cur = left; cur < right; cur++) {
80 System.out.println ("  " + edgelist[cur]);
81 }
82 }var nexteq = 1;
83 for (cur = left; cur < right; cur++) {
84 e = edgelist[cur];
85 e.setEquivalence (0);
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]);
91 }if (ordering >= 0) {
92 if (ordering == 0) {
93 var eq = prevedge.getEquivalence ();
94 if (eq == 0) {
95 eq = nexteq++;
96 prevedge.setEquivalence (eq);
97 }e.setEquivalence (eq);
98 }break;
99 }edgelist[next] = prevedge;
100 }
101 edgelist[next] = e;
102 }
103 if (false) {
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]);
107 }
108 }this.newRow ();
109 var ystart = yrange[0];
110 var yend = yrange[1];
111 for (cur = left; cur < right; cur++) {
112 e = edgelist[cur];
113 var etag;
114 var eq = e.getEquivalence ();
115 if (eq != 0) {
116 var origstate = this.getState ();
117 etag = (origstate == 1 ? -1 : 1);
118 var activematch = null;
119 var longestmatch = e;
120 var furthesty = yend;
121 do {
122 this.classify (e);
123 if (activematch == null && e.isActiveFor (ystart, etag)) {
124 activematch = e;
125 }y = e.getCurve ().getYBot ();
126 if (y > furthesty) {
127 longestmatch = e;
128 furthesty = y;
129 }} while (++cur < right && (e = edgelist[cur]).getEquivalence () == eq);
130 --cur;
131 if (this.getState () == origstate) {
132 etag = 0;
133 } else {
134 e = (activematch != null ? activematch : longestmatch);
135 }} else {
136 etag = this.classify (e);
137 }if (etag != 0) {
138 e.record (yend, etag);
139 links.add ( new jssun.awt.geom.CurveLink (e.getCurve (), ystart, yend, etag));
140 }}
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 ());
148 } else {
149 System.out.println ("no more curves");
150 }for (cur = left; cur < right; cur++) {
151 e = edgelist[cur];
152 System.out.println (e);
153 var eq = e.getEquivalence ();
154 if (eq != 0) {
155 System.out.println ("  was equal to " + eq + "...");
156 }}
157 }if (false) {
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 ());
162 }
163 }jssun.awt.geom.AreaOp.resolveLinks (subcurves, chains, links);
164 links.clear ();
165 yrange[0] = yend;
166 }
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 ());
173 var nextlink = link;
174 while ((nextlink = nextlink.getNext ()) != null) {
175 if (!link.absorb (nextlink)) {
176 ret.add (link.getSubCurve ());
177 link = nextlink;
178 }}
179 ret.add (link.getSubCurve ());
180 }
181 return ret;
182 }, "java.util.Vector");
183 c$.finalizeSubCurves = Clazz.defineMethod (c$, "finalizeSubCurves", 
184 function (subcurves, chains) {
185 var numchains = chains.size ();
186 if (numchains == 0) {
187 return;
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);
198 }}
199 chains.clear ();
200 }, "java.util.Vector,java.util.Vector");
201 c$.resolveLinks = Clazz.defineMethod (c$, "resolveLinks", 
202 function (subcurves, chains, links) {
203 var numlinks = links.size ();
204 var linklist;
205 if (numlinks == 0) {
206 linklist = jssun.awt.geom.AreaOp.EmptyLinkList;
207 } else {
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 ();
213 var endlist;
214 if (numchains == 0) {
215 endlist = jssun.awt.geom.AreaOp.EmptyChainList;
216 } else {
217 if ((numchains & 1) != 0) {
218 throw  new InternalError ("Odd number of chains!");
219 }endlist =  new Array (numchains + 2);
220 chains.toArray (endlist);
221 }var curchain = 0;
222 var curlink = 0;
223 chains.clear ();
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);
243 }curchain += 2;
244 chain = endlist[curchain];
245 nextchain = endlist[curchain + 1];
246 }if (connectlinks) {
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);
252 curlink += 2;
253 link = linklist[curlink];
254 nextlink = linklist[curlink + 1];
255 }if (!connectchains && !connectlinks) {
256 chain.addLink (link);
257 chains.add (chain);
258 curchain++;
259 chain = nextchain;
260 nextchain = endlist[curchain + 1];
261 curlink++;
262 link = nextlink;
263 nextlink = linklist[curlink + 1];
264 }}
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));
271 }, "~N,~N,~N");
272 c$.$AreaOp$1$ = function () {
273 Clazz.pu$h(self.c$);
274 c$ = Clazz.declareAnonymous (jssun.awt.geom, "AreaOp$1", null, java.util.Comparator);
275 Clazz.overrideMethod (c$, "compare", 
276 function (o1, o2) {
277 var c1 = (o1).getCurve ();
278 var c2 = (o2).getCurve ();
279 var v1;
280 var v2;
281 if ((v1 = c1.getYTop ()) == (v2 = c2.getYTop ())) {
282 if ((v1 = c1.getXTop ()) == (v2 = c2.getXTop ())) {
283 return 0;
284 }}if (v1 < v2) {
285 return -1;
286 }return 1;
287 }, "~O,~O");
288 c$ = Clazz.p0p ();
289 };
290 Clazz.pu$h(self.c$);
291 c$ = Clazz.decorateAsClass (function () {
292 this.inLeft = false;
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", 
298 function () {
299 this.inLeft = false;
300 this.inRight = false;
301 this.inResult = false;
302 });
303 Clazz.overrideMethod (c$, "classify", 
304 function (a) {
305 if (a.getCurveTag () == 0) {
306 this.inLeft = !this.inLeft;
307 } else {
308 this.inRight = !this.inRight;
309 }var b = this.newClassification (this.inLeft, this.inRight);
310 if (this.inResult == b) {
311 return 0;
312 }this.inResult = b;
313 return (b ? 1 : -1);
314 }, "jssun.awt.geom.Edge");
315 Clazz.overrideMethod (c$, "getState", 
316 function () {
317 return (this.inResult ? 1 : -1);
318 });
319 c$ = Clazz.p0p ();
320 Clazz.pu$h(self.c$);
321 c$ = Clazz.declareType (jssun.awt.geom.AreaOp, "AddOp", jssun.awt.geom.AreaOp.CAGOp);
322 Clazz.overrideMethod (c$, "newClassification", 
323 function (a, b) {
324 return (a || b);
325 }, "~B,~B");
326 c$ = Clazz.p0p ();
327 Clazz.pu$h(self.c$);
328 c$ = Clazz.declareType (jssun.awt.geom.AreaOp, "SubOp", jssun.awt.geom.AreaOp.CAGOp);
329 Clazz.overrideMethod (c$, "newClassification", 
330 function (a, b) {
331 return (a && !b);
332 }, "~B,~B");
333 c$ = Clazz.p0p ();
334 Clazz.pu$h(self.c$);
335 c$ = Clazz.declareType (jssun.awt.geom.AreaOp, "IntOp", jssun.awt.geom.AreaOp.CAGOp);
336 Clazz.overrideMethod (c$, "newClassification", 
337 function (a, b) {
338 return (a && b);
339 }, "~B,~B");
340 c$ = Clazz.p0p ();
341 Clazz.pu$h(self.c$);
342 c$ = Clazz.declareType (jssun.awt.geom.AreaOp, "XorOp", jssun.awt.geom.AreaOp.CAGOp);
343 Clazz.overrideMethod (c$, "newClassification", 
344 function (a, b) {
345 return (a != b);
346 }, "~B,~B");
347 c$ = Clazz.p0p ();
348 Clazz.pu$h(self.c$);
349 c$ = Clazz.decorateAsClass (function () {
350 this.count = 0;
351 Clazz.instantialize (this, arguments);
352 }, jssun.awt.geom.AreaOp, "NZWindOp", jssun.awt.geom.AreaOp);
353 Clazz.overrideMethod (c$, "newRow", 
354 function () {
355 this.count = 0;
356 });
357 Clazz.overrideMethod (c$, "classify", 
358 function (a) {
359 var b = this.count;
360 var c = (b == 0 ? 1 : 0);
361 b += a.getCurve ().getDirection ();
362 this.count = b;
363 return (b == 0 ? -1 : c);
364 }, "jssun.awt.geom.Edge");
365 Clazz.overrideMethod (c$, "getState", 
366 function () {
367 return ((this.count == 0) ? -1 : 1);
368 });
369 c$ = Clazz.p0p ();
370 Clazz.pu$h(self.c$);
371 c$ = Clazz.decorateAsClass (function () {
372 this.inside = false;
373 Clazz.instantialize (this, arguments);
374 }, jssun.awt.geom.AreaOp, "EOWindOp", jssun.awt.geom.AreaOp);
375 Clazz.overrideMethod (c$, "newRow", 
376 function () {
377 this.inside = false;
378 });
379 Clazz.overrideMethod (c$, "classify", 
380 function (a) {
381 var b = !this.inside;
382 this.inside = b;
383 return (b ? 1 : -1);
384 }, "jssun.awt.geom.Edge");
385 Clazz.overrideMethod (c$, "getState", 
386 function () {
387 return (this.inside ? 1 : -1);
388 });
389 c$ = Clazz.p0p ();
390 Clazz.defineStatics (c$,
391 "CTAG_LEFT", 0,
392 "CTAG_RIGHT", 1,
393 "ETAG_IGNORE", 0,
394 "ETAG_ENTER", 1,
395 "ETAG_EXIT", -1,
396 "RSTAG_INSIDE", 1,
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);
401 });