Merge branch 'master' of https://source.jalview.org/git/jalviewjs.git
[jalviewjs.git] / site / swingjs / j2s / java / awt / geom / CubicCurve2D.js
index aece5a9..6b3ad42 100644 (file)
-Clazz.declarePackage ("java.awt.geom");\r
-Clazz.load (["java.awt.Shape"], "java.awt.geom.CubicCurve2D", ["java.lang.InternalError", "java.util.Arrays", "java.awt.geom.FlatteningPathIterator", "$.Line2D", "$.Point2D", "$.QuadCurve2D", "$.Rectangle2D", "jssun.awt.geom.Curve", "swingjs.api.Interface"], function () {\r
-c$ = Clazz.declareType (java.awt.geom, "CubicCurve2D", null, [java.awt.Shape, Cloneable]);\r
-Clazz.makeConstructor (c$, \r
-function () {\r
-});\r
-Clazz.defineMethod (c$, "setCurve", \r
-function (coords, offset) {\r
-this.setCurve (coords[offset + 0], coords[offset + 1], coords[offset + 2], coords[offset + 3], coords[offset + 4], coords[offset + 5], coords[offset + 6], coords[offset + 7]);\r
-}, "~A,~N");\r
-Clazz.defineMethod (c$, "setCurve", \r
-function (p1, cp1, cp2, p2) {\r
-this.setCurve (p1.getX (), p1.getY (), cp1.getX (), cp1.getY (), cp2.getX (), cp2.getY (), p2.getX (), p2.getY ());\r
-}, "java.awt.geom.Point2D,java.awt.geom.Point2D,java.awt.geom.Point2D,java.awt.geom.Point2D");\r
-Clazz.defineMethod (c$, "setCurve", \r
-function (pts, offset) {\r
-this.setCurve (pts[offset + 0].getX (), pts[offset + 0].getY (), pts[offset + 1].getX (), pts[offset + 1].getY (), pts[offset + 2].getX (), pts[offset + 2].getY (), pts[offset + 3].getX (), pts[offset + 3].getY ());\r
-}, "~A,~N");\r
-Clazz.defineMethod (c$, "setCurve", \r
-function (c) {\r
-this.setCurve (c.getX1 (), c.getY1 (), c.getCtrlX1 (), c.getCtrlY1 (), c.getCtrlX2 (), c.getCtrlY2 (), c.getX2 (), c.getY2 ());\r
-}, "java.awt.geom.CubicCurve2D");\r
-c$.getFlatnessSq = Clazz.defineMethod (c$, "getFlatnessSq", \r
-function (x1, y1, ctrlx1, ctrly1, ctrlx2, ctrly2, x2, y2) {\r
-return Math.max (java.awt.geom.Line2D.ptSegDistSq (x1, y1, x2, y2, ctrlx1, ctrly1), java.awt.geom.Line2D.ptSegDistSq (x1, y1, x2, y2, ctrlx2, ctrly2));\r
-}, "~N,~N,~N,~N,~N,~N,~N,~N");\r
-c$.getFlatness = Clazz.defineMethod (c$, "getFlatness", \r
-function (x1, y1, ctrlx1, ctrly1, ctrlx2, ctrly2, x2, y2) {\r
-return Math.sqrt (java.awt.geom.CubicCurve2D.getFlatnessSq (x1, y1, ctrlx1, ctrly1, ctrlx2, ctrly2, x2, y2));\r
-}, "~N,~N,~N,~N,~N,~N,~N,~N");\r
-c$.getFlatnessSq = Clazz.defineMethod (c$, "getFlatnessSq", \r
-function (coords, offset) {\r
-return java.awt.geom.CubicCurve2D.getFlatnessSq (coords[offset + 0], coords[offset + 1], coords[offset + 2], coords[offset + 3], coords[offset + 4], coords[offset + 5], coords[offset + 6], coords[offset + 7]);\r
-}, "~A,~N");\r
-c$.getFlatness = Clazz.defineMethod (c$, "getFlatness", \r
-function (coords, offset) {\r
-return java.awt.geom.CubicCurve2D.getFlatness (coords[offset + 0], coords[offset + 1], coords[offset + 2], coords[offset + 3], coords[offset + 4], coords[offset + 5], coords[offset + 6], coords[offset + 7]);\r
-}, "~A,~N");\r
-Clazz.defineMethod (c$, "getFlatnessSq", \r
-function () {\r
-return java.awt.geom.CubicCurve2D.getFlatnessSq (this.getX1 (), this.getY1 (), this.getCtrlX1 (), this.getCtrlY1 (), this.getCtrlX2 (), this.getCtrlY2 (), this.getX2 (), this.getY2 ());\r
-});\r
-Clazz.defineMethod (c$, "getFlatness", \r
-function () {\r
-return java.awt.geom.CubicCurve2D.getFlatness (this.getX1 (), this.getY1 (), this.getCtrlX1 (), this.getCtrlY1 (), this.getCtrlX2 (), this.getCtrlY2 (), this.getX2 (), this.getY2 ());\r
-});\r
-Clazz.defineMethod (c$, "subdivide", \r
-function (left, right) {\r
-java.awt.geom.CubicCurve2D.subdivide (this, left, right);\r
-}, "java.awt.geom.CubicCurve2D,java.awt.geom.CubicCurve2D");\r
-c$.subdivide = Clazz.defineMethod (c$, "subdivide", \r
-function (src, left, right) {\r
-var x1 = src.getX1 ();\r
-var y1 = src.getY1 ();\r
-var ctrlx1 = src.getCtrlX1 ();\r
-var ctrly1 = src.getCtrlY1 ();\r
-var ctrlx2 = src.getCtrlX2 ();\r
-var ctrly2 = src.getCtrlY2 ();\r
-var x2 = src.getX2 ();\r
-var y2 = src.getY2 ();\r
-var centerx = (ctrlx1 + ctrlx2) / 2.0;\r
-var centery = (ctrly1 + ctrly2) / 2.0;\r
-ctrlx1 = (x1 + ctrlx1) / 2.0;\r
-ctrly1 = (y1 + ctrly1) / 2.0;\r
-ctrlx2 = (x2 + ctrlx2) / 2.0;\r
-ctrly2 = (y2 + ctrly2) / 2.0;\r
-var ctrlx12 = (ctrlx1 + centerx) / 2.0;\r
-var ctrly12 = (ctrly1 + centery) / 2.0;\r
-var ctrlx21 = (ctrlx2 + centerx) / 2.0;\r
-var ctrly21 = (ctrly2 + centery) / 2.0;\r
-centerx = (ctrlx12 + ctrlx21) / 2.0;\r
-centery = (ctrly12 + ctrly21) / 2.0;\r
-if (left != null) {\r
-left.setCurve (x1, y1, ctrlx1, ctrly1, ctrlx12, ctrly12, centerx, centery);\r
-}if (right != null) {\r
-right.setCurve (centerx, centery, ctrlx21, ctrly21, ctrlx2, ctrly2, x2, y2);\r
-}}, "java.awt.geom.CubicCurve2D,java.awt.geom.CubicCurve2D,java.awt.geom.CubicCurve2D");\r
-c$.subdivide = Clazz.defineMethod (c$, "subdivide", \r
-function (src, srcoff, left, leftoff, right, rightoff) {\r
-var x1 = src[srcoff + 0];\r
-var y1 = src[srcoff + 1];\r
-var ctrlx1 = src[srcoff + 2];\r
-var ctrly1 = src[srcoff + 3];\r
-var ctrlx2 = src[srcoff + 4];\r
-var ctrly2 = src[srcoff + 5];\r
-var x2 = src[srcoff + 6];\r
-var y2 = src[srcoff + 7];\r
-if (left != null) {\r
-left[leftoff + 0] = x1;\r
-left[leftoff + 1] = y1;\r
-}if (right != null) {\r
-right[rightoff + 6] = x2;\r
-right[rightoff + 7] = y2;\r
-}x1 = (x1 + ctrlx1) / 2.0;\r
-y1 = (y1 + ctrly1) / 2.0;\r
-x2 = (x2 + ctrlx2) / 2.0;\r
-y2 = (y2 + ctrly2) / 2.0;\r
-var centerx = (ctrlx1 + ctrlx2) / 2.0;\r
-var centery = (ctrly1 + ctrly2) / 2.0;\r
-ctrlx1 = (x1 + centerx) / 2.0;\r
-ctrly1 = (y1 + centery) / 2.0;\r
-ctrlx2 = (x2 + centerx) / 2.0;\r
-ctrly2 = (y2 + centery) / 2.0;\r
-centerx = (ctrlx1 + ctrlx2) / 2.0;\r
-centery = (ctrly1 + ctrly2) / 2.0;\r
-if (left != null) {\r
-left[leftoff + 2] = x1;\r
-left[leftoff + 3] = y1;\r
-left[leftoff + 4] = ctrlx1;\r
-left[leftoff + 5] = ctrly1;\r
-left[leftoff + 6] = centerx;\r
-left[leftoff + 7] = centery;\r
-}if (right != null) {\r
-right[rightoff + 0] = centerx;\r
-right[rightoff + 1] = centery;\r
-right[rightoff + 2] = ctrlx2;\r
-right[rightoff + 3] = ctrly2;\r
-right[rightoff + 4] = x2;\r
-right[rightoff + 5] = y2;\r
-}}, "~A,~N,~A,~N,~A,~N");\r
-c$.solveCubic = Clazz.defineMethod (c$, "solveCubic", \r
-function (eqn) {\r
-return java.awt.geom.CubicCurve2D.solveCubic (eqn, eqn);\r
-}, "~A");\r
-c$.solveCubic = Clazz.defineMethod (c$, "solveCubic", \r
-function (eqn, res) {\r
-var d = eqn[3];\r
-if (d == 0.0) {\r
-return java.awt.geom.QuadCurve2D.solveQuadratic (eqn, res);\r
-}var a = eqn[2] / d;\r
-var b = eqn[1] / d;\r
-var c = eqn[0] / d;\r
-var roots = 0;\r
-var Q = (a * a - 3.0 * b) / 9.0;\r
-var R = (2.0 * a * a * a - 9.0 * a * b + 27.0 * c) / 54.0;\r
-var R2 = R * R;\r
-var Q3 = Q * Q * Q;\r
-a = a / 3.0;\r
-if (R2 < Q3) {\r
-var theta = Math.acos (R / Math.sqrt (Q3));\r
-Q = -2.0 * Math.sqrt (Q);\r
-if (res === eqn) {\r
-eqn =  Clazz.newDoubleArray (4, 0);\r
-System.arraycopy (res, 0, eqn, 0, 4);\r
-}res[roots++] = Q * Math.cos (theta / 3.0) - a;\r
-res[roots++] = Q * Math.cos ((theta + 6.283185307179586) / 3.0) - a;\r
-res[roots++] = Q * Math.cos ((theta - 6.283185307179586) / 3.0) - a;\r
-java.awt.geom.CubicCurve2D.fixRoots (res, eqn);\r
-} else {\r
-var neg = (R < 0.0);\r
-var S = Math.sqrt (R2 - Q3);\r
-if (neg) {\r
-R = -R;\r
-}var A = Math.pow (R + S, 0.3333333333333333);\r
-if (!neg) {\r
-A = -A;\r
-}var B = (A == 0.0) ? 0.0 : (Q / A);\r
-res[roots++] = (A + B) - a;\r
-}return roots;\r
-}, "~A,~A");\r
-c$.fixRoots = Clazz.defineMethod (c$, "fixRoots", \r
- function (res, eqn) {\r
-var EPSILON = 1E-5;\r
-for (var i = 0; i < 3; i++) {\r
-var t = res[i];\r
-if (Math.abs (t) < 1.0E-5) {\r
-res[i] = java.awt.geom.CubicCurve2D.findZero (t, 0, eqn);\r
-} else if (Math.abs (t - 1) < 1.0E-5) {\r
-res[i] = java.awt.geom.CubicCurve2D.findZero (t, 1, eqn);\r
-}}\r
-}, "~A,~A");\r
-c$.solveEqn = Clazz.defineMethod (c$, "solveEqn", \r
- function (eqn, order, t) {\r
-var v = eqn[order];\r
-while (--order >= 0) {\r
-v = v * t + eqn[order];\r
-}\r
-return v;\r
-}, "~A,~N,~N");\r
-c$.findZero = Clazz.defineMethod (c$, "findZero", \r
- function (t, target, eqn) {\r
-var slopeqn =  Clazz.newDoubleArray (-1, [eqn[1], 2 * eqn[2], 3 * eqn[3]]);\r
-var slope;\r
-var origdelta = 0;\r
-var origt = t;\r
-while (true) {\r
-slope = java.awt.geom.CubicCurve2D.solveEqn (slopeqn, 2, t);\r
-if (slope == 0) {\r
-return t;\r
-}var y = java.awt.geom.CubicCurve2D.solveEqn (eqn, 3, t);\r
-if (y == 0) {\r
-return t;\r
-}var delta = -(y / slope);\r
-if (origdelta == 0) {\r
-origdelta = delta;\r
-}if (t < target) {\r
-if (delta < 0) return t;\r
-} else if (t > target) {\r
-if (delta > 0) return t;\r
-} else {\r
-return (delta > 0 ? (target + 4.9E-324) : (target - 4.9E-324));\r
-}var newt = t + delta;\r
-if (t == newt) {\r
-return t;\r
-}if (delta * origdelta < 0) {\r
-var tag = (origt < t ? java.awt.geom.CubicCurve2D.getTag (target, origt, t) : java.awt.geom.CubicCurve2D.getTag (target, t, origt));\r
-if (tag != 0) {\r
-return (origt + t) / 2;\r
-}t = target;\r
-} else {\r
-t = newt;\r
-}}\r
-}, "~N,~N,~A");\r
-Clazz.defineMethod (c$, "contains", \r
-function (x, y) {\r
-if (!(x * 0.0 + y * 0.0 == 0.0)) {\r
-return false;\r
-}var x1 = this.getX1 ();\r
-var y1 = this.getY1 ();\r
-var x2 = this.getX2 ();\r
-var y2 = this.getY2 ();\r
-var crossings = (jssun.awt.geom.Curve.pointCrossingsForLine (x, y, x1, y1, x2, y2) + jssun.awt.geom.Curve.pointCrossingsForCubic (x, y, x1, y1, this.getCtrlX1 (), this.getCtrlY1 (), this.getCtrlX2 (), this.getCtrlY2 (), x2, y2, 0));\r
-return ((crossings & 1) == 1);\r
-}, "~N,~N");\r
-Clazz.defineMethod (c$, "contains", \r
-function (p) {\r
-return this.contains (p.getX (), p.getY ());\r
-}, "java.awt.geom.Point2D");\r
-c$.fillEqn = Clazz.defineMethod (c$, "fillEqn", \r
- function (eqn, val, c1, cp1, cp2, c2) {\r
-eqn[0] = c1 - val;\r
-eqn[1] = (cp1 - c1) * 3.0;\r
-eqn[2] = (cp2 - cp1 - cp1 + c1) * 3.0;\r
-eqn[3] = c2 + (cp1 - cp2) * 3.0 - c1;\r
-return;\r
-}, "~A,~N,~N,~N,~N,~N");\r
-c$.evalCubic = Clazz.defineMethod (c$, "evalCubic", \r
- function (vals, num, include0, include1, inflect, c1, cp1, cp2, c2) {\r
-var j = 0;\r
-for (var i = 0; i < num; i++) {\r
-var t = vals[i];\r
-if ((include0 ? t >= 0 : t > 0) && (include1 ? t <= 1 : t < 1) && (inflect == null || inflect[1] + (2 * inflect[2] + 3 * inflect[3] * t) * t != 0)) {\r
-var u = 1 - t;\r
-vals[j++] = c1 * u * u * u + 3 * cp1 * t * u * u + 3 * cp2 * t * t * u + c2 * t * t * t;\r
-}}\r
-return j;\r
-}, "~A,~N,~B,~B,~A,~N,~N,~N,~N");\r
-c$.getTag = Clazz.defineMethod (c$, "getTag", \r
- function (coord, low, high) {\r
-if (coord <= low) {\r
-return (coord < low ? -2 : -1);\r
-}if (coord >= high) {\r
-return (coord > high ? 2 : 1);\r
-}return 0;\r
-}, "~N,~N,~N");\r
-c$.inwards = Clazz.defineMethod (c$, "inwards", \r
- function (pttag, opt1tag, opt2tag) {\r
-switch (pttag) {\r
-case -2:\r
-case 2:\r
-default:\r
-return false;\r
-case -1:\r
-return (opt1tag >= 0 || opt2tag >= 0);\r
-case 0:\r
-return true;\r
-case 1:\r
-return (opt1tag <= 0 || opt2tag <= 0);\r
-}\r
-}, "~N,~N,~N");\r
-Clazz.defineMethod (c$, "intersects", \r
-function (x, y, w, h) {\r
-if (w <= 0 || h <= 0) {\r
-return false;\r
-}var x1 = this.getX1 ();\r
-var y1 = this.getY1 ();\r
-var x1tag = java.awt.geom.CubicCurve2D.getTag (x1, x, x + w);\r
-var y1tag = java.awt.geom.CubicCurve2D.getTag (y1, y, y + h);\r
-if (x1tag == 0 && y1tag == 0) {\r
-return true;\r
-}var x2 = this.getX2 ();\r
-var y2 = this.getY2 ();\r
-var x2tag = java.awt.geom.CubicCurve2D.getTag (x2, x, x + w);\r
-var y2tag = java.awt.geom.CubicCurve2D.getTag (y2, y, y + h);\r
-if (x2tag == 0 && y2tag == 0) {\r
-return true;\r
-}var ctrlx1 = this.getCtrlX1 ();\r
-var ctrly1 = this.getCtrlY1 ();\r
-var ctrlx2 = this.getCtrlX2 ();\r
-var ctrly2 = this.getCtrlY2 ();\r
-var ctrlx1tag = java.awt.geom.CubicCurve2D.getTag (ctrlx1, x, x + w);\r
-var ctrly1tag = java.awt.geom.CubicCurve2D.getTag (ctrly1, y, y + h);\r
-var ctrlx2tag = java.awt.geom.CubicCurve2D.getTag (ctrlx2, x, x + w);\r
-var ctrly2tag = java.awt.geom.CubicCurve2D.getTag (ctrly2, y, y + h);\r
-if (x1tag < 0 && x2tag < 0 && ctrlx1tag < 0 && ctrlx2tag < 0) {\r
-return false;\r
-}if (y1tag < 0 && y2tag < 0 && ctrly1tag < 0 && ctrly2tag < 0) {\r
-return false;\r
-}if (x1tag > 0 && x2tag > 0 && ctrlx1tag > 0 && ctrlx2tag > 0) {\r
-return false;\r
-}if (y1tag > 0 && y2tag > 0 && ctrly1tag > 0 && ctrly2tag > 0) {\r
-return false;\r
-}if (java.awt.geom.CubicCurve2D.inwards (x1tag, x2tag, ctrlx1tag) && java.awt.geom.CubicCurve2D.inwards (y1tag, y2tag, ctrly1tag)) {\r
-return true;\r
-}if (java.awt.geom.CubicCurve2D.inwards (x2tag, x1tag, ctrlx2tag) && java.awt.geom.CubicCurve2D.inwards (y2tag, y1tag, ctrly2tag)) {\r
-return true;\r
-}var xoverlap = (x1tag * x2tag <= 0);\r
-var yoverlap = (y1tag * y2tag <= 0);\r
-if (x1tag == 0 && x2tag == 0 && yoverlap) {\r
-return true;\r
-}if (y1tag == 0 && y2tag == 0 && xoverlap) {\r
-return true;\r
-}var eqn =  Clazz.newDoubleArray (4, 0);\r
-var res =  Clazz.newDoubleArray (4, 0);\r
-if (!yoverlap) {\r
-java.awt.geom.CubicCurve2D.fillEqn (eqn, (y1tag < 0 ? y : y + h), y1, ctrly1, ctrly2, y2);\r
-var num = java.awt.geom.CubicCurve2D.solveCubic (eqn, res);\r
-num = java.awt.geom.CubicCurve2D.evalCubic (res, num, true, true, null, x1, ctrlx1, ctrlx2, x2);\r
-return (num == 2 && java.awt.geom.CubicCurve2D.getTag (res[0], x, x + w) * java.awt.geom.CubicCurve2D.getTag (res[1], x, x + w) <= 0);\r
-}if (!xoverlap) {\r
-java.awt.geom.CubicCurve2D.fillEqn (eqn, (x1tag < 0 ? x : x + w), x1, ctrlx1, ctrlx2, x2);\r
-var num = java.awt.geom.CubicCurve2D.solveCubic (eqn, res);\r
-num = java.awt.geom.CubicCurve2D.evalCubic (res, num, true, true, null, y1, ctrly1, ctrly2, y2);\r
-return (num == 2 && java.awt.geom.CubicCurve2D.getTag (res[0], y, y + h) * java.awt.geom.CubicCurve2D.getTag (res[1], y, y + h) <= 0);\r
-}var dx = x2 - x1;\r
-var dy = y2 - y1;\r
-var k = y2 * x1 - x2 * y1;\r
-var c1tag;\r
-var c2tag;\r
-if (y1tag == 0) {\r
-c1tag = x1tag;\r
-} else {\r
-c1tag = java.awt.geom.CubicCurve2D.getTag ((k + dx * (y1tag < 0 ? y : y + h)) / dy, x, x + w);\r
-}if (y2tag == 0) {\r
-c2tag = x2tag;\r
-} else {\r
-c2tag = java.awt.geom.CubicCurve2D.getTag ((k + dx * (y2tag < 0 ? y : y + h)) / dy, x, x + w);\r
-}if (c1tag * c2tag <= 0) {\r
-return true;\r
-}c1tag = ((c1tag * x1tag <= 0) ? y1tag : y2tag);\r
-java.awt.geom.CubicCurve2D.fillEqn (eqn, (c2tag < 0 ? x : x + w), x1, ctrlx1, ctrlx2, x2);\r
-var num = java.awt.geom.CubicCurve2D.solveCubic (eqn, res);\r
-num = java.awt.geom.CubicCurve2D.evalCubic (res, num, true, true, null, y1, ctrly1, ctrly2, y2);\r
-var tags =  Clazz.newIntArray (num + 1, 0);\r
-for (var i = 0; i < num; i++) {\r
-tags[i] = java.awt.geom.CubicCurve2D.getTag (res[i], y, y + h);\r
-}\r
-tags[num] = c1tag;\r
-java.util.Arrays.sort (tags);\r
-return ((num >= 1 && tags[0] * tags[1] <= 0) || (num >= 3 && tags[2] * tags[3] <= 0));\r
-}, "~N,~N,~N,~N");\r
-Clazz.defineMethod (c$, "intersects", \r
-function (r) {\r
-return this.intersects (r.getX (), r.getY (), r.getWidth (), r.getHeight ());\r
-}, "java.awt.geom.Rectangle2D");\r
-Clazz.defineMethod (c$, "contains", \r
-function (x, y, w, h) {\r
-if (w <= 0 || h <= 0) {\r
-return false;\r
-}if (!(this.contains (x, y) && this.contains (x + w, y) && this.contains (x + w, y + h) && this.contains (x, y + h))) {\r
-return false;\r
-}var rect =  new java.awt.geom.Rectangle2D.Double (x, y, w, h);\r
-return !rect.intersectsLine (this.getX1 (), this.getY1 (), this.getX2 (), this.getY2 ());\r
-}, "~N,~N,~N,~N");\r
-Clazz.defineMethod (c$, "contains", \r
-function (r) {\r
-return this.contains (r.getX (), r.getY (), r.getWidth (), r.getHeight ());\r
-}, "java.awt.geom.Rectangle2D");\r
-Clazz.overrideMethod (c$, "getBounds", \r
-function () {\r
-return this.getBounds2D ().getBounds ();\r
-});\r
-Clazz.defineMethod (c$, "getPathIterator", \r
-function (at) {\r
-return (swingjs.api.Interface.getInstance ("java.awt.geom.CubicInterator", false)).set (this, at);\r
-}, "java.awt.geom.AffineTransform");\r
-Clazz.defineMethod (c$, "getPathIterator", \r
-function (at, flatness) {\r
-return  new java.awt.geom.FlatteningPathIterator (this.getPathIterator (at), flatness);\r
-}, "java.awt.geom.AffineTransform,~N");\r
-Clazz.defineMethod (c$, "clone", \r
-function () {\r
-try {\r
-return Clazz.superCall (this, java.awt.geom.CubicCurve2D, "clone", []);\r
-} catch (e) {\r
-if (Clazz.exceptionOf (e, CloneNotSupportedException)) {\r
-throw  new InternalError ();\r
-} else {\r
-throw e;\r
-}\r
-}\r
-});\r
-Clazz.pu$h(self.c$);\r
-c$ = Clazz.decorateAsClass (function () {\r
-this.x1 = 0;\r
-this.y1 = 0;\r
-this.ctrlx1 = 0;\r
-this.ctrly1 = 0;\r
-this.ctrlx2 = 0;\r
-this.ctrly2 = 0;\r
-this.x2 = 0;\r
-this.y2 = 0;\r
-Clazz.instantialize (this, arguments);\r
-}, java.awt.geom.CubicCurve2D, "Float", java.awt.geom.CubicCurve2D);\r
-Clazz.makeConstructor (c$, \r
-function () {\r
-Clazz.superConstructor (this, java.awt.geom.CubicCurve2D.Float, []);\r
-});\r
-Clazz.makeConstructor (c$, \r
-function (a, b, c, d, e, f, g, h) {\r
-Clazz.superConstructor (this, java.awt.geom.CubicCurve2D.Float, []);\r
-this.setCurve (a, b, c, d, e, f, g, h);\r
-}, "~N,~N,~N,~N,~N,~N,~N,~N");\r
-Clazz.overrideMethod (c$, "getX1", \r
-function () {\r
-return this.x1;\r
-});\r
-Clazz.overrideMethod (c$, "getY1", \r
-function () {\r
-return this.y1;\r
-});\r
-Clazz.overrideMethod (c$, "getP1", \r
-function () {\r
-return  new java.awt.geom.Point2D.Float (this.x1, this.y1);\r
-});\r
-Clazz.overrideMethod (c$, "getCtrlX1", \r
-function () {\r
-return this.ctrlx1;\r
-});\r
-Clazz.overrideMethod (c$, "getCtrlY1", \r
-function () {\r
-return this.ctrly1;\r
-});\r
-Clazz.overrideMethod (c$, "getCtrlP1", \r
-function () {\r
-return  new java.awt.geom.Point2D.Float (this.ctrlx1, this.ctrly1);\r
-});\r
-Clazz.overrideMethod (c$, "getCtrlX2", \r
-function () {\r
-return this.ctrlx2;\r
-});\r
-Clazz.overrideMethod (c$, "getCtrlY2", \r
-function () {\r
-return this.ctrly2;\r
-});\r
-Clazz.overrideMethod (c$, "getCtrlP2", \r
-function () {\r
-return  new java.awt.geom.Point2D.Float (this.ctrlx2, this.ctrly2);\r
-});\r
-Clazz.overrideMethod (c$, "getX2", \r
-function () {\r
-return this.x2;\r
-});\r
-Clazz.overrideMethod (c$, "getY2", \r
-function () {\r
-return this.y2;\r
-});\r
-Clazz.overrideMethod (c$, "getP2", \r
-function () {\r
-return  new java.awt.geom.Point2D.Float (this.x2, this.y2);\r
-});\r
-Clazz.defineMethod (c$, "setCurve", \r
-function (a, b, c, d, e, f, g, h) {\r
-this.x1 = a;\r
-this.y1 = b;\r
-this.ctrlx1 = c;\r
-this.ctrly1 = d;\r
-this.ctrlx2 = e;\r
-this.ctrly2 = f;\r
-this.x2 = g;\r
-this.y2 = h;\r
-}, "~N,~N,~N,~N,~N,~N,~N,~N");\r
-Clazz.defineMethod (c$, "setCurve", \r
-function (a, b, c, d, e, f, g, h) {\r
-this.x1 = a;\r
-this.y1 = b;\r
-this.ctrlx1 = c;\r
-this.ctrly1 = d;\r
-this.ctrlx2 = e;\r
-this.ctrly2 = f;\r
-this.x2 = g;\r
-this.y2 = h;\r
-}, "~N,~N,~N,~N,~N,~N,~N,~N");\r
-Clazz.overrideMethod (c$, "getBounds2D", \r
-function () {\r
-var a = Math.min (Math.min (this.x1, this.x2), Math.min (this.ctrlx1, this.ctrlx2));\r
-var b = Math.min (Math.min (this.y1, this.y2), Math.min (this.ctrly1, this.ctrly2));\r
-var c = Math.max (Math.max (this.x1, this.x2), Math.max (this.ctrlx1, this.ctrlx2));\r
-var d = Math.max (Math.max (this.y1, this.y2), Math.max (this.ctrly1, this.ctrly2));\r
-return  new java.awt.geom.Rectangle2D.Float (a, b, c - a, d - b);\r
-});\r
-c$ = Clazz.p0p ();\r
-Clazz.pu$h(self.c$);\r
-c$ = Clazz.decorateAsClass (function () {\r
-this.x1 = 0;\r
-this.y1 = 0;\r
-this.ctrlx1 = 0;\r
-this.ctrly1 = 0;\r
-this.ctrlx2 = 0;\r
-this.ctrly2 = 0;\r
-this.x2 = 0;\r
-this.y2 = 0;\r
-Clazz.instantialize (this, arguments);\r
-}, java.awt.geom.CubicCurve2D, "Double", java.awt.geom.CubicCurve2D);\r
-Clazz.makeConstructor (c$, \r
-function () {\r
-Clazz.superConstructor (this, java.awt.geom.CubicCurve2D.Double, []);\r
-});\r
-Clazz.makeConstructor (c$, \r
-function (a, b, c, d, e, f, g, h) {\r
-Clazz.superConstructor (this, java.awt.geom.CubicCurve2D.Double, []);\r
-this.setCurve (a, b, c, d, e, f, g, h);\r
-}, "~N,~N,~N,~N,~N,~N,~N,~N");\r
-Clazz.overrideMethod (c$, "getX1", \r
-function () {\r
-return this.x1;\r
-});\r
-Clazz.overrideMethod (c$, "getY1", \r
-function () {\r
-return this.y1;\r
-});\r
-Clazz.overrideMethod (c$, "getP1", \r
-function () {\r
-return  new java.awt.geom.Point2D.Double (this.x1, this.y1);\r
-});\r
-Clazz.overrideMethod (c$, "getCtrlX1", \r
-function () {\r
-return this.ctrlx1;\r
-});\r
-Clazz.overrideMethod (c$, "getCtrlY1", \r
-function () {\r
-return this.ctrly1;\r
-});\r
-Clazz.overrideMethod (c$, "getCtrlP1", \r
-function () {\r
-return  new java.awt.geom.Point2D.Double (this.ctrlx1, this.ctrly1);\r
-});\r
-Clazz.overrideMethod (c$, "getCtrlX2", \r
-function () {\r
-return this.ctrlx2;\r
-});\r
-Clazz.overrideMethod (c$, "getCtrlY2", \r
-function () {\r
-return this.ctrly2;\r
-});\r
-Clazz.overrideMethod (c$, "getCtrlP2", \r
-function () {\r
-return  new java.awt.geom.Point2D.Double (this.ctrlx2, this.ctrly2);\r
-});\r
-Clazz.overrideMethod (c$, "getX2", \r
-function () {\r
-return this.x2;\r
-});\r
-Clazz.overrideMethod (c$, "getY2", \r
-function () {\r
-return this.y2;\r
-});\r
-Clazz.overrideMethod (c$, "getP2", \r
-function () {\r
-return  new java.awt.geom.Point2D.Double (this.x2, this.y2);\r
-});\r
-Clazz.defineMethod (c$, "setCurve", \r
-function (a, b, c, d, e, f, g, h) {\r
-this.x1 = a;\r
-this.y1 = b;\r
-this.ctrlx1 = c;\r
-this.ctrly1 = d;\r
-this.ctrlx2 = e;\r
-this.ctrly2 = f;\r
-this.x2 = g;\r
-this.y2 = h;\r
-}, "~N,~N,~N,~N,~N,~N,~N,~N");\r
-Clazz.overrideMethod (c$, "getBounds2D", \r
-function () {\r
-var a = Math.min (Math.min (this.x1, this.x2), Math.min (this.ctrlx1, this.ctrlx2));\r
-var b = Math.min (Math.min (this.y1, this.y2), Math.min (this.ctrly1, this.ctrly2));\r
-var c = Math.max (Math.max (this.x1, this.x2), Math.max (this.ctrlx1, this.ctrlx2));\r
-var d = Math.max (Math.max (this.y1, this.y2), Math.max (this.ctrly1, this.ctrly2));\r
-return  new java.awt.geom.Rectangle2D.Double (a, b, c - a, d - b);\r
-});\r
-c$ = Clazz.p0p ();\r
-Clazz.defineStatics (c$,\r
-"BELOW", -2,\r
-"LOWEDGE", -1,\r
-"INSIDE", 0,\r
-"HIGHEDGE", 1,\r
-"ABOVE", 2);\r
-});\r
+Clazz.declarePackage ("java.awt.geom");
+Clazz.load (["java.awt.Shape"], "java.awt.geom.CubicCurve2D", ["java.lang.InternalError", "java.util.Arrays", "java.awt.geom.FlatteningPathIterator", "$.Line2D", "$.Point2D", "$.QuadCurve2D", "$.Rectangle2D", "jssun.awt.geom.Curve", "swingjs.api.Interface"], function () {
+c$ = Clazz.declareType (java.awt.geom, "CubicCurve2D", null, [java.awt.Shape, Cloneable]);
+Clazz.makeConstructor (c$, 
+function () {
+});
+Clazz.defineMethod (c$, "setCurve", 
+function (coords, offset) {
+this.setCurve (coords[offset + 0], coords[offset + 1], coords[offset + 2], coords[offset + 3], coords[offset + 4], coords[offset + 5], coords[offset + 6], coords[offset + 7]);
+}, "~A,~N");
+Clazz.defineMethod (c$, "setCurve", 
+function (p1, cp1, cp2, p2) {
+this.setCurve (p1.getX (), p1.getY (), cp1.getX (), cp1.getY (), cp2.getX (), cp2.getY (), p2.getX (), p2.getY ());
+}, "java.awt.geom.Point2D,java.awt.geom.Point2D,java.awt.geom.Point2D,java.awt.geom.Point2D");
+Clazz.defineMethod (c$, "setCurve", 
+function (pts, offset) {
+this.setCurve (pts[offset + 0].getX (), pts[offset + 0].getY (), pts[offset + 1].getX (), pts[offset + 1].getY (), pts[offset + 2].getX (), pts[offset + 2].getY (), pts[offset + 3].getX (), pts[offset + 3].getY ());
+}, "~A,~N");
+Clazz.defineMethod (c$, "setCurve", 
+function (c) {
+this.setCurve (c.getX1 (), c.getY1 (), c.getCtrlX1 (), c.getCtrlY1 (), c.getCtrlX2 (), c.getCtrlY2 (), c.getX2 (), c.getY2 ());
+}, "java.awt.geom.CubicCurve2D");
+c$.getFlatnessSq = Clazz.defineMethod (c$, "getFlatnessSq", 
+function (x1, y1, ctrlx1, ctrly1, ctrlx2, ctrly2, x2, y2) {
+return Math.max (java.awt.geom.Line2D.ptSegDistSq (x1, y1, x2, y2, ctrlx1, ctrly1), java.awt.geom.Line2D.ptSegDistSq (x1, y1, x2, y2, ctrlx2, ctrly2));
+}, "~N,~N,~N,~N,~N,~N,~N,~N");
+c$.getFlatness = Clazz.defineMethod (c$, "getFlatness", 
+function (x1, y1, ctrlx1, ctrly1, ctrlx2, ctrly2, x2, y2) {
+return Math.sqrt (java.awt.geom.CubicCurve2D.getFlatnessSq (x1, y1, ctrlx1, ctrly1, ctrlx2, ctrly2, x2, y2));
+}, "~N,~N,~N,~N,~N,~N,~N,~N");
+c$.getFlatnessSq = Clazz.defineMethod (c$, "getFlatnessSq", 
+function (coords, offset) {
+return java.awt.geom.CubicCurve2D.getFlatnessSq (coords[offset + 0], coords[offset + 1], coords[offset + 2], coords[offset + 3], coords[offset + 4], coords[offset + 5], coords[offset + 6], coords[offset + 7]);
+}, "~A,~N");
+c$.getFlatness = Clazz.defineMethod (c$, "getFlatness", 
+function (coords, offset) {
+return java.awt.geom.CubicCurve2D.getFlatness (coords[offset + 0], coords[offset + 1], coords[offset + 2], coords[offset + 3], coords[offset + 4], coords[offset + 5], coords[offset + 6], coords[offset + 7]);
+}, "~A,~N");
+Clazz.defineMethod (c$, "getFlatnessSq", 
+function () {
+return java.awt.geom.CubicCurve2D.getFlatnessSq (this.getX1 (), this.getY1 (), this.getCtrlX1 (), this.getCtrlY1 (), this.getCtrlX2 (), this.getCtrlY2 (), this.getX2 (), this.getY2 ());
+});
+Clazz.defineMethod (c$, "getFlatness", 
+function () {
+return java.awt.geom.CubicCurve2D.getFlatness (this.getX1 (), this.getY1 (), this.getCtrlX1 (), this.getCtrlY1 (), this.getCtrlX2 (), this.getCtrlY2 (), this.getX2 (), this.getY2 ());
+});
+Clazz.defineMethod (c$, "subdivide", 
+function (left, right) {
+java.awt.geom.CubicCurve2D.subdivide (this, left, right);
+}, "java.awt.geom.CubicCurve2D,java.awt.geom.CubicCurve2D");
+c$.subdivide = Clazz.defineMethod (c$, "subdivide", 
+function (src, left, right) {
+var x1 = src.getX1 ();
+var y1 = src.getY1 ();
+var ctrlx1 = src.getCtrlX1 ();
+var ctrly1 = src.getCtrlY1 ();
+var ctrlx2 = src.getCtrlX2 ();
+var ctrly2 = src.getCtrlY2 ();
+var x2 = src.getX2 ();
+var y2 = src.getY2 ();
+var centerx = (ctrlx1 + ctrlx2) / 2.0;
+var centery = (ctrly1 + ctrly2) / 2.0;
+ctrlx1 = (x1 + ctrlx1) / 2.0;
+ctrly1 = (y1 + ctrly1) / 2.0;
+ctrlx2 = (x2 + ctrlx2) / 2.0;
+ctrly2 = (y2 + ctrly2) / 2.0;
+var ctrlx12 = (ctrlx1 + centerx) / 2.0;
+var ctrly12 = (ctrly1 + centery) / 2.0;
+var ctrlx21 = (ctrlx2 + centerx) / 2.0;
+var ctrly21 = (ctrly2 + centery) / 2.0;
+centerx = (ctrlx12 + ctrlx21) / 2.0;
+centery = (ctrly12 + ctrly21) / 2.0;
+if (left != null) {
+left.setCurve (x1, y1, ctrlx1, ctrly1, ctrlx12, ctrly12, centerx, centery);
+}if (right != null) {
+right.setCurve (centerx, centery, ctrlx21, ctrly21, ctrlx2, ctrly2, x2, y2);
+}}, "java.awt.geom.CubicCurve2D,java.awt.geom.CubicCurve2D,java.awt.geom.CubicCurve2D");
+c$.subdivide = Clazz.defineMethod (c$, "subdivide", 
+function (src, srcoff, left, leftoff, right, rightoff) {
+var x1 = src[srcoff + 0];
+var y1 = src[srcoff + 1];
+var ctrlx1 = src[srcoff + 2];
+var ctrly1 = src[srcoff + 3];
+var ctrlx2 = src[srcoff + 4];
+var ctrly2 = src[srcoff + 5];
+var x2 = src[srcoff + 6];
+var y2 = src[srcoff + 7];
+if (left != null) {
+left[leftoff + 0] = x1;
+left[leftoff + 1] = y1;
+}if (right != null) {
+right[rightoff + 6] = x2;
+right[rightoff + 7] = y2;
+}x1 = (x1 + ctrlx1) / 2.0;
+y1 = (y1 + ctrly1) / 2.0;
+x2 = (x2 + ctrlx2) / 2.0;
+y2 = (y2 + ctrly2) / 2.0;
+var centerx = (ctrlx1 + ctrlx2) / 2.0;
+var centery = (ctrly1 + ctrly2) / 2.0;
+ctrlx1 = (x1 + centerx) / 2.0;
+ctrly1 = (y1 + centery) / 2.0;
+ctrlx2 = (x2 + centerx) / 2.0;
+ctrly2 = (y2 + centery) / 2.0;
+centerx = (ctrlx1 + ctrlx2) / 2.0;
+centery = (ctrly1 + ctrly2) / 2.0;
+if (left != null) {
+left[leftoff + 2] = x1;
+left[leftoff + 3] = y1;
+left[leftoff + 4] = ctrlx1;
+left[leftoff + 5] = ctrly1;
+left[leftoff + 6] = centerx;
+left[leftoff + 7] = centery;
+}if (right != null) {
+right[rightoff + 0] = centerx;
+right[rightoff + 1] = centery;
+right[rightoff + 2] = ctrlx2;
+right[rightoff + 3] = ctrly2;
+right[rightoff + 4] = x2;
+right[rightoff + 5] = y2;
+}}, "~A,~N,~A,~N,~A,~N");
+c$.solveCubic = Clazz.defineMethod (c$, "solveCubic", 
+function (eqn) {
+return java.awt.geom.CubicCurve2D.solveCubic (eqn, eqn);
+}, "~A");
+c$.solveCubic = Clazz.defineMethod (c$, "solveCubic", 
+function (eqn, res) {
+var d = eqn[3];
+if (d == 0.0) {
+return java.awt.geom.QuadCurve2D.solveQuadratic (eqn, res);
+}var a = eqn[2] / d;
+var b = eqn[1] / d;
+var c = eqn[0] / d;
+var roots = 0;
+var Q = (a * a - 3.0 * b) / 9.0;
+var R = (2.0 * a * a * a - 9.0 * a * b + 27.0 * c) / 54.0;
+var R2 = R * R;
+var Q3 = Q * Q * Q;
+a = a / 3.0;
+if (R2 < Q3) {
+var theta = Math.acos (R / Math.sqrt (Q3));
+Q = -2.0 * Math.sqrt (Q);
+if (res === eqn) {
+eqn =  Clazz.newDoubleArray (4, 0);
+System.arraycopy (res, 0, eqn, 0, 4);
+}res[roots++] = Q * Math.cos (theta / 3.0) - a;
+res[roots++] = Q * Math.cos ((theta + 6.283185307179586) / 3.0) - a;
+res[roots++] = Q * Math.cos ((theta - 6.283185307179586) / 3.0) - a;
+java.awt.geom.CubicCurve2D.fixRoots (res, eqn);
+} else {
+var neg = (R < 0.0);
+var S = Math.sqrt (R2 - Q3);
+if (neg) {
+R = -R;
+}var A = Math.pow (R + S, 0.3333333333333333);
+if (!neg) {
+A = -A;
+}var B = (A == 0.0) ? 0.0 : (Q / A);
+res[roots++] = (A + B) - a;
+}return roots;
+}, "~A,~A");
+c$.fixRoots = Clazz.defineMethod (c$, "fixRoots", 
+ function (res, eqn) {
+var EPSILON = 1E-5;
+for (var i = 0; i < 3; i++) {
+var t = res[i];
+if (Math.abs (t) < 1.0E-5) {
+res[i] = java.awt.geom.CubicCurve2D.findZero (t, 0, eqn);
+} else if (Math.abs (t - 1) < 1.0E-5) {
+res[i] = java.awt.geom.CubicCurve2D.findZero (t, 1, eqn);
+}}
+}, "~A,~A");
+c$.solveEqn = Clazz.defineMethod (c$, "solveEqn", 
+ function (eqn, order, t) {
+var v = eqn[order];
+while (--order >= 0) {
+v = v * t + eqn[order];
+}
+return v;
+}, "~A,~N,~N");
+c$.findZero = Clazz.defineMethod (c$, "findZero", 
+ function (t, target, eqn) {
+var slopeqn =  Clazz.newDoubleArray (-1, [eqn[1], 2 * eqn[2], 3 * eqn[3]]);
+var slope;
+var origdelta = 0;
+var origt = t;
+while (true) {
+slope = java.awt.geom.CubicCurve2D.solveEqn (slopeqn, 2, t);
+if (slope == 0) {
+return t;
+}var y = java.awt.geom.CubicCurve2D.solveEqn (eqn, 3, t);
+if (y == 0) {
+return t;
+}var delta = -(y / slope);
+if (origdelta == 0) {
+origdelta = delta;
+}if (t < target) {
+if (delta < 0) return t;
+} else if (t > target) {
+if (delta > 0) return t;
+} else {
+return (delta > 0 ? (target + 4.9E-324) : (target - 4.9E-324));
+}var newt = t + delta;
+if (t == newt) {
+return t;
+}if (delta * origdelta < 0) {
+var tag = (origt < t ? java.awt.geom.CubicCurve2D.getTag (target, origt, t) : java.awt.geom.CubicCurve2D.getTag (target, t, origt));
+if (tag != 0) {
+return (origt + t) / 2;
+}t = target;
+} else {
+t = newt;
+}}
+}, "~N,~N,~A");
+Clazz.defineMethod (c$, "contains", 
+function (x, y) {
+if (!(x * 0.0 + y * 0.0 == 0.0)) {
+return false;
+}var x1 = this.getX1 ();
+var y1 = this.getY1 ();
+var x2 = this.getX2 ();
+var y2 = this.getY2 ();
+var crossings = (jssun.awt.geom.Curve.pointCrossingsForLine (x, y, x1, y1, x2, y2) + jssun.awt.geom.Curve.pointCrossingsForCubic (x, y, x1, y1, this.getCtrlX1 (), this.getCtrlY1 (), this.getCtrlX2 (), this.getCtrlY2 (), x2, y2, 0));
+return ((crossings & 1) == 1);
+}, "~N,~N");
+Clazz.defineMethod (c$, "contains", 
+function (p) {
+return this.contains (p.getX (), p.getY ());
+}, "java.awt.geom.Point2D");
+c$.fillEqn = Clazz.defineMethod (c$, "fillEqn", 
+ function (eqn, val, c1, cp1, cp2, c2) {
+eqn[0] = c1 - val;
+eqn[1] = (cp1 - c1) * 3.0;
+eqn[2] = (cp2 - cp1 - cp1 + c1) * 3.0;
+eqn[3] = c2 + (cp1 - cp2) * 3.0 - c1;
+return;
+}, "~A,~N,~N,~N,~N,~N");
+c$.evalCubic = Clazz.defineMethod (c$, "evalCubic", 
+ function (vals, num, include0, include1, inflect, c1, cp1, cp2, c2) {
+var j = 0;
+for (var i = 0; i < num; i++) {
+var t = vals[i];
+if ((include0 ? t >= 0 : t > 0) && (include1 ? t <= 1 : t < 1) && (inflect == null || inflect[1] + (2 * inflect[2] + 3 * inflect[3] * t) * t != 0)) {
+var u = 1 - t;
+vals[j++] = c1 * u * u * u + 3 * cp1 * t * u * u + 3 * cp2 * t * t * u + c2 * t * t * t;
+}}
+return j;
+}, "~A,~N,~B,~B,~A,~N,~N,~N,~N");
+c$.getTag = Clazz.defineMethod (c$, "getTag", 
+ function (coord, low, high) {
+if (coord <= low) {
+return (coord < low ? -2 : -1);
+}if (coord >= high) {
+return (coord > high ? 2 : 1);
+}return 0;
+}, "~N,~N,~N");
+c$.inwards = Clazz.defineMethod (c$, "inwards", 
+ function (pttag, opt1tag, opt2tag) {
+switch (pttag) {
+case -2:
+case 2:
+default:
+return false;
+case -1:
+return (opt1tag >= 0 || opt2tag >= 0);
+case 0:
+return true;
+case 1:
+return (opt1tag <= 0 || opt2tag <= 0);
+}
+}, "~N,~N,~N");
+Clazz.defineMethod (c$, "intersects", 
+function (x, y, w, h) {
+if (w <= 0 || h <= 0) {
+return false;
+}var x1 = this.getX1 ();
+var y1 = this.getY1 ();
+var x1tag = java.awt.geom.CubicCurve2D.getTag (x1, x, x + w);
+var y1tag = java.awt.geom.CubicCurve2D.getTag (y1, y, y + h);
+if (x1tag == 0 && y1tag == 0) {
+return true;
+}var x2 = this.getX2 ();
+var y2 = this.getY2 ();
+var x2tag = java.awt.geom.CubicCurve2D.getTag (x2, x, x + w);
+var y2tag = java.awt.geom.CubicCurve2D.getTag (y2, y, y + h);
+if (x2tag == 0 && y2tag == 0) {
+return true;
+}var ctrlx1 = this.getCtrlX1 ();
+var ctrly1 = this.getCtrlY1 ();
+var ctrlx2 = this.getCtrlX2 ();
+var ctrly2 = this.getCtrlY2 ();
+var ctrlx1tag = java.awt.geom.CubicCurve2D.getTag (ctrlx1, x, x + w);
+var ctrly1tag = java.awt.geom.CubicCurve2D.getTag (ctrly1, y, y + h);
+var ctrlx2tag = java.awt.geom.CubicCurve2D.getTag (ctrlx2, x, x + w);
+var ctrly2tag = java.awt.geom.CubicCurve2D.getTag (ctrly2, y, y + h);
+if (x1tag < 0 && x2tag < 0 && ctrlx1tag < 0 && ctrlx2tag < 0) {
+return false;
+}if (y1tag < 0 && y2tag < 0 && ctrly1tag < 0 && ctrly2tag < 0) {
+return false;
+}if (x1tag > 0 && x2tag > 0 && ctrlx1tag > 0 && ctrlx2tag > 0) {
+return false;
+}if (y1tag > 0 && y2tag > 0 && ctrly1tag > 0 && ctrly2tag > 0) {
+return false;
+}if (java.awt.geom.CubicCurve2D.inwards (x1tag, x2tag, ctrlx1tag) && java.awt.geom.CubicCurve2D.inwards (y1tag, y2tag, ctrly1tag)) {
+return true;
+}if (java.awt.geom.CubicCurve2D.inwards (x2tag, x1tag, ctrlx2tag) && java.awt.geom.CubicCurve2D.inwards (y2tag, y1tag, ctrly2tag)) {
+return true;
+}var xoverlap = (x1tag * x2tag <= 0);
+var yoverlap = (y1tag * y2tag <= 0);
+if (x1tag == 0 && x2tag == 0 && yoverlap) {
+return true;
+}if (y1tag == 0 && y2tag == 0 && xoverlap) {
+return true;
+}var eqn =  Clazz.newDoubleArray (4, 0);
+var res =  Clazz.newDoubleArray (4, 0);
+if (!yoverlap) {
+java.awt.geom.CubicCurve2D.fillEqn (eqn, (y1tag < 0 ? y : y + h), y1, ctrly1, ctrly2, y2);
+var num = java.awt.geom.CubicCurve2D.solveCubic (eqn, res);
+num = java.awt.geom.CubicCurve2D.evalCubic (res, num, true, true, null, x1, ctrlx1, ctrlx2, x2);
+return (num == 2 && java.awt.geom.CubicCurve2D.getTag (res[0], x, x + w) * java.awt.geom.CubicCurve2D.getTag (res[1], x, x + w) <= 0);
+}if (!xoverlap) {
+java.awt.geom.CubicCurve2D.fillEqn (eqn, (x1tag < 0 ? x : x + w), x1, ctrlx1, ctrlx2, x2);
+var num = java.awt.geom.CubicCurve2D.solveCubic (eqn, res);
+num = java.awt.geom.CubicCurve2D.evalCubic (res, num, true, true, null, y1, ctrly1, ctrly2, y2);
+return (num == 2 && java.awt.geom.CubicCurve2D.getTag (res[0], y, y + h) * java.awt.geom.CubicCurve2D.getTag (res[1], y, y + h) <= 0);
+}var dx = x2 - x1;
+var dy = y2 - y1;
+var k = y2 * x1 - x2 * y1;
+var c1tag;
+var c2tag;
+if (y1tag == 0) {
+c1tag = x1tag;
+} else {
+c1tag = java.awt.geom.CubicCurve2D.getTag ((k + dx * (y1tag < 0 ? y : y + h)) / dy, x, x + w);
+}if (y2tag == 0) {
+c2tag = x2tag;
+} else {
+c2tag = java.awt.geom.CubicCurve2D.getTag ((k + dx * (y2tag < 0 ? y : y + h)) / dy, x, x + w);
+}if (c1tag * c2tag <= 0) {
+return true;
+}c1tag = ((c1tag * x1tag <= 0) ? y1tag : y2tag);
+java.awt.geom.CubicCurve2D.fillEqn (eqn, (c2tag < 0 ? x : x + w), x1, ctrlx1, ctrlx2, x2);
+var num = java.awt.geom.CubicCurve2D.solveCubic (eqn, res);
+num = java.awt.geom.CubicCurve2D.evalCubic (res, num, true, true, null, y1, ctrly1, ctrly2, y2);
+var tags =  Clazz.newIntArray (num + 1, 0);
+for (var i = 0; i < num; i++) {
+tags[i] = java.awt.geom.CubicCurve2D.getTag (res[i], y, y + h);
+}
+tags[num] = c1tag;
+java.util.Arrays.sort (tags);
+return ((num >= 1 && tags[0] * tags[1] <= 0) || (num >= 3 && tags[2] * tags[3] <= 0));
+}, "~N,~N,~N,~N");
+Clazz.defineMethod (c$, "intersects", 
+function (r) {
+return this.intersects (r.getX (), r.getY (), r.getWidth (), r.getHeight ());
+}, "java.awt.geom.Rectangle2D");
+Clazz.defineMethod (c$, "contains", 
+function (x, y, w, h) {
+if (w <= 0 || h <= 0) {
+return false;
+}if (!(this.contains (x, y) && this.contains (x + w, y) && this.contains (x + w, y + h) && this.contains (x, y + h))) {
+return false;
+}var rect =  new java.awt.geom.Rectangle2D.Double (x, y, w, h);
+return !rect.intersectsLine (this.getX1 (), this.getY1 (), this.getX2 (), this.getY2 ());
+}, "~N,~N,~N,~N");
+Clazz.defineMethod (c$, "contains", 
+function (r) {
+return this.contains (r.getX (), r.getY (), r.getWidth (), r.getHeight ());
+}, "java.awt.geom.Rectangle2D");
+Clazz.overrideMethod (c$, "getBounds", 
+function () {
+return this.getBounds2D ().getBounds ();
+});
+Clazz.defineMethod (c$, "getPathIterator", 
+function (at) {
+return (swingjs.api.Interface.getInstance ("java.awt.geom.CubicInterator", false)).set (this, at);
+}, "java.awt.geom.AffineTransform");
+Clazz.defineMethod (c$, "getPathIterator", 
+function (at, flatness) {
+return  new java.awt.geom.FlatteningPathIterator (this.getPathIterator (at), flatness);
+}, "java.awt.geom.AffineTransform,~N");
+Clazz.defineMethod (c$, "clone", 
+function () {
+try {
+return Clazz.superCall (this, java.awt.geom.CubicCurve2D, "clone", []);
+} catch (e) {
+if (Clazz.exceptionOf (e, CloneNotSupportedException)) {
+throw  new InternalError ();
+} else {
+throw e;
+}
+}
+});
+Clazz.pu$h(self.c$);
+c$ = Clazz.decorateAsClass (function () {
+this.x1 = 0;
+this.y1 = 0;
+this.ctrlx1 = 0;
+this.ctrly1 = 0;
+this.ctrlx2 = 0;
+this.ctrly2 = 0;
+this.x2 = 0;
+this.y2 = 0;
+Clazz.instantialize (this, arguments);
+}, java.awt.geom.CubicCurve2D, "Float", java.awt.geom.CubicCurve2D);
+Clazz.makeConstructor (c$, 
+function () {
+Clazz.superConstructor (this, java.awt.geom.CubicCurve2D.Float, []);
+});
+Clazz.makeConstructor (c$, 
+function (a, b, c, d, e, f, g, h) {
+Clazz.superConstructor (this, java.awt.geom.CubicCurve2D.Float, []);
+this.setCurve (a, b, c, d, e, f, g, h);
+}, "~N,~N,~N,~N,~N,~N,~N,~N");
+Clazz.overrideMethod (c$, "getX1", 
+function () {
+return this.x1;
+});
+Clazz.overrideMethod (c$, "getY1", 
+function () {
+return this.y1;
+});
+Clazz.overrideMethod (c$, "getP1", 
+function () {
+return  new java.awt.geom.Point2D.Float (this.x1, this.y1);
+});
+Clazz.overrideMethod (c$, "getCtrlX1", 
+function () {
+return this.ctrlx1;
+});
+Clazz.overrideMethod (c$, "getCtrlY1", 
+function () {
+return this.ctrly1;
+});
+Clazz.overrideMethod (c$, "getCtrlP1", 
+function () {
+return  new java.awt.geom.Point2D.Float (this.ctrlx1, this.ctrly1);
+});
+Clazz.overrideMethod (c$, "getCtrlX2", 
+function () {
+return this.ctrlx2;
+});
+Clazz.overrideMethod (c$, "getCtrlY2", 
+function () {
+return this.ctrly2;
+});
+Clazz.overrideMethod (c$, "getCtrlP2", 
+function () {
+return  new java.awt.geom.Point2D.Float (this.ctrlx2, this.ctrly2);
+});
+Clazz.overrideMethod (c$, "getX2", 
+function () {
+return this.x2;
+});
+Clazz.overrideMethod (c$, "getY2", 
+function () {
+return this.y2;
+});
+Clazz.overrideMethod (c$, "getP2", 
+function () {
+return  new java.awt.geom.Point2D.Float (this.x2, this.y2);
+});
+Clazz.defineMethod (c$, "setCurve", 
+function (a, b, c, d, e, f, g, h) {
+this.x1 = a;
+this.y1 = b;
+this.ctrlx1 = c;
+this.ctrly1 = d;
+this.ctrlx2 = e;
+this.ctrly2 = f;
+this.x2 = g;
+this.y2 = h;
+}, "~N,~N,~N,~N,~N,~N,~N,~N");
+Clazz.defineMethod (c$, "setCurve", 
+function (a, b, c, d, e, f, g, h) {
+this.x1 = a;
+this.y1 = b;
+this.ctrlx1 = c;
+this.ctrly1 = d;
+this.ctrlx2 = e;
+this.ctrly2 = f;
+this.x2 = g;
+this.y2 = h;
+}, "~N,~N,~N,~N,~N,~N,~N,~N");
+Clazz.overrideMethod (c$, "getBounds2D", 
+function () {
+var a = Math.min (Math.min (this.x1, this.x2), Math.min (this.ctrlx1, this.ctrlx2));
+var b = Math.min (Math.min (this.y1, this.y2), Math.min (this.ctrly1, this.ctrly2));
+var c = Math.max (Math.max (this.x1, this.x2), Math.max (this.ctrlx1, this.ctrlx2));
+var d = Math.max (Math.max (this.y1, this.y2), Math.max (this.ctrly1, this.ctrly2));
+return  new java.awt.geom.Rectangle2D.Float (a, b, c - a, d - b);
+});
+c$ = Clazz.p0p ();
+Clazz.pu$h(self.c$);
+c$ = Clazz.decorateAsClass (function () {
+this.x1 = 0;
+this.y1 = 0;
+this.ctrlx1 = 0;
+this.ctrly1 = 0;
+this.ctrlx2 = 0;
+this.ctrly2 = 0;
+this.x2 = 0;
+this.y2 = 0;
+Clazz.instantialize (this, arguments);
+}, java.awt.geom.CubicCurve2D, "Double", java.awt.geom.CubicCurve2D);
+Clazz.makeConstructor (c$, 
+function () {
+Clazz.superConstructor (this, java.awt.geom.CubicCurve2D.Double, []);
+});
+Clazz.makeConstructor (c$, 
+function (a, b, c, d, e, f, g, h) {
+Clazz.superConstructor (this, java.awt.geom.CubicCurve2D.Double, []);
+this.setCurve (a, b, c, d, e, f, g, h);
+}, "~N,~N,~N,~N,~N,~N,~N,~N");
+Clazz.overrideMethod (c$, "getX1", 
+function () {
+return this.x1;
+});
+Clazz.overrideMethod (c$, "getY1", 
+function () {
+return this.y1;
+});
+Clazz.overrideMethod (c$, "getP1", 
+function () {
+return  new java.awt.geom.Point2D.Double (this.x1, this.y1);
+});
+Clazz.overrideMethod (c$, "getCtrlX1", 
+function () {
+return this.ctrlx1;
+});
+Clazz.overrideMethod (c$, "getCtrlY1", 
+function () {
+return this.ctrly1;
+});
+Clazz.overrideMethod (c$, "getCtrlP1", 
+function () {
+return  new java.awt.geom.Point2D.Double (this.ctrlx1, this.ctrly1);
+});
+Clazz.overrideMethod (c$, "getCtrlX2", 
+function () {
+return this.ctrlx2;
+});
+Clazz.overrideMethod (c$, "getCtrlY2", 
+function () {
+return this.ctrly2;
+});
+Clazz.overrideMethod (c$, "getCtrlP2", 
+function () {
+return  new java.awt.geom.Point2D.Double (this.ctrlx2, this.ctrly2);
+});
+Clazz.overrideMethod (c$, "getX2", 
+function () {
+return this.x2;
+});
+Clazz.overrideMethod (c$, "getY2", 
+function () {
+return this.y2;
+});
+Clazz.overrideMethod (c$, "getP2", 
+function () {
+return  new java.awt.geom.Point2D.Double (this.x2, this.y2);
+});
+Clazz.defineMethod (c$, "setCurve", 
+function (a, b, c, d, e, f, g, h) {
+this.x1 = a;
+this.y1 = b;
+this.ctrlx1 = c;
+this.ctrly1 = d;
+this.ctrlx2 = e;
+this.ctrly2 = f;
+this.x2 = g;
+this.y2 = h;
+}, "~N,~N,~N,~N,~N,~N,~N,~N");
+Clazz.overrideMethod (c$, "getBounds2D", 
+function () {
+var a = Math.min (Math.min (this.x1, this.x2), Math.min (this.ctrlx1, this.ctrlx2));
+var b = Math.min (Math.min (this.y1, this.y2), Math.min (this.ctrly1, this.ctrly2));
+var c = Math.max (Math.max (this.x1, this.x2), Math.max (this.ctrlx1, this.ctrlx2));
+var d = Math.max (Math.max (this.y1, this.y2), Math.max (this.ctrly1, this.ctrly2));
+return  new java.awt.geom.Rectangle2D.Double (a, b, c - a, d - b);
+});
+c$ = Clazz.p0p ();
+Clazz.defineStatics (c$,
+"BELOW", -2,
+"LOWEDGE", -1,
+"INSIDE", 0,
+"HIGHEDGE", 1,
+"ABOVE", 2);
+});