JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / j2s / jssun / awt / geom / AreaOp.js
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
10 if (false) {\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
16 }\r
17 }return edges;\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
26 }}\r
27 }, "java.util.Vector,java.util.Vector,~N");\r
28 Clazz.defineMethod (c$, "pruneEdges", \r
29  function (edges) {\r
30 var numedges = edges.size ();\r
31 if (numedges < 2) {\r
32 return edges;\r
33 }var edgelist = edges.toArray ( new Array (numedges));\r
34 java.util.Arrays.sort (edgelist, jssun.awt.geom.AreaOp.YXTopComparator);\r
35 if (false) {\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
39 }\r
40 }var e;\r
41 var left = 0;\r
42 var right = 0;\r
43 var cur = 0;\r
44 var next = 0;\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
50 var y = yrange[0];\r
51 for (cur = next = right - 1; cur >= left; cur--) {\r
52 e = edgelist[cur];\r
53 if (e.getCurve ().getYBot () > y) {\r
54 if (next > cur) {\r
55 edgelist[next] = e;\r
56 }next--;\r
57 }}\r
58 left = next + 1;\r
59 if (left >= right) {\r
60 if (right >= numedges) {\r
61 break;\r
62 }y = edgelist[right].getCurve ().getYTop ();\r
63 if (y > yrange[0]) {\r
64 jssun.awt.geom.AreaOp.finalizeSubCurves (subcurves, chains);\r
65 }yrange[0] = y;\r
66 }while (right < numedges) {\r
67 e = edgelist[right];\r
68 if (e.getCurve ().getYTop () > y) {\r
69 break;\r
70 }right++;\r
71 }\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
76 yrange[1] = y;\r
77 }}if (false) {\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
81 }\r
82 }var nexteq = 1;\r
83 for (cur = left; cur < right; cur++) {\r
84 e = edgelist[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
94 if (eq == 0) {\r
95 eq = nexteq++;\r
96 prevedge.setEquivalence (eq);\r
97 }e.setEquivalence (eq);\r
98 }break;\r
99 }edgelist[next] = prevedge;\r
100 }\r
101 edgelist[next] = e;\r
102 }\r
103 if (false) {\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
107 }\r
108 }this.newRow ();\r
109 var ystart = yrange[0];\r
110 var yend = yrange[1];\r
111 for (cur = left; cur < right; cur++) {\r
112 e = edgelist[cur];\r
113 var etag;\r
114 var eq = e.getEquivalence ();\r
115 if (eq != 0) {\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
121 do {\r
122 this.classify (e);\r
123 if (activematch == null && e.isActiveFor (ystart, etag)) {\r
124 activematch = e;\r
125 }y = e.getCurve ().getYBot ();\r
126 if (y > furthesty) {\r
127 longestmatch = e;\r
128 furthesty = y;\r
129 }} while (++cur < right && (e = edgelist[cur]).getEquivalence () == eq);\r
130 --cur;\r
131 if (this.getState () == origstate) {\r
132 etag = 0;\r
133 } else {\r
134 e = (activematch != null ? activematch : longestmatch);\r
135 }} else {\r
136 etag = this.classify (e);\r
137 }if (etag != 0) {\r
138 e.record (yend, etag);\r
139 links.add ( new jssun.awt.geom.CurveLink (e.getCurve (), ystart, yend, etag));\r
140 }}\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
148 } else {\r
149 System.out.println ("no more curves");\r
150 }for (cur = left; cur < right; cur++) {\r
151 e = edgelist[cur];\r
152 System.out.println (e);\r
153 var eq = e.getEquivalence ();\r
154 if (eq != 0) {\r
155 System.out.println ("  was equal to " + eq + "...");\r
156 }}\r
157 }if (false) {\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
162 }\r
163 }jssun.awt.geom.AreaOp.resolveLinks (subcurves, chains, links);\r
164 links.clear ();\r
165 yrange[0] = yend;\r
166 }\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
177 link = nextlink;\r
178 }}\r
179 ret.add (link.getSubCurve ());\r
180 }\r
181 return ret;\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
187 return;\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
198 }}\r
199 chains.clear ();\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
204 var linklist;\r
205 if (numlinks == 0) {\r
206 linklist = jssun.awt.geom.AreaOp.EmptyLinkList;\r
207 } else {\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
213 var endlist;\r
214 if (numchains == 0) {\r
215 endlist = jssun.awt.geom.AreaOp.EmptyChainList;\r
216 } else {\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
221 }var curchain = 0;\r
222 var curlink = 0;\r
223 chains.clear ();\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
243 }curchain += 2;\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
252 curlink += 2;\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
258 curchain++;\r
259 chain = nextchain;\r
260 nextchain = endlist[curchain + 1];\r
261 curlink++;\r
262 link = nextlink;\r
263 nextlink = linklist[curlink + 1];\r
264 }}\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
271 }, "~N,~N,~N");\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
279 var v1;\r
280 var v2;\r
281 if ((v1 = c1.getYTop ()) == (v2 = c2.getYTop ())) {\r
282 if ((v1 = c1.getXTop ()) == (v2 = c2.getXTop ())) {\r
283 return 0;\r
284 }}if (v1 < v2) {\r
285 return -1;\r
286 }return 1;\r
287 }, "~O,~O");\r
288 c$ = Clazz.p0p ();\r
289 };\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
298 function () {\r
299 this.inLeft = false;\r
300 this.inRight = false;\r
301 this.inResult = false;\r
302 });\r
303 Clazz.overrideMethod (c$, "classify", \r
304 function (a) {\r
305 if (a.getCurveTag () == 0) {\r
306 this.inLeft = !this.inLeft;\r
307 } else {\r
308 this.inRight = !this.inRight;\r
309 }var b = this.newClassification (this.inLeft, this.inRight);\r
310 if (this.inResult == b) {\r
311 return 0;\r
312 }this.inResult = b;\r
313 return (b ? 1 : -1);\r
314 }, "jssun.awt.geom.Edge");\r
315 Clazz.overrideMethod (c$, "getState", \r
316 function () {\r
317 return (this.inResult ? 1 : -1);\r
318 });\r
319 c$ = Clazz.p0p ();\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
323 function (a, b) {\r
324 return (a || b);\r
325 }, "~B,~B");\r
326 c$ = Clazz.p0p ();\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
330 function (a, b) {\r
331 return (a && !b);\r
332 }, "~B,~B");\r
333 c$ = Clazz.p0p ();\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
337 function (a, b) {\r
338 return (a && b);\r
339 }, "~B,~B");\r
340 c$ = Clazz.p0p ();\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
344 function (a, b) {\r
345 return (a != b);\r
346 }, "~B,~B");\r
347 c$ = Clazz.p0p ();\r
348 Clazz.pu$h(self.c$);\r
349 c$ = Clazz.decorateAsClass (function () {\r
350 this.count = 0;\r
351 Clazz.instantialize (this, arguments);\r
352 }, jssun.awt.geom.AreaOp, "NZWindOp", jssun.awt.geom.AreaOp);\r
353 Clazz.overrideMethod (c$, "newRow", \r
354 function () {\r
355 this.count = 0;\r
356 });\r
357 Clazz.overrideMethod (c$, "classify", \r
358 function (a) {\r
359 var b = this.count;\r
360 var c = (b == 0 ? 1 : 0);\r
361 b += a.getCurve ().getDirection ();\r
362 this.count = b;\r
363 return (b == 0 ? -1 : c);\r
364 }, "jssun.awt.geom.Edge");\r
365 Clazz.overrideMethod (c$, "getState", \r
366 function () {\r
367 return ((this.count == 0) ? -1 : 1);\r
368 });\r
369 c$ = Clazz.p0p ();\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
376 function () {\r
377 this.inside = false;\r
378 });\r
379 Clazz.overrideMethod (c$, "classify", \r
380 function (a) {\r
381 var b = !this.inside;\r
382 this.inside = b;\r
383 return (b ? 1 : -1);\r
384 }, "jssun.awt.geom.Edge");\r
385 Clazz.overrideMethod (c$, "getState", \r
386 function () {\r
387 return (this.inside ? 1 : -1);\r
388 });\r
389 c$ = Clazz.p0p ();\r
390 Clazz.defineStatics (c$,\r
391 "CTAG_LEFT", 0,\r
392 "CTAG_RIGHT", 1,\r
393 "ETAG_IGNORE", 0,\r
394 "ETAG_ENTER", 1,\r
395 "ETAG_EXIT", -1,\r
396 "RSTAG_INSIDE", 1,\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
401 });\r