diff options
Diffstat (limited to 'libjava/classpath/java/awt/geom')
-rw-r--r-- | libjava/classpath/java/awt/geom/AffineTransform.java | 38 | ||||
-rw-r--r-- | libjava/classpath/java/awt/geom/Arc2D.java | 138 | ||||
-rw-r--r-- | libjava/classpath/java/awt/geom/Area.java | 1742 | ||||
-rw-r--r-- | libjava/classpath/java/awt/geom/CubicCurve2D.java | 320 | ||||
-rw-r--r-- | libjava/classpath/java/awt/geom/Ellipse2D.java | 6 | ||||
-rw-r--r-- | libjava/classpath/java/awt/geom/FlatteningPathIterator.java | 8 | ||||
-rw-r--r-- | libjava/classpath/java/awt/geom/GeneralPath.java | 517 | ||||
-rw-r--r-- | libjava/classpath/java/awt/geom/Line2D.java | 48 | ||||
-rw-r--r-- | libjava/classpath/java/awt/geom/QuadCurve2D.java | 266 | ||||
-rw-r--r-- | libjava/classpath/java/awt/geom/RectangularShape.java | 12 | ||||
-rw-r--r-- | libjava/classpath/java/awt/geom/RoundRectangle2D.java | 92 |
11 files changed, 1593 insertions, 1594 deletions
diff --git a/libjava/classpath/java/awt/geom/AffineTransform.java b/libjava/classpath/java/awt/geom/AffineTransform.java index 5bc51dd..42590ef 100644 --- a/libjava/classpath/java/awt/geom/AffineTransform.java +++ b/libjava/classpath/java/awt/geom/AffineTransform.java @@ -57,7 +57,7 @@ import java.io.Serializable; * [ 1 ] [ 0 0 1 ] [ 1 ] [ 1 ] * </pre> * The bottom row of the matrix is constant, so a transform can be uniquely - * represented (as in {@link #toString()}) by + * represented (as in {@link #toString()}) by * "[[m00, m01, m02], [m10, m11, m12]]". * * @author Tom Tromey (tromey@cygnus.com) @@ -450,7 +450,7 @@ public class AffineTransform implements Cloneable, Serializable * tx.translate(-x, -y); * </pre> * - * <p>The resulting matrix is: + * <p>The resulting matrix is: * <pre> * [ cos(theta) -sin(theta) x-x*cos+y*sin ] * [ sin(theta) cos(theta) y-x*sin-y*cos ] @@ -521,7 +521,7 @@ public class AffineTransform implements Cloneable, Serializable * TYPE_*_ROTATIONs, and the mutually exclusive TYPE_*_SCALEs. * * @return The type. - * + * * @see #TYPE_IDENTITY * @see #TYPE_TRANSLATION * @see #TYPE_UNIFORM_SCALE @@ -825,7 +825,7 @@ public class AffineTransform implements Cloneable, Serializable * tx.translate(-x, -y); * </pre> * - * <p>The resulting matrix is: + * <p>The resulting matrix is: * <pre> * [ cos(theta) -sin(theta) x-x*cos+y*sin ] * [ sin(theta) cos(theta) y-x*sin-y*cos ] @@ -1002,19 +1002,19 @@ public class AffineTransform implements Cloneable, Serializable * if getDeterminant() has a non-zero value. * * The inverse is calculated as: - * + * * <pre> * * Let A be the matrix for which we want to find the inverse: * * A = [ m00 m01 m02 ] * [ m10 m11 m12 ] - * [ 0 0 1 ] + * [ 0 0 1 ] * * - * 1 - * inverse (A) = --- x adjoint(A) - * det + * 1 + * inverse (A) = --- x adjoint(A) + * det * * * @@ -1043,14 +1043,14 @@ public class AffineTransform implements Cloneable, Serializable double det = getDeterminant(); if (det == 0) throw new NoninvertibleTransformException("can't invert transform"); - + double im00 = m11 / det; double im10 = -m10 / det; double im01 = -m01 / det; double im11 = m00 / det; double im02 = (m01 * m12 - m02 * m11) / det; double im12 = (-m00 * m12 + m10 * m02) / det; - + return new AffineTransform (im00, im10, im01, im11, im02, im12); } @@ -1335,13 +1335,13 @@ public class AffineTransform implements Cloneable, Serializable * which only stores points in float precision. * * @param src the shape source to transform - * @return the shape, transformed by this, <code>null</code> if src is + * @return the shape, transformed by this, <code>null</code> if src is * <code>null</code>. * @see GeneralPath#transform(AffineTransform) */ public Shape createTransformedShape(Shape src) { - if(src == null) + if(src == null) return null; GeneralPath p = new GeneralPath(src); p.transform(this); @@ -1413,12 +1413,12 @@ public class AffineTransform implements Cloneable, Serializable */ public int hashCode() { - long l = Double.doubleToLongBits(m00); - l = l * 31 + Double.doubleToLongBits(m01); - l = l * 31 + Double.doubleToLongBits(m02); - l = l * 31 + Double.doubleToLongBits(m10); - l = l * 31 + Double.doubleToLongBits(m11); - l = l * 31 + Double.doubleToLongBits(m12); + long l = Double.doubleToLongBits(m00); + l = l * 31 + Double.doubleToLongBits(m01); + l = l * 31 + Double.doubleToLongBits(m02); + l = l * 31 + Double.doubleToLongBits(m10); + l = l * 31 + Double.doubleToLongBits(m11); + l = l * 31 + Double.doubleToLongBits(m12); return (int) ((l >> 32) ^ l); } diff --git a/libjava/classpath/java/awt/geom/Arc2D.java b/libjava/classpath/java/awt/geom/Arc2D.java index eb9a160..928c5cf 100644 --- a/libjava/classpath/java/awt/geom/Arc2D.java +++ b/libjava/classpath/java/awt/geom/Arc2D.java @@ -254,9 +254,9 @@ public abstract class Arc2D extends RectangularShape if ((p2.getX() - p1.getX()) * (p3.getY() - p1.getY()) - (p3.getX() - p1.getX()) * (p2.getY() - p1.getY()) > 0) { - Point2D p = p3; - p3 = p1; - p1 = p; + Point2D p = p3; + p3 = p1; + p1 = p; } // normalized tangent vectors @@ -277,7 +277,7 @@ public abstract class Arc2D extends RectangularShape if (theta2 < theta1) theta2 += 2 * Math.PI; - // Vectors of the lines, not normalized, note we change + // Vectors of the lines, not normalized, note we change // the direction of line 2. dx1 = p1.getX() - p2.getX(); dy1 = p1.getY() - p2.getY(); @@ -478,8 +478,8 @@ public abstract class Arc2D extends RectangularShape if (extent < 0) { - end = start; - start += extent; + end = start; + start += extent; } start %= 360; @@ -539,15 +539,15 @@ public abstract class Arc2D extends RectangularShape if (Math.abs(extent) > 180) { - if (containsAngle(angle)) - return true; - return sgn > 0; + if (containsAngle(angle)) + return true; + return sgn > 0; } else { - if (! containsAngle(angle)) - return false; - return sgn < 0; + if (! containsAngle(angle)) + return false; + return sgn < 0; } } @@ -587,11 +587,11 @@ public abstract class Arc2D extends RectangularShape if (getArcType() != CHORD) { - // check intersections against the pie radii - if (rect.intersectsLine(mx, my, x1, y1)) - return true; - if (rect.intersectsLine(mx, my, x2, y2)) - return true; + // check intersections against the pie radii + if (rect.intersectsLine(mx, my, x1, y1)) + return true; + if (rect.intersectsLine(mx, my, x2, y2)) + return true; } else// check the chord if (rect.intersectsLine(x1, y1, x2, y2)) @@ -606,46 +606,46 @@ public abstract class Arc2D extends RectangularShape dx = a * Math.sqrt(1 - ((dy * dy) / (b * b))); if (! java.lang.Double.isNaN(dx)) { - if (mx + dx >= x && mx + dx <= x + w - && containsAngle(Math.toDegrees(Math.atan2(-dy, dx)))) - return true; - if (mx - dx >= x && mx - dx <= x + w - && containsAngle(Math.toDegrees(Math.atan2(-dy, -dx)))) - return true; + if (mx + dx >= x && mx + dx <= x + w + && containsAngle(Math.toDegrees(Math.atan2(-dy, dx)))) + return true; + if (mx - dx >= x && mx - dx <= x + w + && containsAngle(Math.toDegrees(Math.atan2(-dy, -dx)))) + return true; } dy = (y + h) - my; dx = a * Math.sqrt(1 - ((dy * dy) / (b * b))); if (! java.lang.Double.isNaN(dx)) { - if (mx + dx >= x && mx + dx <= x + w - && containsAngle(Math.toDegrees(Math.atan2(-dy, dx)))) - return true; - if (mx - dx >= x && mx - dx <= x + w - && containsAngle(Math.toDegrees(Math.atan2(-dy, -dx)))) - return true; + if (mx + dx >= x && mx + dx <= x + w + && containsAngle(Math.toDegrees(Math.atan2(-dy, dx)))) + return true; + if (mx - dx >= x && mx - dx <= x + w + && containsAngle(Math.toDegrees(Math.atan2(-dy, -dx)))) + return true; } dx = x - mx; dy = b * Math.sqrt(1 - ((dx * dx) / (a * a))); if (! java.lang.Double.isNaN(dy)) { - if (my + dy >= y && my + dy <= y + h - && containsAngle(Math.toDegrees(Math.atan2(-dy, dx)))) - return true; - if (my - dy >= y && my - dy <= y + h - && containsAngle(Math.toDegrees(Math.atan2(dy, dx)))) - return true; + if (my + dy >= y && my + dy <= y + h + && containsAngle(Math.toDegrees(Math.atan2(-dy, dx)))) + return true; + if (my - dy >= y && my - dy <= y + h + && containsAngle(Math.toDegrees(Math.atan2(dy, dx)))) + return true; } dx = (x + w) - mx; dy = b * Math.sqrt(1 - ((dx * dx) / (a * a))); if (! java.lang.Double.isNaN(dy)) { - if (my + dy >= y && my + dy <= y + h - && containsAngle(Math.toDegrees(Math.atan2(-dy, dx)))) - return true; - if (my - dy >= y && my - dy <= y + h - && containsAngle(Math.toDegrees(Math.atan2(dy, dx)))) - return true; + if (my + dy >= y && my + dy <= y + h + && containsAngle(Math.toDegrees(Math.atan2(-dy, dx)))) + return true; + if (my - dy >= y && my - dy <= y + h + && containsAngle(Math.toDegrees(Math.atan2(dy, dx)))) + return true; } // Check whether the arc is contained within the box @@ -687,12 +687,12 @@ public abstract class Arc2D extends RectangularShape double y2 = my - b * Math.sin(Math.toRadians(getAngleStart() + extent)); if (getArcType() != CHORD) { - // check intersections against the pie radii - if (rect.intersectsLine(mx, my, x1, y1)) - return false; + // check intersections against the pie radii + if (rect.intersectsLine(mx, my, x1, y1)) + return false; - if (rect.intersectsLine(mx, my, x2, y2)) - return false; + if (rect.intersectsLine(mx, my, x2, y2)) + return false; } else if (rect.intersectsLine(x1, y1, x2, y2)) return false; @@ -782,17 +782,17 @@ public abstract class Arc2D extends RectangularShape type = a.type; if (w < 0 || h < 0) - limit = -1; + limit = -1; else if (extent == 0) - limit = type; + limit = type; else if (Math.abs(extent) <= Math.PI / 2.0) - limit = type + 1; + limit = type + 1; else if (Math.abs(extent) <= Math.PI) - limit = type + 2; + limit = type + 2; else if (Math.abs(extent) <= 3.0 * (Math.PI / 2.0)) - limit = type + 3; + limit = type + 3; else - limit = type + 4; + limit = type + 4; } /** @@ -855,7 +855,7 @@ public abstract class Arc2D extends RectangularShape double[] double_coords = new double[6]; int code = currentSegment(double_coords); for (int i = 0; i < 6; ++i) - coords[i] = (float) double_coords[i]; + coords[i] = (float) double_coords[i]; return code; } @@ -875,27 +875,27 @@ public abstract class Arc2D extends RectangularShape double ymid = y + ry; if (current > limit) - throw new NoSuchElementException("arc iterator out of bounds"); + throw new NoSuchElementException("arc iterator out of bounds"); if (current == 0) { - coords[0] = xmid + rx * Math.cos(start); - coords[1] = ymid - ry * Math.sin(start); - if (xform != null) - xform.transform(coords, 0, coords, 0, 1); - return SEG_MOVETO; + coords[0] = xmid + rx * Math.cos(start); + coords[1] = ymid - ry * Math.sin(start); + if (xform != null) + xform.transform(coords, 0, coords, 0, 1); + return SEG_MOVETO; } if (type != OPEN && current == limit) - return SEG_CLOSE; + return SEG_CLOSE; if ((current == limit - 1) && (type == PIE)) { - coords[0] = xmid; - coords[1] = ymid; - if (xform != null) - xform.transform(coords, 0, coords, 0, 1); - return SEG_LINETO; + coords[0] = xmid; + coords[1] = ymid; + if (xform != null) + xform.transform(coords, 0, coords, 0, 1); + return SEG_LINETO; } // note that this produces a cubic approximation of the arc segment, @@ -916,7 +916,7 @@ public abstract class Arc2D extends RectangularShape curr_begin = start - (current - 1) * quad; curr_extent = Math.max((start + extent) - curr_begin, -quad); } - + double portion_of_a_quadrant = Math.abs(curr_extent / quad); double x0 = xmid + rx * Math.cos(curr_begin); @@ -942,7 +942,7 @@ public abstract class Arc2D extends RectangularShape cvec[1] = len; else cvec[1] = -len; - + trans.scale(rx, ry); trans.rotate(angle); trans.transform(cvec, 0, cvec, 0, 1); @@ -956,7 +956,7 @@ public abstract class Arc2D extends RectangularShape cvec[1] = -len; else cvec[1] = len; - + trans.rotate(curr_extent); trans.transform(cvec, 0, cvec, 0, 1); coords[2] = x1 + cvec[0]; @@ -967,7 +967,7 @@ public abstract class Arc2D extends RectangularShape coords[5] = y1; if (xform != null) - xform.transform(coords, 0, coords, 0, 3); + xform.transform(coords, 0, coords, 0, 3); return SEG_CUBICTO; } diff --git a/libjava/classpath/java/awt/geom/Area.java b/libjava/classpath/java/awt/geom/Area.java index ad20b53..a1eaf63 100644 --- a/libjava/classpath/java/awt/geom/Area.java +++ b/libjava/classpath/java/awt/geom/Area.java @@ -126,9 +126,9 @@ public class Area implements Shape, Cloneable * of non-self-intersecting subpaths, and any inner paths which * are found redundant in accordance with the Shape's winding rule * will not be included. - * + * * @param s the shape (<code>null</code> not permitted). - * + * * @throws NullPointerException if <code>s</code> is <code>null</code>. */ public Area(Shape s) @@ -144,7 +144,7 @@ public class Area implements Shape, Cloneable // delete empty paths for (int i = 0; i < p.size(); i++) if (((Segment) p.elementAt(i)).getSignedArea() == 0.0) - p.remove(i--); + p.remove(i--); /* * Resolve self intersecting paths into non-intersecting @@ -162,19 +162,19 @@ public class Area implements Shape, Cloneable for (int i = 0; i < p.size(); i++) { - Segment path = (Segment) p.elementAt(i); - createNodesSelf(path); + Segment path = (Segment) p.elementAt(i); + createNodesSelf(path); } if (p.size() > 1) { - for (int i = 0; i < p.size() - 1; i++) - for (int j = i + 1; j < p.size(); j++) - { - Segment path1 = (Segment) p.elementAt(i); - Segment path2 = (Segment) p.elementAt(j); - createNodes(path1, path2); - } + for (int i = 0; i < p.size() - 1; i++) + for (int j = i + 1; j < p.size(); j++) + { + Segment path1 = (Segment) p.elementAt(i); + Segment path2 = (Segment) p.elementAt(j); + createNodes(path1, path2); + } } // we have intersecting points. @@ -182,13 +182,13 @@ public class Area implements Shape, Cloneable for (int i = 0; i < p.size(); i++) { - Segment path = v = (Segment) p.elementAt(i); - do - { - segments.add(v); - v = v.next; - } - while (v != path); + Segment path = v = (Segment) p.elementAt(i); + do + { + segments.add(v); + v = v.next; + } + while (v != path); } paths = weilerAtherton(segments); @@ -219,12 +219,12 @@ public class Area implements Shape, Cloneable for (int i = 0; i < pathA.size(); i++) { - Segment a = (Segment) pathA.elementAt(i); - for (int j = 0; j < pathB.size(); j++) - { - Segment b = (Segment) pathB.elementAt(j); - nNodes += createNodes(a, b); - } + Segment a = (Segment) pathA.elementAt(i); + for (int j = 0; j < pathB.size(); j++) + { + Segment b = (Segment) pathB.elementAt(j); + nNodes += createNodes(a, b); + } } Vector paths = new Vector(); @@ -237,28 +237,28 @@ public class Area implements Shape, Cloneable // segments of A oustide B and all B outside A for (int i = 0; i < pathA.size(); i++) { - v = (Segment) pathA.elementAt(i); - Segment path = v; - do - { - if (v.isSegmentOutside(area)) - segments.add(v); - v = v.next; - } - while (v != path); + v = (Segment) pathA.elementAt(i); + Segment path = v; + do + { + if (v.isSegmentOutside(area)) + segments.add(v); + v = v.next; + } + while (v != path); } for (int i = 0; i < pathB.size(); i++) { - v = (Segment) pathB.elementAt(i); - Segment path = v; - do - { - if (v.isSegmentOutside(this)) - segments.add(v); - v = v.next; - } - while (v != path); + v = (Segment) pathB.elementAt(i); + Segment path = v; + do + { + if (v.isSegmentOutside(this)) + segments.add(v); + v = v.next; + } + while (v != path); } paths = weilerAtherton(segments); @@ -277,8 +277,8 @@ public class Area implements Shape, Cloneable if (equals(area)) { - reset(); - return; + reset(); + return; } Vector pathA = new Vector(); @@ -299,12 +299,12 @@ public class Area implements Shape, Cloneable // create nodes for (int i = 0; i < pathA.size(); i++) { - Segment a = (Segment) pathA.elementAt(i); - for (int j = 0; j < pathB.size(); j++) - { - Segment b = (Segment) pathB.elementAt(j); - nNodes += createNodes(a, b); - } + Segment a = (Segment) pathA.elementAt(i); + for (int j = 0; j < pathB.size(); j++) + { + Segment b = (Segment) pathB.elementAt(j); + nNodes += createNodes(a, b); + } } Vector paths = new Vector(); @@ -318,43 +318,43 @@ public class Area implements Shape, Cloneable // and the segments before and after any node for (int i = 0; i < pathA.size(); i++) { - Segment v = (Segment) pathA.elementAt(i); - Segment path = v; - if (v.isSegmentOutside(area) && v.node == null) - segments.add(v); - boolean node = false; - do - { - if ((v.node != null || node)) - { - node = (v.node != null); - if (v.isSegmentOutside(area)) - segments.add(v); - } - v = v.next; - } - while (v != path); + Segment v = (Segment) pathA.elementAt(i); + Segment path = v; + if (v.isSegmentOutside(area) && v.node == null) + segments.add(v); + boolean node = false; + do + { + if ((v.node != null || node)) + { + node = (v.node != null); + if (v.isSegmentOutside(area)) + segments.add(v); + } + v = v.next; + } + while (v != path); } for (int i = 0; i < pathB.size(); i++) { - Segment v = (Segment) pathB.elementAt(i); - Segment path = v; - if (! v.isSegmentOutside(this) && v.node == null) - segments.add(v); - v = v.next; - boolean node = false; - do - { - if ((v.node != null || node)) - { - node = (v.node != null); - if (! v.isSegmentOutside(this)) - segments.add(v); - } - v = v.next; - } - while (v != path); + Segment v = (Segment) pathB.elementAt(i); + Segment path = v; + if (! v.isSegmentOutside(this) && v.node == null) + segments.add(v); + v = v.next; + boolean node = false; + do + { + if ((v.node != null || node)) + { + node = (v.node != null); + if (! v.isSegmentOutside(this)) + segments.add(v); + } + v = v.next; + } + while (v != path); } paths = weilerAtherton(segments); @@ -370,8 +370,8 @@ public class Area implements Shape, Cloneable { if (isEmpty() || area.isEmpty()) { - reset(); - return; + reset(); + return; } if (equals(area)) return; @@ -390,12 +390,12 @@ public class Area implements Shape, Cloneable // create nodes for (int i = 0; i < pathA.size(); i++) { - Segment a = (Segment) pathA.elementAt(i); - for (int j = 0; j < pathB.size(); j++) - { - Segment b = (Segment) pathB.elementAt(j); - nNodes += createNodes(a, b); - } + Segment a = (Segment) pathA.elementAt(i); + for (int j = 0; j < pathB.size(); j++) + { + Segment b = (Segment) pathB.elementAt(j); + nNodes += createNodes(a, b); + } } Vector paths = new Vector(); @@ -410,43 +410,43 @@ public class Area implements Shape, Cloneable // and the segments before and after any node for (int i = 0; i < pathA.size(); i++) { - Segment v = (Segment) pathA.elementAt(i); - Segment path = v; - if (! v.isSegmentOutside(area) && v.node == null) - segments.add(v); - boolean node = false; - do - { - if ((v.node != null || node)) - { - node = (v.node != null); - if (! v.isSegmentOutside(area)) - segments.add(v); - } - v = v.next; - } - while (v != path); + Segment v = (Segment) pathA.elementAt(i); + Segment path = v; + if (! v.isSegmentOutside(area) && v.node == null) + segments.add(v); + boolean node = false; + do + { + if ((v.node != null || node)) + { + node = (v.node != null); + if (! v.isSegmentOutside(area)) + segments.add(v); + } + v = v.next; + } + while (v != path); } for (int i = 0; i < pathB.size(); i++) { - Segment v = (Segment) pathB.elementAt(i); - Segment path = v; - if (! v.isSegmentOutside(this) && v.node == null) - segments.add(v); - v = v.next; - boolean node = false; - do - { - if ((v.node != null || node)) - { - node = (v.node != null); - if (! v.isSegmentOutside(this)) - segments.add(v); - } - v = v.next; - } - while (v != path); + Segment v = (Segment) pathB.elementAt(i); + Segment path = v; + if (! v.isSegmentOutside(this) && v.node == null) + segments.add(v); + v = v.next; + boolean node = false; + do + { + if ((v.node != null || node)) + { + node = (v.node != null); + if (! v.isSegmentOutside(this)) + segments.add(v); + } + v = v.next; + } + while (v != path); } paths = weilerAtherton(segments); @@ -465,15 +465,15 @@ public class Area implements Shape, Cloneable if (isEmpty()) { - Area B = (Area) area.clone(); - solids = B.solids; - holes = B.holes; - return; + Area B = (Area) area.clone(); + solids = B.solids; + holes = B.holes; + return; } if (equals(area)) { - reset(); - return; + reset(); + return; } Vector pathA = new Vector(); @@ -493,12 +493,12 @@ public class Area implements Shape, Cloneable for (int i = 0; i < pathA.size(); i++) { - Segment a = (Segment) pathA.elementAt(i); - for (int j = 0; j < pathB.size(); j++) - { - Segment b = (Segment) pathB.elementAt(j); - nNodes += createNodes(a, b); - } + Segment a = (Segment) pathA.elementAt(i); + for (int j = 0; j < pathB.size(); j++) + { + Segment b = (Segment) pathB.elementAt(j); + nNodes += createNodes(a, b); + } } Vector paths = new Vector(); @@ -510,26 +510,26 @@ public class Area implements Shape, Cloneable // In an XOR operation, we operate on all segments for (int i = 0; i < pathA.size(); i++) { - v = (Segment) pathA.elementAt(i); - Segment path = v; - do - { - segments.add(v); - v = v.next; - } - while (v != path); + v = (Segment) pathA.elementAt(i); + Segment path = v; + do + { + segments.add(v); + v = v.next; + } + while (v != path); } for (int i = 0; i < pathB.size(); i++) { - v = (Segment) pathB.elementAt(i); - Segment path = v; - do - { - segments.add(v); - v = v.next; - } - while (v != path); + v = (Segment) pathB.elementAt(i); + Segment path = v; + do + { + segments.add(v); + v = v.next; + } + while (v != path); } paths = weilerAtherton(segments); @@ -573,10 +573,10 @@ public class Area implements Shape, Cloneable { for (int i = 0; i < holes.size(); i++) if (! ((Segment) holes.elementAt(i)).isPolygonal()) - return false; + return false; for (int i = 0; i < solids.size(); i++) if (! ((Segment) solids.elementAt(i)).isPolygonal()) - return false; + return false; return true; } @@ -607,23 +607,23 @@ public class Area implements Shape, Cloneable Segment s = path; do { - Segment s2 = s.next; - double d1 = (s.P2.getX() - s.P1.getX())*(s2.P2.getX() - s2.P1.getX())/ - ((s.P1.distance(s.P2)) * (s2.P1.distance(s2.P2))); - double d2 = (s.P2.getY() - s.P1.getY())*(s2.P2.getY() - s2.P1.getY())/ - ((s.P1.distance(s.P2)) * (s2.P1.distance(s2.P2))); - double dotproduct = d1 + d2; - - // For some reason, only rectangles on the XY axis count. - if (d1 != 0 && d2 != 0) - return false; - - if (Math.abs(dotproduct) == 0) // 90 degree angle - nCorners++; - else if ((Math.abs(1.0 - dotproduct) > 0)) // 0 degree angle? - return false; // if not, return false - - s = s.next; + Segment s2 = s.next; + double d1 = (s.P2.getX() - s.P1.getX())*(s2.P2.getX() - s2.P1.getX())/ + ((s.P1.distance(s.P2)) * (s2.P1.distance(s2.P2))); + double d2 = (s.P2.getY() - s.P1.getY())*(s2.P2.getY() - s2.P1.getY())/ + ((s.P1.distance(s.P2)) * (s2.P1.distance(s2.P2))); + double dotproduct = d1 + d2; + + // For some reason, only rectangles on the XY axis count. + if (d1 != 0 && d2 != 0) + return false; + + if (Math.abs(dotproduct) == 0) // 90 degree angle + nCorners++; + else if ((Math.abs(1.0 - dotproduct) > 0)) // 0 degree angle? + return false; // if not, return false + + s = s.next; } while (s != path); @@ -662,11 +662,11 @@ public class Area implements Shape, Cloneable for (int path = 0; path < solids.size(); path++) { - Rectangle2D r = ((Segment) solids.elementAt(path)).getPathBounds(); - xmin = Math.min(r.getMinX(), xmin); - ymin = Math.min(r.getMinY(), ymin); - xmax = Math.max(r.getMaxX(), xmax); - ymax = Math.max(r.getMaxY(), ymax); + Rectangle2D r = ((Segment) solids.elementAt(path)).getPathBounds(); + xmin = Math.min(r.getMinX(), xmin); + ymin = Math.min(r.getMinY(), ymin); + xmax = Math.max(r.getMaxX(), xmax); + ymax = Math.max(r.getMaxY(), ymax); } return (new Rectangle2D.Double(xmin, ymin, (xmax - xmin), (ymax - ymin))); @@ -675,7 +675,7 @@ public class Area implements Shape, Cloneable /** * Returns the bounds of this object in Rectangle format. * Please note that this may lead to loss of precision. - * + * * @return The bounds. * @see #getBounds2D() */ @@ -694,22 +694,22 @@ public class Area implements Shape, Cloneable { try { - Area clone = new Area(); - for (int i = 0; i < solids.size(); i++) - clone.solids.add(((Segment) solids.elementAt(i)).cloneSegmentList()); - for (int i = 0; i < holes.size(); i++) - clone.holes.add(((Segment) holes.elementAt(i)).cloneSegmentList()); - return clone; + Area clone = new Area(); + for (int i = 0; i < solids.size(); i++) + clone.solids.add(((Segment) solids.elementAt(i)).cloneSegmentList()); + for (int i = 0; i < holes.size(); i++) + clone.holes.add(((Segment) holes.elementAt(i)).cloneSegmentList()); + return clone; } catch (CloneNotSupportedException e) { - throw (Error) new InternalError().initCause(e); // Impossible + throw (Error) new InternalError().initCause(e); // Impossible } } /** * Compares two Areas. - * + * * @param area the area to compare against this area (<code>null</code> * permitted). * @return <code>true</code> if the areas are equal, and <code>false</code> @@ -739,14 +739,14 @@ public class Area implements Shape, Cloneable for (int i = 0; i < nPaths; i++) { - for (int j = 0; j < nPaths; j++) - { - Segment p1 = (Segment) pathA.elementAt(i); - Segment p2 = (Segment) pathB.elementAt(j); - if (! match[0][i] && ! match[1][j]) - if (p1.pathEquals(p2)) - match[0][i] = match[1][j] = true; - } + for (int j = 0; j < nPaths; j++) + { + Segment p1 = (Segment) pathA.elementAt(i); + Segment p2 = (Segment) pathB.elementAt(j); + if (! match[0][i] && ! match[1][j]) + if (p1.pathEquals(p2)) + match[0][i] = match[1][j] = true; + } } boolean result = true; @@ -757,7 +757,7 @@ public class Area implements Shape, Cloneable /** * Transforms this area by the AffineTransform at. - * + * * @param at the transform. */ public void transform(AffineTransform at) @@ -770,8 +770,8 @@ public class Area implements Shape, Cloneable // Note that the orientation is not invariant under inversion if ((at.getType() & AffineTransform.TYPE_FLIP) != 0) { - setDirection(holes, false); - setDirection(solids, true); + setDirection(holes, false); + setDirection(solids, true); } } @@ -801,11 +801,11 @@ public class Area implements Shape, Cloneable int n = 0; for (int i = 0; i < solids.size(); i++) if (((Segment) solids.elementAt(i)).contains(x, y)) - n++; + n++; for (int i = 0; i < holes.size(); i++) if (((Segment) holes.elementAt(i)).contains(x, y)) - n--; + n--; return (n != 0); } @@ -814,7 +814,7 @@ public class Area implements Shape, Cloneable * Determines if the Point2D p is contained within this Area. * * @param p the point. - * @return <code>true</code> if the point is contained, <code>false</code> + * @return <code>true</code> if the point is contained, <code>false</code> * otherwise. * @throws NullPointerException if <code>p</code> is <code>null</code>. */ @@ -830,7 +830,7 @@ public class Area implements Shape, Cloneable * * This method should always produce the correct results, unlike for other * classes in geom. - * + * * @param x the x-coordinate of the rectangle. * @param y the y-coordinate of the rectangle. * @param w the width of the the rectangle. @@ -850,39 +850,39 @@ public class Area implements Shape, Cloneable // will mean the rectangle is not entirely contained. for (int i = 0; i < 4; i++) { - for (int path = 0; path < solids.size(); path++) - { - Segment v; - Segment start; - start = v = (Segment) solids.elementAt(path); - do - { - if (l[i].hasIntersections(v)) - return false; - v = v.next; - } - while (v != start); - } - for (int path = 0; path < holes.size(); path++) - { - Segment v; - Segment start; - start = v = (Segment) holes.elementAt(path); - do - { - if (l[i].hasIntersections(v)) - return false; - v = v.next; - } - while (v != start); - } + for (int path = 0; path < solids.size(); path++) + { + Segment v; + Segment start; + start = v = (Segment) solids.elementAt(path); + do + { + if (l[i].hasIntersections(v)) + return false; + v = v.next; + } + while (v != start); + } + for (int path = 0; path < holes.size(); path++) + { + Segment v; + Segment start; + start = v = (Segment) holes.elementAt(path); + do + { + if (l[i].hasIntersections(v)) + return false; + v = v.next; + } + while (v != start); + } } // Is any point inside? if (! contains(x, y)) return false; - // Final hoop: Is the rectangle non-intersecting and inside, + // Final hoop: Is the rectangle non-intersecting and inside, // but encloses a hole? Rectangle2D r = new Rectangle2D.Double(x, y, w, h); for (int path = 0; path < holes.size(); path++) @@ -898,10 +898,10 @@ public class Area implements Shape, Cloneable * * This method should always produce the correct results, unlike for other * classes in geom. - * + * * @param r the rectangle. * @return <code>true</code> if the rectangle is considered contained - * + * * @throws NullPointerException if <code>r</code> is <code>null</code>. */ public boolean contains(Rectangle2D r) @@ -912,12 +912,12 @@ public class Area implements Shape, Cloneable /** * Determines if the rectangle specified by (x,y) as the upper-left * and with width w and height h intersects any part of this Area. - * + * * @param x the x-coordinate for the rectangle. * @param y the y-coordinate for the rectangle. * @param w the width of the rectangle. * @param h the height of the rectangle. - * @return <code>true</code> if the rectangle intersects the area, + * @return <code>true</code> if the rectangle intersects the area, * <code>false</code> otherwise. */ public boolean intersects(double x, double y, double w, double h) @@ -934,32 +934,32 @@ public class Area implements Shape, Cloneable // Return true on any intersection for (int i = 0; i < 4; i++) { - for (int path = 0; path < solids.size(); path++) - { - Segment v; - Segment start; - start = v = (Segment) solids.elementAt(path); - do - { - if (l[i].hasIntersections(v)) - return true; - v = v.next; - } - while (v != start); - } - for (int path = 0; path < holes.size(); path++) - { - Segment v; - Segment start; - start = v = (Segment) holes.elementAt(path); - do - { - if (l[i].hasIntersections(v)) - return true; - v = v.next; - } - while (v != start); - } + for (int path = 0; path < solids.size(); path++) + { + Segment v; + Segment start; + start = v = (Segment) solids.elementAt(path); + do + { + if (l[i].hasIntersections(v)) + return true; + v = v.next; + } + while (v != start); + } + for (int path = 0; path < holes.size(); path++) + { + Segment v; + Segment start; + start = v = (Segment) holes.elementAt(path); + do + { + if (l[i].hasIntersections(v)) + return true; + v = v.next; + } + while (v != start); + } } // Non-intersecting, Is any point inside? @@ -978,7 +978,7 @@ public class Area implements Shape, Cloneable * part of this Area. * @param r the rectangle to test intersection with (<code>null</code> * not permitted). - * @return <code>true</code> if the rectangle intersects the area, + * @return <code>true</code> if the rectangle intersects the area, * <code>false</code> otherwise. * @throws NullPointerException if <code>r</code> is <code>null</code>. */ @@ -990,7 +990,7 @@ public class Area implements Shape, Cloneable /** * Returns a PathIterator object defining the contour of this Area, * transformed by at. - * + * * @param at the transform. * @return A path iterator. */ @@ -1002,7 +1002,7 @@ public class Area implements Shape, Cloneable /** * Returns a flattened PathIterator object defining the contour of this * Area, transformed by at and with a defined flatness. - * + * * @param at the transform. * @param flatness the flatness. * @return A path iterator. @@ -1013,7 +1013,7 @@ public class Area implements Shape, Cloneable } //--------------------------------------------------------------------- - // Non-public methods and classes + // Non-public methods and classes /** * Private pathiterator object. @@ -1032,7 +1032,7 @@ public class Area implements Shape, Cloneable IteratorSegment() { - coords = new double[6]; + coords = new double[6]; } } @@ -1052,27 +1052,27 @@ public class Area implements Shape, Cloneable for (int i = 0; i < allpaths.size(); i++) { - Segment v = (Segment) allpaths.elementAt(i); - Segment start = v; - - IteratorSegment is = new IteratorSegment(); - is.type = SEG_MOVETO; - is.coords[0] = start.P1.getX(); - is.coords[1] = start.P1.getY(); - segments.add(is); - - do - { - is = new IteratorSegment(); - is.type = v.pathIteratorFormat(is.coords); - segments.add(is); - v = v.next; - } - while (v != start); - - is = new IteratorSegment(); - is.type = SEG_CLOSE; - segments.add(is); + Segment v = (Segment) allpaths.elementAt(i); + Segment start = v; + + IteratorSegment is = new IteratorSegment(); + is.type = SEG_MOVETO; + is.coords[0] = start.P1.getX(); + is.coords[1] = start.P1.getY(); + segments.add(is); + + do + { + is = new IteratorSegment(); + is.type = v.pathIteratorFormat(is.coords); + segments.add(is); + v = v.next; + } + while (v != start); + + is = new IteratorSegment(); + is.type = SEG_CLOSE; + segments.add(is); } } @@ -1080,10 +1080,10 @@ public class Area implements Shape, Cloneable { IteratorSegment s = (IteratorSegment) segments.elementAt(index); if (at != null) - at.transform(s.coords, 0, coords, 0, 3); + at.transform(s.coords, 0, coords, 0, 3); else - for (int i = 0; i < 6; i++) - coords[i] = s.coords[i]; + for (int i = 0; i < 6; i++) + coords[i] = s.coords[i]; return (s.type); } @@ -1093,13 +1093,13 @@ public class Area implements Shape, Cloneable double[] d = new double[6]; if (at != null) { - at.transform(s.coords, 0, d, 0, 3); - for (int i = 0; i < 6; i++) - coords[i] = (float) d[i]; + at.transform(s.coords, 0, d, 0, 3); + for (int i = 0; i < 6; i++) + coords[i] = (float) d[i]; } else - for (int i = 0; i < 6; i++) - coords[i] = (float) s.coords[i]; + for (int i = 0; i < 6; i++) + coords[i] = (float) s.coords[i]; return (s.type); } @@ -1134,22 +1134,22 @@ public class Area implements Shape, Cloneable Vector paths = new Vector(); while (segments.size() > 0) { - // Iterate over the path - Segment start = (Segment) segments.elementAt(0); - Segment s = start; - do - { - segments.remove(s); - if (s.node != null) - { // switch over - s.next = s.node; - s.node = null; - } - s = s.next; // continue - } - while (s != start); - - paths.add(start); + // Iterate over the path + Segment start = (Segment) segments.elementAt(0); + Segment s = start; + do + { + segments.remove(s); + if (s.node != null) + { // switch over + s.next = s.node; + s.node = null; + } + s = s.next; // continue + } + while (s != start); + + paths.add(start); } return paths; } @@ -1230,30 +1230,30 @@ public class Area implements Shape, Cloneable if (flat1 && flat2) { - double xlk = c1.getP2().getX() - c1.getP1().getX(); - double ylk = c1.getP2().getY() - c1.getP1().getY(); - - double xnm = c2.getP2().getX() - c2.getP1().getX(); - double ynm = c2.getP2().getY() - c2.getP1().getY(); - - double xmk = c2.getP1().getX() - c1.getP1().getX(); - double ymk = c2.getP1().getY() - c1.getP1().getY(); - double det = xnm * ylk - ynm * xlk; - - if (det + 1.0 == 1.0) - return; - - double detinv = 1.0 / det; - double s = (xnm * ymk - ynm * xmk) * detinv; - double t = (xlk * ymk - ylk * xmk) * detinv; - if ((s < 0.0) || (s > 1.0) || (t < 0.0) || (t > 1.0)) - return; - - double[] temp = new double[2]; - temp[0] = t1 + s * w1; - temp[1] = t2 + t * w1; - cc_intersections.add(temp); - return; + double xlk = c1.getP2().getX() - c1.getP1().getX(); + double ylk = c1.getP2().getY() - c1.getP1().getY(); + + double xnm = c2.getP2().getX() - c2.getP1().getX(); + double ynm = c2.getP2().getY() - c2.getP1().getY(); + + double xmk = c2.getP1().getX() - c1.getP1().getX(); + double ymk = c2.getP1().getY() - c1.getP1().getY(); + double det = xnm * ylk - ynm * xlk; + + if (det + 1.0 == 1.0) + return; + + double detinv = 1.0 / det; + double s = (xnm * ymk - ynm * xmk) * detinv; + double t = (xlk * ymk - ylk * xmk) * detinv; + if ((s < 0.0) || (s > 1.0) || (t < 0.0) || (t > 1.0)) + return; + + double[] temp = new double[2]; + temp[0] = t1 + s * w1; + temp[1] = t2 + t * w1; + cc_intersections.add(temp); + return; } CubicCurve2D.Double c11 = new CubicCurve2D.Double(); @@ -1263,33 +1263,33 @@ public class Area implements Shape, Cloneable if (! flat1 && ! flat2) { - depth1--; - depth2--; - w1 = w1 * 0.5; - w2 = w2 * 0.5; - c1.subdivide(c11, c12); - c2.subdivide(c21, c22); - if (c11.getBounds2D().intersects(c21.getBounds2D())) - recursiveSubdivide(c11, c21, depth1, depth2, t1, t2, w1, w2); - if (c11.getBounds2D().intersects(c22.getBounds2D())) - recursiveSubdivide(c11, c22, depth1, depth2, t1, t2 + w2, w1, w2); - if (c12.getBounds2D().intersects(c21.getBounds2D())) - recursiveSubdivide(c12, c21, depth1, depth2, t1 + w1, t2, w1, w2); - if (c12.getBounds2D().intersects(c22.getBounds2D())) - recursiveSubdivide(c12, c22, depth1, depth2, t1 + w1, t2 + w2, w1, w2); - return; + depth1--; + depth2--; + w1 = w1 * 0.5; + w2 = w2 * 0.5; + c1.subdivide(c11, c12); + c2.subdivide(c21, c22); + if (c11.getBounds2D().intersects(c21.getBounds2D())) + recursiveSubdivide(c11, c21, depth1, depth2, t1, t2, w1, w2); + if (c11.getBounds2D().intersects(c22.getBounds2D())) + recursiveSubdivide(c11, c22, depth1, depth2, t1, t2 + w2, w1, w2); + if (c12.getBounds2D().intersects(c21.getBounds2D())) + recursiveSubdivide(c12, c21, depth1, depth2, t1 + w1, t2, w1, w2); + if (c12.getBounds2D().intersects(c22.getBounds2D())) + recursiveSubdivide(c12, c22, depth1, depth2, t1 + w1, t2 + w2, w1, w2); + return; } if (! flat1) { - depth1--; - c1.subdivide(c11, c12); - w1 = w1 * 0.5; - if (c11.getBounds2D().intersects(c2.getBounds2D())) - recursiveSubdivide(c11, c2, depth1, depth2, t1, t2, w1, w2); - if (c12.getBounds2D().intersects(c2.getBounds2D())) - recursiveSubdivide(c12, c2, depth1, depth2, t1 + w1, t2, w1, w2); - return; + depth1--; + c1.subdivide(c11, c12); + w1 = w1 * 0.5; + if (c11.getBounds2D().intersects(c2.getBounds2D())) + recursiveSubdivide(c11, c2, depth1, depth2, t1, t2, w1, w2); + if (c12.getBounds2D().intersects(c2.getBounds2D())) + recursiveSubdivide(c12, c2, depth1, depth2, t1 + w1, t2, w1, w2); + return; } depth2--; @@ -1317,7 +1317,7 @@ public class Area implements Shape, Cloneable * This is a reasonably accurate method, although the recursion depth * is typically around 20, the bounding-box tests allow for significant * pruning of the subdivision tree. - * + * * This is package-private to avoid an accessor method. */ Intersection[] cubicCubicIntersect(CubicSegment curve1, CubicSegment curve2) @@ -1339,9 +1339,9 @@ public class Area implements Shape, Cloneable Intersection[] results = new Intersection[cc_intersections.size()]; for (int i = 0; i < cc_intersections.size(); i++) { - double[] temp = (double[]) cc_intersections.elementAt(i); - results[i] = new Intersection(curve1.evaluatePoint(temp[0]), temp[0], - temp[1]); + double[] temp = (double[]) cc_intersections.elementAt(i); + results[i] = new Intersection(curve1.evaluatePoint(temp[0]), temp[0], + temp[1]); } cc_intersections = null; return (results); @@ -1390,21 +1390,21 @@ public class Area implements Shape, Cloneable // line on y axis if (dx == 0 || (dy / dx) > 1.0) { - double k = dx / dy; - x[0] -= lx0; - y[0] -= ly0; - y[0] *= k; - y[1] *= k; - y[2] *= k; + double k = dx / dy; + x[0] -= lx0; + y[0] -= ly0; + y[0] *= k; + y[1] *= k; + y[2] *= k; } else { - double k = dy / dx; - x[0] -= lx0; - y[0] -= ly0; - x[0] *= k; - x[1] *= k; - x[2] *= k; + double k = dy / dx; + x[0] -= lx0; + y[0] -= ly0; + x[0] *= k; + x[1] *= k; + x[2] *= k; } for (int i = 0; i < 3; i++) @@ -1412,43 +1412,43 @@ public class Area implements Shape, Cloneable if ((nRoots = QuadCurve2D.solveQuadratic(r)) > 0) { - Intersection[] temp = new Intersection[nRoots]; - int intersections = 0; - for (int i = 0; i < nRoots; i++) - { - double t = r[i]; - if (t >= 0.0 && t <= 1.0) - { - Point2D p = c.evaluatePoint(t); - - // if the line is on an axis, snap the point to that axis. - if (dx == 0) - p.setLocation(lx0, p.getY()); - if (dy == 0) - p.setLocation(p.getX(), ly0); - - if (p.getX() <= Math.max(lx0, lx1) - && p.getX() >= Math.min(lx0, lx1) - && p.getY() <= Math.max(ly0, ly1) - && p.getY() >= Math.min(ly0, ly1)) - { - double lineparameter = p.distance(l.P1) / l.P2.distance(l.P1); - temp[i] = new Intersection(p, lineparameter, t); - intersections++; - } - } - else - temp[i] = null; - } - if (intersections == 0) - return null; - - Intersection[] rValues = new Intersection[intersections]; - - for (int i = 0; i < nRoots; i++) - if (temp[i] != null) - rValues[--intersections] = temp[i]; - return (rValues); + Intersection[] temp = new Intersection[nRoots]; + int intersections = 0; + for (int i = 0; i < nRoots; i++) + { + double t = r[i]; + if (t >= 0.0 && t <= 1.0) + { + Point2D p = c.evaluatePoint(t); + + // if the line is on an axis, snap the point to that axis. + if (dx == 0) + p.setLocation(lx0, p.getY()); + if (dy == 0) + p.setLocation(p.getX(), ly0); + + if (p.getX() <= Math.max(lx0, lx1) + && p.getX() >= Math.min(lx0, lx1) + && p.getY() <= Math.max(ly0, ly1) + && p.getY() >= Math.min(ly0, ly1)) + { + double lineparameter = p.distance(l.P1) / l.P2.distance(l.P1); + temp[i] = new Intersection(p, lineparameter, t); + intersections++; + } + } + else + temp[i] = null; + } + if (intersections == 0) + return null; + + Intersection[] rValues = new Intersection[intersections]; + + for (int i = 0; i < nRoots; i++) + if (temp[i] != null) + rValues[--intersections] = temp[i]; + return (rValues); } return null; } @@ -1457,7 +1457,7 @@ public class Area implements Shape, Cloneable * Returns the intersections between a line and a cubic segment * This is done through combining the line's equation with the * parametric form of the Bezier and solving the resulting quadratic. - * This is package-private to avoid an accessor method. + * This is package-private to avoid an accessor method. */ Intersection[] lineCubicIntersect(LineSegment l, CubicSegment c) { @@ -1499,65 +1499,65 @@ public class Area implements Shape, Cloneable // line on y axis if (dx == 0 || (dy / dx) > 1.0) { - double k = dx / dy; - x[0] -= lx0; - y[0] -= ly0; - y[0] *= k; - y[1] *= k; - y[2] *= k; - y[3] *= k; + double k = dx / dy; + x[0] -= lx0; + y[0] -= ly0; + y[0] *= k; + y[1] *= k; + y[2] *= k; + y[3] *= k; } else { - double k = dy / dx; - x[0] -= lx0; - y[0] -= ly0; - x[0] *= k; - x[1] *= k; - x[2] *= k; - x[3] *= k; + double k = dy / dx; + x[0] -= lx0; + y[0] -= ly0; + x[0] *= k; + x[1] *= k; + x[2] *= k; + x[3] *= k; } for (int i = 0; i < 4; i++) r[i] = y[i] - x[i]; if ((nRoots = CubicCurve2D.solveCubic(r)) > 0) { - Intersection[] temp = new Intersection[nRoots]; - int intersections = 0; - for (int i = 0; i < nRoots; i++) - { - double t = r[i]; - if (t >= 0.0 && t <= 1.0) - { - // if the line is on an axis, snap the point to that axis. - Point2D p = c.evaluatePoint(t); - if (dx == 0) - p.setLocation(lx0, p.getY()); - if (dy == 0) - p.setLocation(p.getX(), ly0); - - if (p.getX() <= Math.max(lx0, lx1) - && p.getX() >= Math.min(lx0, lx1) - && p.getY() <= Math.max(ly0, ly1) - && p.getY() >= Math.min(ly0, ly1)) - { - double lineparameter = p.distance(l.P1) / l.P2.distance(l.P1); - temp[i] = new Intersection(p, lineparameter, t); - intersections++; - } - } - else - temp[i] = null; - } - - if (intersections == 0) - return null; - - Intersection[] rValues = new Intersection[intersections]; - for (int i = 0; i < nRoots; i++) - if (temp[i] != null) - rValues[--intersections] = temp[i]; - return (rValues); + Intersection[] temp = new Intersection[nRoots]; + int intersections = 0; + for (int i = 0; i < nRoots; i++) + { + double t = r[i]; + if (t >= 0.0 && t <= 1.0) + { + // if the line is on an axis, snap the point to that axis. + Point2D p = c.evaluatePoint(t); + if (dx == 0) + p.setLocation(lx0, p.getY()); + if (dy == 0) + p.setLocation(p.getX(), ly0); + + if (p.getX() <= Math.max(lx0, lx1) + && p.getX() >= Math.min(lx0, lx1) + && p.getY() <= Math.max(ly0, ly1) + && p.getY() >= Math.min(ly0, ly1)) + { + double lineparameter = p.distance(l.P1) / l.P2.distance(l.P1); + temp[i] = new Intersection(p, lineparameter, t); + intersections++; + } + } + else + temp[i] = null; + } + + if (intersections == 0) + return null; + + Intersection[] rValues = new Intersection[intersections]; + for (int i = 0; i < nRoots; i++) + if (temp[i] != null) + rValues[--intersections] = temp[i]; + return (rValues); } return null; } @@ -1639,120 +1639,120 @@ public class Area implements Shape, Cloneable while (! pi.isDone()) { - Segment v; - switch (pi.currentSegment(coords)) - { - case PathIterator.SEG_MOVETO: - if (subpath != null) - { // close existing open path - current.next = new LineSegment(cx, cy, subpathx, subpathy); - current = current.next; - current.next = subpath; - } - subpath = null; - subpathx = cx = coords[0]; - subpathy = cy = coords[1]; - break; - - // replace 'close' with a line-to. - case PathIterator.SEG_CLOSE: - if (subpath != null && (subpathx != cx || subpathy != cy)) - { - current.next = new LineSegment(cx, cy, subpathx, subpathy); - current = current.next; - current.next = subpath; - cx = subpathx; - cy = subpathy; - subpath = null; - } - else if (subpath != null) - { - current.next = subpath; - subpath = null; - } - break; - case PathIterator.SEG_LINETO: - if (cx != coords[0] || cy != coords[1]) - { - v = new LineSegment(cx, cy, coords[0], coords[1]); - if (subpath == null) - { - subpath = current = v; - paths.add(subpath); - } - else - { - current.next = v; - current = current.next; - } - cx = coords[0]; - cy = coords[1]; - } - break; - case PathIterator.SEG_QUADTO: - v = new QuadSegment(cx, cy, coords[0], coords[1], coords[2], - coords[3]); - if (subpath == null) - { - subpath = current = v; - paths.add(subpath); - } - else - { - current.next = v; - current = current.next; - } - cx = coords[2]; - cy = coords[3]; - break; - case PathIterator.SEG_CUBICTO: - v = new CubicSegment(cx, cy, coords[0], coords[1], coords[2], - coords[3], coords[4], coords[5]); - if (subpath == null) - { - subpath = current = v; - paths.add(subpath); - } - else - { - current.next = v; - current = current.next; - } - - // check if the cubic is self-intersecting - double[] lpts = ((CubicSegment) v).getLoop(); - if (lpts != null) - { - // if it is, break off the loop into its own path. - v.subdivideInsert(lpts[0]); - v.next.subdivideInsert((lpts[1] - lpts[0]) / (1.0 - lpts[0])); - - CubicSegment loop = (CubicSegment) v.next; - v.next = loop.next; - loop.next = loop; - - v.P2 = v.next.P1 = loop.P2 = loop.P1; // snap points - paths.add(loop); - current = v.next; - } - - cx = coords[4]; - cy = coords[5]; - break; - } - pi.next(); + Segment v; + switch (pi.currentSegment(coords)) + { + case PathIterator.SEG_MOVETO: + if (subpath != null) + { // close existing open path + current.next = new LineSegment(cx, cy, subpathx, subpathy); + current = current.next; + current.next = subpath; + } + subpath = null; + subpathx = cx = coords[0]; + subpathy = cy = coords[1]; + break; + + // replace 'close' with a line-to. + case PathIterator.SEG_CLOSE: + if (subpath != null && (subpathx != cx || subpathy != cy)) + { + current.next = new LineSegment(cx, cy, subpathx, subpathy); + current = current.next; + current.next = subpath; + cx = subpathx; + cy = subpathy; + subpath = null; + } + else if (subpath != null) + { + current.next = subpath; + subpath = null; + } + break; + case PathIterator.SEG_LINETO: + if (cx != coords[0] || cy != coords[1]) + { + v = new LineSegment(cx, cy, coords[0], coords[1]); + if (subpath == null) + { + subpath = current = v; + paths.add(subpath); + } + else + { + current.next = v; + current = current.next; + } + cx = coords[0]; + cy = coords[1]; + } + break; + case PathIterator.SEG_QUADTO: + v = new QuadSegment(cx, cy, coords[0], coords[1], coords[2], + coords[3]); + if (subpath == null) + { + subpath = current = v; + paths.add(subpath); + } + else + { + current.next = v; + current = current.next; + } + cx = coords[2]; + cy = coords[3]; + break; + case PathIterator.SEG_CUBICTO: + v = new CubicSegment(cx, cy, coords[0], coords[1], coords[2], + coords[3], coords[4], coords[5]); + if (subpath == null) + { + subpath = current = v; + paths.add(subpath); + } + else + { + current.next = v; + current = current.next; + } + + // check if the cubic is self-intersecting + double[] lpts = ((CubicSegment) v).getLoop(); + if (lpts != null) + { + // if it is, break off the loop into its own path. + v.subdivideInsert(lpts[0]); + v.next.subdivideInsert((lpts[1] - lpts[0]) / (1.0 - lpts[0])); + + CubicSegment loop = (CubicSegment) v.next; + v.next = loop.next; + loop.next = loop; + + v.P2 = v.next.P1 = loop.P2 = loop.P1; // snap points + paths.add(loop); + current = v.next; + } + + cx = coords[4]; + cy = coords[5]; + break; + } + pi.next(); } if (subpath != null) { // close any open path - if (subpathx != cx || subpathy != cy) - { - current.next = new LineSegment(cx, cy, subpathx, subpathy); - current = current.next; - current.next = subpath; - } - else - current.next = subpath; + if (subpathx != cx || subpathy != cy) + { + current.next = new LineSegment(cx, cy, subpathx, subpathy); + current = current.next; + current.next = subpath; + } + else + current.next = subpath; } if (paths.size() == 0) @@ -1775,14 +1775,14 @@ public class Area implements Shape, Cloneable do { - do - { - nNodes += a.splitIntersections(b); - b = b.next; - } - while (b != B); - - a = a.next; // move to the next segment + do + { + nNodes += a.splitIntersections(b); + b = b.next; + } + while (b != B); + + a = a.next; // move to the next segment } while (a != A); // until one wrap. @@ -1804,15 +1804,15 @@ public class Area implements Shape, Cloneable do { - Segment b = a.next; - do - { - if (b != a) // necessary - nNodes += a.splitIntersections(b); - b = b.next; - } - while (b != A); - a = a.next; // move to the next segment + Segment b = a.next; + do + { + if (b != a) // necessary + nNodes += a.splitIntersections(b); + b = b.next; + } + while (b != A); + a = a.next; // move to the next segment } while (a != A); // until one wrap. @@ -1841,39 +1841,39 @@ public class Area implements Shape, Cloneable // Find which path contains which, assign winding numbers for (int i = 0; i < npaths; i++) { - Segment pathA = (Segment) paths.elementAt(i); - pathA.nullNodes(); // remove any now-redundant nodes, in case. - int windingA = pathA.hasClockwiseOrientation() ? 1 : neg; - - for (int j = 0; j < npaths; j++) - if (i != j) - { - Segment pathB = (Segment) paths.elementAt(j); - - // A contains B - if (bb[i].intersects(bb[j])) - { - Segment s = pathB.next; - while (s.P1.getY() == s.P2.getY() && s != pathB) - s = s.next; - Point2D p = s.getMidPoint(); - if (pathA.contains(p.getX(), p.getY())) - contains[i][j] = windingA; - } - else - // A does not contain B - contains[i][j] = 0; - } - else - contains[i][j] = windingA; // i == j + Segment pathA = (Segment) paths.elementAt(i); + pathA.nullNodes(); // remove any now-redundant nodes, in case. + int windingA = pathA.hasClockwiseOrientation() ? 1 : neg; + + for (int j = 0; j < npaths; j++) + if (i != j) + { + Segment pathB = (Segment) paths.elementAt(j); + + // A contains B + if (bb[i].intersects(bb[j])) + { + Segment s = pathB.next; + while (s.P1.getY() == s.P2.getY() && s != pathB) + s = s.next; + Point2D p = s.getMidPoint(); + if (pathA.contains(p.getX(), p.getY())) + contains[i][j] = windingA; + } + else + // A does not contain B + contains[i][j] = 0; + } + else + contains[i][j] = windingA; // i == j } for (int i = 0; i < npaths; i++) { - windingNumbers[i][0] = 0; - for (int j = 0; j < npaths; j++) - windingNumbers[i][0] += contains[j][i]; - windingNumbers[i][1] = contains[i][i]; + windingNumbers[i][0] = 0; + for (int j = 0; j < npaths; j++) + windingNumbers[i][0] += contains[j][i]; + windingNumbers[i][1] = contains[i][i]; } Vector solids = new Vector(); @@ -1881,25 +1881,25 @@ public class Area implements Shape, Cloneable if (windingRule == PathIterator.WIND_NON_ZERO) { - for (int i = 0; i < npaths; i++) - { - if (windingNumbers[i][0] == 0) - holes.add(paths.elementAt(i)); - else if (windingNumbers[i][0] - windingNumbers[i][1] == 0 - && Math.abs(windingNumbers[i][0]) == 1) - solids.add(paths.elementAt(i)); - } + for (int i = 0; i < npaths; i++) + { + if (windingNumbers[i][0] == 0) + holes.add(paths.elementAt(i)); + else if (windingNumbers[i][0] - windingNumbers[i][1] == 0 + && Math.abs(windingNumbers[i][0]) == 1) + solids.add(paths.elementAt(i)); + } } else { - windingRule = PathIterator.WIND_NON_ZERO; - for (int i = 0; i < npaths; i++) - { - if ((windingNumbers[i][0] & 1) == 0) - holes.add(paths.elementAt(i)); - else if ((windingNumbers[i][0] & 1) == 1) - solids.add(paths.elementAt(i)); - } + windingRule = PathIterator.WIND_NON_ZERO; + for (int i = 0; i < npaths; i++) + { + if ((windingNumbers[i][0] & 1) == 0) + holes.add(paths.elementAt(i)); + else if ((windingNumbers[i][0] & 1) == 1) + solids.add(paths.elementAt(i)); + } } setDirection(holes, false); @@ -1918,9 +1918,9 @@ public class Area implements Shape, Cloneable Segment v; for (int i = 0; i < paths.size(); i++) { - v = (Segment) paths.elementAt(i); - if (clockwise != v.hasClockwiseOrientation()) - v.reverseAll(); + v = (Segment) paths.elementAt(i); + if (clockwise != v.hasClockwiseOrientation()) + v.reverseAll(); } } @@ -2013,9 +2013,9 @@ public class Area implements Shape, Cloneable int crossings = 0; do { - int n = v.rayCrossing(x, y); - crossings += n; - v = v.next; + int n = v.rayCrossing(x, y); + crossings += n; + v = v.next; } while (v != this); return ((crossings & 1) == 1); @@ -2029,8 +2029,8 @@ public class Area implements Shape, Cloneable Segment v = this; do { - v.node = null; - v = v.next; + v.node = null; + v = v.next; } while (v != this); } @@ -2043,8 +2043,8 @@ public class Area implements Shape, Cloneable Segment v = this; do { - v.transform(at); - v = v.next; + v.transform(at); + v = v.next; } while (v != this); } @@ -2073,12 +2073,12 @@ public class Area implements Shape, Cloneable Segment v = this; do { - Rectangle2D r = v.getBounds(); - xmin = Math.min(r.getMinX(), xmin); - ymin = Math.min(r.getMinY(), ymin); - xmax = Math.max(r.getMaxX(), xmax); - ymax = Math.max(r.getMaxY(), ymax); - v = v.next; + Rectangle2D r = v.getBounds(); + xmin = Math.min(r.getMinX(), xmin); + ymin = Math.min(r.getMinY(), ymin); + xmax = Math.max(r.getMaxX(), xmax); + ymax = Math.max(r.getMaxY(), ymax); + v = v.next; } while (v != this); @@ -2096,11 +2096,11 @@ public class Area implements Shape, Cloneable s = this; do { - area += s.curveArea(); + area += s.curveArea(); - area += s.P1.getX() * s.next.P1.getY() - - s.P1.getY() * s.next.P1.getX(); - s = s.next; + area += s.P1.getX() * s.next.P1.getY() + - s.P1.getY() * s.next.P1.getX(); + s = s.next; } while (s != this); @@ -2117,11 +2117,11 @@ public class Area implements Shape, Cloneable Segment former = this; while (v != this) { - v.reverseCoords(); - Segment vnext = v.next; - v.next = former; - former = v; - v = vnext; + v.reverseCoords(); + Segment vnext = v.next; + v.next = former; + former = v; + v = vnext; } next = former; } @@ -2144,9 +2144,9 @@ public class Area implements Shape, Cloneable Segment v = this; do { - if (! (v instanceof LineSegment)) - return false; - v = v.next; + if (! (v instanceof LineSegment)) + return false; + v = v.next; } while (v != this); return true; @@ -2162,16 +2162,16 @@ public class Area implements Shape, Cloneable while (v != this) { - list.add(v); - v = v.next; + list.add(v); + v = v.next; } Segment clone = (Segment) this.clone(); v = clone; for (int i = 0; i < list.size(); i++) { - clone.next = (Segment) ((Segment) list.elementAt(i)).clone(); - clone = clone.next; + clone.next = (Segment) ((Segment) list.elementAt(i)).clone(); + clone = clone.next; } clone.next = v; return v; @@ -2187,7 +2187,7 @@ public class Area implements Shape, Cloneable Point2D p = i.p; if ((pointEquals(P1, p) || pointEquals(P2, p)) && (pointEquals(b.P1, p) || pointEquals(b.P2, p))) - return 0; + return 0; subdivideInsert(i.ta); b.subdivideInsert(i.tb); @@ -2212,69 +2212,69 @@ public class Area implements Shape, Cloneable Vector v = new Vector(); for (int i = 0; i < x.length; i++) { - Point2D p = x[i].p; - if (! ((pointEquals(P1, p) || pointEquals(P2, p)) - && (pointEquals(b.P1, p) || pointEquals(b.P2, p)))) - v.add(x[i]); + Point2D p = x[i].p; + if (! ((pointEquals(P1, p) || pointEquals(P2, p)) + && (pointEquals(b.P1, p) || pointEquals(b.P2, p)))) + v.add(x[i]); } int nNodes = v.size(); Intersection[] A = new Intersection[nNodes]; Intersection[] B = new Intersection[nNodes]; for (int i = 0; i < nNodes; i++) - A[i] = B[i] = (Intersection) v.elementAt(i); + A[i] = B[i] = (Intersection) v.elementAt(i); // Create two lists sorted by the parameter // Bubble sort, OK I suppose, since the number of intersections // cannot be larger than 9 (cubic-cubic worst case) anyway for (int i = 0; i < nNodes - 1; i++) { - for (int j = i + 1; j < nNodes; j++) - { - if (A[i].ta > A[j].ta) - { - Intersection swap = A[i]; - A[i] = A[j]; - A[j] = swap; - } - if (B[i].tb > B[j].tb) - { - Intersection swap = B[i]; - B[i] = B[j]; - B[j] = swap; - } - } + for (int j = i + 1; j < nNodes; j++) + { + if (A[i].ta > A[j].ta) + { + Intersection swap = A[i]; + A[i] = A[j]; + A[j] = swap; + } + if (B[i].tb > B[j].tb) + { + Intersection swap = B[i]; + B[i] = B[j]; + B[j] = swap; + } + } } // subdivide a Segment s = this; for (int i = 0; i < nNodes; i++) { - s.subdivideInsert(A[i].ta); + s.subdivideInsert(A[i].ta); - // renormalize the parameters - for (int j = i + 1; j < nNodes; j++) - A[j].ta = (A[j].ta - A[i].ta) / (1.0 - A[i].ta); + // renormalize the parameters + for (int j = i + 1; j < nNodes; j++) + A[j].ta = (A[j].ta - A[i].ta) / (1.0 - A[i].ta); - A[i].seg = s; - s = s.next; + A[i].seg = s; + s = s.next; } // subdivide b, set nodes s = b; for (int i = 0; i < nNodes; i++) { - s.subdivideInsert(B[i].tb); + s.subdivideInsert(B[i].tb); - for (int j = i + 1; j < nNodes; j++) - B[j].tb = (B[j].tb - B[i].tb) / (1.0 - B[i].tb); + for (int j = i + 1; j < nNodes; j++) + B[j].tb = (B[j].tb - B[i].tb) / (1.0 - B[i].tb); - // set nodes - B[i].seg.node = s.next; // node a -> b - s.node = B[i].seg.next; // node b -> a + // set nodes + B[i].seg.node = s.next; // node a -> b + s.node = B[i].seg.next; // node b -> a - // snap points - B[i].seg.P2 = B[i].seg.next.P1 = s.P2 = s.next.P1 = B[i].p; - s = s.next; + // snap points + B[i].seg.P2 = B[i].seg.next.P1 = s.P2 = s.next.P1 = B[i].p; + s = s.next; } return nNodes; } @@ -2286,7 +2286,7 @@ public class Area implements Shape, Cloneable boolean pathEquals(Segment B) { if (! getPathBounds().equals(B.getPathBounds())) - return false; + return false; Segment startA = getTopLeft(); Segment startB = B.getTopLeft(); @@ -2294,16 +2294,16 @@ public class Area implements Shape, Cloneable Segment b = startB; do { - if (! a.equals(b)) - return false; + if (! a.equals(b)) + return false; - if (a instanceof LineSegment) - a = ((LineSegment) a).lastCoLinear(); - if (b instanceof LineSegment) - b = ((LineSegment) b).lastCoLinear(); + if (a instanceof LineSegment) + a = ((LineSegment) a).lastCoLinear(); + if (b instanceof LineSegment) + b = ((LineSegment) b).lastCoLinear(); - a = a.next; - b = b.next; + a = a.next; + b = b.next; } while (a != startA && b != startB); return true; @@ -2318,14 +2318,14 @@ public class Area implements Shape, Cloneable Segment tl = this; do { - if (v.P1.getY() < tl.P1.getY()) - tl = v; - else if (v.P1.getY() == tl.P1.getY()) - { - if (v.P1.getX() < tl.P1.getX()) - tl = v; - } - v = v.next; + if (v.P1.getY() < tl.P1.getY()) + tl = v; + else if (v.P1.getY() == tl.P1.getY()) + { + if (v.P1.getX() < tl.P1.getX()) + tl = v; + } + v = v.next; } while (v != this); return tl; @@ -2439,7 +2439,7 @@ public class Area implements Shape, Cloneable double y4 = b.P2.getY(); if ((y1 - y3) * (x4 - x3) - (x1 - x3) * (y4 - y3) != 0.0) - return false; + return false; return ((x2 - x1) * (y4 - y3) - (y2 - y1) * (x4 - x3) == 0.0); } @@ -2455,13 +2455,13 @@ public class Area implements Shape, Cloneable while (v instanceof LineSegment) { - if (isCoLinear((LineSegment) v)) - { - prev = v; - v = v.next; - } - else - return prev; + if (isCoLinear((LineSegment) v)) + { + prev = v; + v = v.next; + } + else + return prev; } return prev; } @@ -2474,12 +2474,12 @@ public class Area implements Shape, Cloneable boolean equals(Segment b) { if (! (b instanceof LineSegment)) - return false; + return false; Point2D p1 = P1; Point2D p3 = b.P1; if (! p1.equals(p3)) - return false; + return false; Point2D p2 = lastCoLinear().P2; Point2D p4 = ((LineSegment) b).lastCoLinear().P2; @@ -2502,13 +2502,13 @@ public class Area implements Shape, Cloneable boolean hasIntersections(Segment b) { if (b instanceof LineSegment) - return (linesIntersect(this, (LineSegment) b) != null); + return (linesIntersect(this, (LineSegment) b) != null); if (b instanceof QuadSegment) - return (lineQuadIntersect(this, (QuadSegment) b) != null); + return (lineQuadIntersect(this, (QuadSegment) b) != null); if (b instanceof CubicSegment) - return (lineCubicIntersect(this, (CubicSegment) b) != null); + return (lineCubicIntersect(this, (CubicSegment) b) != null); return false; } @@ -2521,27 +2521,27 @@ public class Area implements Shape, Cloneable { if (b instanceof LineSegment) { - Intersection i = linesIntersect(this, (LineSegment) b); + Intersection i = linesIntersect(this, (LineSegment) b); - if (i == null) - return 0; + if (i == null) + return 0; - return createNode(b, i); + return createNode(b, i); } Intersection[] x = null; if (b instanceof QuadSegment) - x = lineQuadIntersect(this, (QuadSegment) b); + x = lineQuadIntersect(this, (QuadSegment) b); if (b instanceof CubicSegment) - x = lineCubicIntersect(this, (CubicSegment) b); + x = lineCubicIntersect(this, (CubicSegment) b); if (x == null) - return 0; + return 0; if (x.length == 1) - return createNode(b, (Intersection) x[0]); + return createNode(b, (Intersection) x[0]); return createNodes(b, x); } @@ -2569,20 +2569,20 @@ public class Area implements Shape, Cloneable double y1 = P2.getY() - y; if (y0 * y1 > 0) - return 0; + return 0; if (x0 < 0 && x1 < 0) - return 0; + return 0; if (y0 == 0.0) - y0 -= EPSILON; + y0 -= EPSILON; if (y1 == 0.0) - y1 -= EPSILON; + y1 -= EPSILON; - if (Line2D.linesIntersect(x0, y0, x1, y1, - EPSILON, 0.0, Double.MAX_VALUE, 0.0)) - return 1; + if (Line2D.linesIntersect(x0, y0, x1, y1, + EPSILON, 0.0, Double.MAX_VALUE, 0.0)) + return 1; return 0; } } // class LineSegment @@ -2652,7 +2652,7 @@ public class Area implements Shape, Cloneable boolean equals(Segment b) { if (! (b instanceof QuadSegment)) - return false; + return false; return (P1.equals(b.P1) && cp.equals(((QuadSegment) b).cp) && P2.equals(b.P2)); @@ -2700,25 +2700,25 @@ public class Area implements Shape, Cloneable r1 = 2 * (y2 - 2 * y1 + y0); if (r1 != 0.0) { - double t = -r0 / r1; - if (t > 0.0 && t < 1.0) - { - double y = evaluatePoint(t).getY(); - ymax = Math.max(y, ymax); - ymin = Math.min(y, ymin); - } + double t = -r0 / r1; + if (t > 0.0 && t < 1.0) + { + double y = evaluatePoint(t).getY(); + ymax = Math.max(y, ymax); + ymin = Math.min(y, ymin); + } } r0 = 2 * (x1 - x0); r1 = 2 * (x2 - 2 * x1 + x0); if (r1 != 0.0) { - double t = -r0 / r1; - if (t > 0.0 && t < 1.0) - { - double x = evaluatePoint(t).getY(); - xmax = Math.max(x, xmax); - xmin = Math.min(x, xmin); - } + double t = -r0 / r1; + if (t > 0.0 && t < 1.0) + { + double x = evaluatePoint(t).getY(); + xmax = Math.max(x, xmax); + xmin = Math.min(x, xmin); + } } return (new Rectangle2D.Double(xmin, ymin, xmax - xmin, ymax - ymin)); @@ -2785,23 +2785,23 @@ public class Area implements Shape, Cloneable /* check if curve may intersect X+ axis. */ if ((x0 > 0.0 || x1 > 0.0 || x2 > 0.0) && (y0 * y1 <= 0 || y1 * y2 <= 0)) { - if (y0 == 0.0) - y0 -= EPSILON; - if (y2 == 0.0) - y2 -= EPSILON; - - r[0] = y0; - r[1] = 2 * (y1 - y0); - r[2] = (y2 - 2 * y1 + y0); - - nRoots = QuadCurve2D.solveQuadratic(r); - for (int i = 0; i < nRoots; i++) - if (r[i] > 0.0f && r[i] < 1.0f) - { - double t = r[i]; - if (t * t * (x2 - 2 * x1 + x0) + 2 * t * (x1 - x0) + x0 > 0.0) - nCrossings++; - } + if (y0 == 0.0) + y0 -= EPSILON; + if (y2 == 0.0) + y2 -= EPSILON; + + r[0] = y0; + r[1] = 2 * (y1 - y0); + r[2] = (y2 - 2 * y1 + y0); + + nRoots = QuadCurve2D.solveQuadratic(r); + for (int i = 0; i < nRoots; i++) + if (r[i] > 0.0f && r[i] < 1.0f) + { + double t = r[i]; + if (t * t * (x2 - 2 * x1 + x0) + 2 * t * (x1 - x0) + x0 > 0.0) + nCrossings++; + } } return nCrossings; } @@ -2825,27 +2825,27 @@ public class Area implements Shape, Cloneable int splitIntersections(Segment b) { if (b instanceof LineSegment) - return (b.splitIntersections(this)); + return (b.splitIntersections(this)); if (b instanceof CubicSegment) - return (b.splitIntersections(this)); + return (b.splitIntersections(this)); if (b instanceof QuadSegment) { - // Use the cubic-cubic intersection routine for quads as well, - // Since a quadratic can be exactly described as a cubic, this - // should not be a problem; - // The recursion depth will be the same in any case. - Intersection[] x = cubicCubicIntersect(getCubicSegment(), - ((QuadSegment) b) - .getCubicSegment()); - if (x == null) - return 0; - - if (x.length == 1) - return createNode(b, (Intersection) x[0]); - - return createNodes(b, x); + // Use the cubic-cubic intersection routine for quads as well, + // Since a quadratic can be exactly described as a cubic, this + // should not be a problem; + // The recursion depth will be the same in any case. + Intersection[] x = cubicCubicIntersect(getCubicSegment(), + ((QuadSegment) b) + .getCubicSegment()); + if (x == null) + return 0; + + if (x.length == 1) + return createNode(b, (Intersection) x[0]); + + return createNodes(b, x); } return 0; } @@ -2959,7 +2959,7 @@ public class Area implements Shape, Cloneable boolean equals(Segment b) { if (! (b instanceof CubicSegment)) - return false; + return false; return (P1.equals(b.P1) && cp1.equals(((CubicSegment) b).cp1) && cp2.equals(((CubicSegment) b).cp2) && P2.equals(b.P2)); @@ -3015,13 +3015,13 @@ public class Area implements Shape, Cloneable int n = QuadCurve2D.solveQuadratic(r); for (int i = 0; i < n; i++) { - double t = r[i]; - if (t > 0 && t < 1.0) - { - double y = evaluatePoint(t).getY(); - ymax = Math.max(y, ymax); - ymin = Math.min(y, ymin); - } + double t = r[i]; + if (t > 0 && t < 1.0) + { + double y = evaluatePoint(t).getY(); + ymax = Math.max(y, ymax); + ymin = Math.min(y, ymin); + } } r[0] = 3 * (x1 - x0); @@ -3030,13 +3030,13 @@ public class Area implements Shape, Cloneable n = QuadCurve2D.solveQuadratic(r); for (int i = 0; i < n; i++) { - double t = r[i]; - if (t > 0 && t < 1.0) - { - double x = evaluatePoint(t).getX(); - xmax = Math.max(x, xmax); - xmin = Math.min(x, xmin); - } + double t = r[i]; + if (t > 0 && t < 1.0) + { + double x = evaluatePoint(t).getX(); + xmax = Math.max(x, xmax); + xmin = Math.min(x, xmin); + } } return (new Rectangle2D.Double(xmin, ymin, (xmax - xmin), (ymax - ymin))); } @@ -3078,38 +3078,38 @@ public class Area implements Shape, Cloneable // A qudratic if (R == 0.0 && T == 0.0) - return null; + return null; // true cubic if (R != 0.0 && T != 0.0) { - A = 3 * (x2 + x0 - 2 * x1) / R; - B = 3 * (x1 - x0) / R; + A = 3 * (x2 + x0 - 2 * x1) / R; + B = 3 * (x1 - x0) / R; - double P = 3 * (y2 + y0 - 2 * y1) / T; - double Q = 3 * (y1 - y0) / T; + double P = 3 * (y2 + y0 - 2 * y1) / T; + double Q = 3 * (y1 - y0) / T; - if (A == P || Q == B) - return null; + if (A == P || Q == B) + return null; - k = (Q - B) / (A - P); + k = (Q - B) / (A - P); } else { - if (R == 0.0) - { - // quadratic in x - k = -(3 * (x1 - x0)) / (3 * (x2 + x0 - 2 * x1)); - A = 3 * (y2 + y0 - 2 * y1) / T; - B = 3 * (y1 - y0) / T; - } - else - { - // quadratic in y - k = -(3 * (y1 - y0)) / (3 * (y2 + y0 - 2 * y1)); - A = 3 * (x2 + x0 - 2 * x1) / R; - B = 3 * (x1 - x0) / R; - } + if (R == 0.0) + { + // quadratic in x + k = -(3 * (x1 - x0)) / (3 * (x2 + x0 - 2 * x1)); + A = 3 * (y2 + y0 - 2 * y1) / T; + B = 3 * (y1 - y0) / T; + } + else + { + // quadratic in y + k = -(3 * (y1 - y0)) / (3 * (y2 + y0 - 2 * y1)); + A = 3 * (x2 + x0 - 2 * x1) / R; + B = 3 * (x1 - x0) / R; + } } r[0] = -k * k * k - A * k * k - B * k; @@ -3119,27 +3119,27 @@ public class Area implements Shape, Cloneable int n = CubicCurve2D.solveCubic(r); if (n != 3) - return null; + return null; // sort r double t; for (int i = 0; i < 2; i++) - for (int j = i + 1; j < 3; j++) - if (r[j] < r[i]) - { - t = r[i]; - r[i] = r[j]; - r[j] = t; - } + for (int j = i + 1; j < 3; j++) + if (r[j] < r[i]) + { + t = r[i]; + r[i] = r[j]; + r[j] = t; + } if (Math.abs(r[0] + r[2] - k) < 1E-13) - if (r[0] >= 0.0 && r[0] <= 1.0 && r[2] >= 0.0 && r[2] <= 1.0) - if (evaluatePoint(r[0]).distance(evaluatePoint(r[2])) < PE_EPSILON * 10) - { // we snap the points anyway - results[0] = r[0]; - results[1] = r[2]; - return (results); - } + if (r[0] >= 0.0 && r[0] <= 1.0 && r[2] >= 0.0 && r[2] <= 1.0) + if (evaluatePoint(r[0]).distance(evaluatePoint(r[2])) < PE_EPSILON * 10) + { // we snap the points anyway + results[0] = r[0]; + results[1] = r[2]; + return (results); + } return null; } @@ -3195,28 +3195,28 @@ public class Area implements Shape, Cloneable if ((x0 > 0.0 || x1 > 0.0 || x2 > 0.0 || x3 > 0.0) && (y0 * y1 <= 0 || y1 * y2 <= 0 || y2 * y3 <= 0)) { - if (y0 == 0.0) - y0 -= EPSILON; - if (y3 == 0.0) - y3 -= EPSILON; - - r[0] = y0; - r[1] = 3 * (y1 - y0); - r[2] = 3 * (y2 + y0 - 2 * y1); - r[3] = y3 - 3 * y2 + 3 * y1 - y0; - - if ((nRoots = CubicCurve2D.solveCubic(r)) > 0) - for (int i = 0; i < nRoots; i++) - { - if (r[i] > 0.0 && r[i] < 1.0) - { - double t = r[i]; - if (-(t * t * t) * (x0 - 3 * x1 + 3 * x2 - x3) - + 3 * t * t * (x0 - 2 * x1 + x2) + 3 * t * (x1 - x0) - + x0 > 0.0) - nCrossings++; - } - } + if (y0 == 0.0) + y0 -= EPSILON; + if (y3 == 0.0) + y3 -= EPSILON; + + r[0] = y0; + r[1] = 3 * (y1 - y0); + r[2] = 3 * (y2 + y0 - 2 * y1); + r[3] = y3 - 3 * y2 + 3 * y1 - y0; + + if ((nRoots = CubicCurve2D.solveCubic(r)) > 0) + for (int i = 0; i < nRoots; i++) + { + if (r[i] > 0.0 && r[i] < 1.0) + { + double t = r[i]; + if (-(t * t * t) * (x0 - 3 * x1 + 3 * x2 - x3) + + 3 * t * t * (x0 - 2 * x1 + x2) + 3 * t * (x1 - x0) + + x0 > 0.0) + nCrossings++; + } + } } return nCrossings; } @@ -3241,21 +3241,21 @@ public class Area implements Shape, Cloneable int splitIntersections(Segment b) { if (b instanceof LineSegment) - return (b.splitIntersections(this)); + return (b.splitIntersections(this)); Intersection[] x = null; if (b instanceof QuadSegment) - x = cubicCubicIntersect(this, ((QuadSegment) b).getCubicSegment()); + x = cubicCubicIntersect(this, ((QuadSegment) b).getCubicSegment()); if (b instanceof CubicSegment) - x = cubicCubicIntersect(this, (CubicSegment) b); + x = cubicCubicIntersect(this, (CubicSegment) b); if (x == null) - return 0; + return 0; if (x.length == 1) - return createNode(b, x[0]); + return createNode(b, x[0]); return createNodes(b, x); } diff --git a/libjava/classpath/java/awt/geom/CubicCurve2D.java b/libjava/classpath/java/awt/geom/CubicCurve2D.java index d0d5598..5cb11fe 100644 --- a/libjava/classpath/java/awt/geom/CubicCurve2D.java +++ b/libjava/classpath/java/awt/geom/CubicCurve2D.java @@ -585,26 +585,26 @@ public abstract class CubicCurve2D implements Shape, Cloneable if (left != null) { - left[leftOff] = left_P1_x; - left[leftOff + 1] = left_P1_y; - left[leftOff + 2] = left_C1_x; - left[leftOff + 3] = left_C1_y; - left[leftOff + 4] = left_C2_x; - left[leftOff + 5] = left_C2_y; - left[leftOff + 6] = Mid_x; - left[leftOff + 7] = Mid_y; + left[leftOff] = left_P1_x; + left[leftOff + 1] = left_P1_y; + left[leftOff + 2] = left_C1_x; + left[leftOff + 3] = left_C1_y; + left[leftOff + 4] = left_C2_x; + left[leftOff + 5] = left_C2_y; + left[leftOff + 6] = Mid_x; + left[leftOff + 7] = Mid_y; } if (right != null) { - right[rightOff] = Mid_x; - right[rightOff + 1] = Mid_y; - right[rightOff + 2] = right_C1_x; - right[rightOff + 3] = right_C1_y; - right[rightOff + 4] = right_C2_x; - right[rightOff + 5] = right_C2_y; - right[rightOff + 6] = right_P2_x; - right[rightOff + 7] = right_P2_y; + right[rightOff] = Mid_x; + right[rightOff + 1] = Mid_y; + right[rightOff + 2] = right_C1_x; + right[rightOff + 3] = right_C1_y; + right[rightOff + 4] = right_C2_x; + right[rightOff + 5] = right_C2_y; + right[rightOff + 6] = right_P2_x; + right[rightOff + 7] = right_P2_y; } } @@ -710,7 +710,7 @@ public abstract class CubicCurve2D implements Shape, Cloneable // The Java implementation is very similar to the GSL code, but // not a strict one-to-one copy. For example, GSL would sort the // result. - + double a; double b; double c; @@ -749,46 +749,46 @@ public abstract class CubicCurve2D implements Shape, Cloneable if (R == 0 && Q == 0) { - // The GNU Scientific Library would return three identical - // solutions in this case. - res[0] = -a / 3; - return 1; + // The GNU Scientific Library would return three identical + // solutions in this case. + res[0] = -a / 3; + return 1; } if (CR2 == CQ3) { - /* this test is actually R2 == Q3, written in a form suitable - for exact computation with integers */ - /* Due to finite precision some double roots may be missed, and - considered to be a pair of complex roots z = x +/- epsilon i - close to the real axis. */ - double sqrtQ = Math.sqrt(Q); - - if (R > 0) - { - res[0] = -2 * sqrtQ - a / 3; - res[1] = sqrtQ - a / 3; - } - else - { - res[0] = -sqrtQ - a / 3; - res[1] = 2 * sqrtQ - a / 3; - } - return 2; + /* this test is actually R2 == Q3, written in a form suitable + for exact computation with integers */ + /* Due to finite precision some double roots may be missed, and + considered to be a pair of complex roots z = x +/- epsilon i + close to the real axis. */ + double sqrtQ = Math.sqrt(Q); + + if (R > 0) + { + res[0] = -2 * sqrtQ - a / 3; + res[1] = sqrtQ - a / 3; + } + else + { + res[0] = -sqrtQ - a / 3; + res[1] = 2 * sqrtQ - a / 3; + } + return 2; } if (CR2 < CQ3) /* equivalent to R2 < Q3 */ { - double sqrtQ = Math.sqrt(Q); - double sqrtQ3 = sqrtQ * sqrtQ * sqrtQ; - double theta = Math.acos(R / sqrtQ3); - double norm = -2 * sqrtQ; - res[0] = norm * Math.cos(theta / 3) - a / 3; - res[1] = norm * Math.cos((theta + 2.0 * Math.PI) / 3) - a / 3; - res[2] = norm * Math.cos((theta - 2.0 * Math.PI) / 3) - a / 3; - - // The GNU Scientific Library sorts the results. We don't. - return 3; + double sqrtQ = Math.sqrt(Q); + double sqrtQ3 = sqrtQ * sqrtQ * sqrtQ; + double theta = Math.acos(R / sqrtQ3); + double norm = -2 * sqrtQ; + res[0] = norm * Math.cos(theta / 3) - a / 3; + res[1] = norm * Math.cos((theta + 2.0 * Math.PI) / 3) - a / 3; + res[2] = norm * Math.cos((theta - 2.0 * Math.PI) / 3) - a / 3; + + // The GNU Scientific Library sorts the results. We don't. + return 3; } double sgnR = (R >= 0 ? 1 : -1); @@ -862,7 +862,7 @@ public abstract class CubicCurve2D implements Shape, Cloneable } /** - * Determines whether any part of a Rectangle2D is inside the area bounded + * Determines whether any part of a Rectangle2D is inside the area bounded * by the curve and the straight line connecting its end points. * @see #intersects(double, double, double, double) */ @@ -902,7 +902,7 @@ public abstract class CubicCurve2D implements Shape, Cloneable } /** - * Determine whether a Rectangle2D is entirely inside the area that is + * Determine whether a Rectangle2D is entirely inside the area that is * bounded by the curve and the straight line connecting its end points. * * <p><img src="doc-files/CubicCurve2D-5.png" width="350" height="180" @@ -930,77 +930,77 @@ public abstract class CubicCurve2D implements Shape, Cloneable { return new PathIterator() { - /** Current coordinate. */ - private int current = 0; - - public int getWindingRule() - { - return WIND_NON_ZERO; - } - - public boolean isDone() - { - return current >= 2; - } - - public void next() - { - current++; - } - - public int currentSegment(float[] coords) - { - int result; - switch (current) - { - case 0: - coords[0] = (float) getX1(); - coords[1] = (float) getY1(); - result = SEG_MOVETO; - break; - case 1: - coords[0] = (float) getCtrlX1(); - coords[1] = (float) getCtrlY1(); - coords[2] = (float) getCtrlX2(); - coords[3] = (float) getCtrlY2(); - coords[4] = (float) getX2(); - coords[5] = (float) getY2(); - result = SEG_CUBICTO; - break; - default: - throw new NoSuchElementException("cubic iterator out of bounds"); - } - if (at != null) - at.transform(coords, 0, coords, 0, 3); - return result; - } - - public int currentSegment(double[] coords) - { - int result; - switch (current) - { - case 0: - coords[0] = getX1(); - coords[1] = getY1(); - result = SEG_MOVETO; - break; - case 1: - coords[0] = getCtrlX1(); - coords[1] = getCtrlY1(); - coords[2] = getCtrlX2(); - coords[3] = getCtrlY2(); - coords[4] = getX2(); - coords[5] = getY2(); - result = SEG_CUBICTO; - break; - default: - throw new NoSuchElementException("cubic iterator out of bounds"); - } - if (at != null) - at.transform(coords, 0, coords, 0, 3); - return result; - } + /** Current coordinate. */ + private int current = 0; + + public int getWindingRule() + { + return WIND_NON_ZERO; + } + + public boolean isDone() + { + return current >= 2; + } + + public void next() + { + current++; + } + + public int currentSegment(float[] coords) + { + int result; + switch (current) + { + case 0: + coords[0] = (float) getX1(); + coords[1] = (float) getY1(); + result = SEG_MOVETO; + break; + case 1: + coords[0] = (float) getCtrlX1(); + coords[1] = (float) getCtrlY1(); + coords[2] = (float) getCtrlX2(); + coords[3] = (float) getCtrlY2(); + coords[4] = (float) getX2(); + coords[5] = (float) getY2(); + result = SEG_CUBICTO; + break; + default: + throw new NoSuchElementException("cubic iterator out of bounds"); + } + if (at != null) + at.transform(coords, 0, coords, 0, 3); + return result; + } + + public int currentSegment(double[] coords) + { + int result; + switch (current) + { + case 0: + coords[0] = getX1(); + coords[1] = getY1(); + result = SEG_MOVETO; + break; + case 1: + coords[0] = getCtrlX1(); + coords[1] = getCtrlY1(); + coords[2] = getCtrlX2(); + coords[3] = getCtrlY2(); + coords[4] = getX2(); + coords[5] = getY2(); + result = SEG_CUBICTO; + break; + default: + throw new NoSuchElementException("cubic iterator out of bounds"); + } + if (at != null) + at.transform(coords, 0, coords, 0, 3); + return result; + } }; } @@ -1018,11 +1018,11 @@ public abstract class CubicCurve2D implements Shape, Cloneable { try { - return super.clone(); + return super.clone(); } catch (CloneNotSupportedException e) { - throw (Error) new InternalError().initCause(e); // Impossible + throw (Error) new InternalError().initCause(e); // Impossible } } @@ -1042,7 +1042,7 @@ public abstract class CubicCurve2D implements Shape, Cloneable * * A special-case not adressed in this code is self-intersections * of the curve, e.g. if the axis intersects the self-itersection, - * the degenerate roots of the polynomial will erroneously count as + * the degenerate roots of the polynomial will erroneously count as * a single intersection of the curve, and not two. */ private int getAxisIntersections(double x, double y, boolean useYaxis, @@ -1064,48 +1064,48 @@ public abstract class CubicCurve2D implements Shape, Cloneable if (useYaxis) { - a0 = getY1() - y; - a1 = getCtrlY1() - y; - a2 = getCtrlY2() - y; - a3 = getY2() - y; - b0 = getX1() - x; - b1 = getCtrlX1() - x; - b2 = getCtrlX2() - x; - b3 = getX2() - x; + a0 = getY1() - y; + a1 = getCtrlY1() - y; + a2 = getCtrlY2() - y; + a3 = getY2() - y; + b0 = getX1() - x; + b1 = getCtrlX1() - x; + b2 = getCtrlX2() - x; + b3 = getX2() - x; } else { - a0 = getX1() - x; - a1 = getCtrlX1() - x; - a2 = getCtrlX2() - x; - a3 = getX2() - x; - b0 = getY1() - y; - b1 = getCtrlY1() - y; - b2 = getCtrlY2() - y; - b3 = getY2() - y; + a0 = getX1() - x; + a1 = getCtrlX1() - x; + a2 = getCtrlX2() - x; + a3 = getX2() - x; + b0 = getY1() - y; + b1 = getCtrlY1() - y; + b2 = getCtrlY2() - y; + b3 = getY2() - y; } - /* If the axis intersects a start/endpoint, shift it up by some small + /* If the axis intersects a start/endpoint, shift it up by some small amount to guarantee the line is 'inside' If this is not done, bad behaviour may result for points on that axis.*/ if (a0 == 0.0 || a3 == 0.0) { - double small = getFlatness() * EPSILON; - if (a0 == 0.0) - a0 -= small; - if (a3 == 0.0) - a3 -= small; + double small = getFlatness() * EPSILON; + if (a0 == 0.0) + a0 -= small; + if (a3 == 0.0) + a3 -= small; } if (useYaxis) { - if (Line2D.linesIntersect(b0, a0, b3, a3, EPSILON, 0.0, distance, 0.0)) - nCrossings++; + if (Line2D.linesIntersect(b0, a0, b3, a3, EPSILON, 0.0, distance, 0.0)) + nCrossings++; } else { - if (Line2D.linesIntersect(a0, b0, a3, b3, 0.0, EPSILON, 0.0, distance)) - nCrossings++; + if (Line2D.linesIntersect(a0, b0, a3, b3, 0.0, EPSILON, 0.0, distance)) + nCrossings++; } r[0] = a0; @@ -1116,15 +1116,15 @@ public abstract class CubicCurve2D implements Shape, Cloneable if ((nRoots = solveCubic(r)) != 0) for (int i = 0; i < nRoots; i++) { - double t = r[i]; - if (t >= 0.0 && t <= 1.0) - { - double crossing = -(t * t * t) * (b0 - 3 * b1 + 3 * b2 - b3) - + 3 * t * t * (b0 - 2 * b1 + b2) - + 3 * t * (b1 - b0) + b0; - if (crossing > 0.0 && crossing <= distance) - nCrossings++; - } + double t = r[i]; + if (t >= 0.0 && t <= 1.0) + { + double crossing = -(t * t * t) * (b0 - 3 * b1 + 3 * b2 - b3) + + 3 * t * t * (b0 - 2 * b1 + b2) + + 3 * t * (b1 - b0) + b0; + if (crossing > 0.0 && crossing <= distance) + nCrossings++; + } } return (nCrossings); diff --git a/libjava/classpath/java/awt/geom/Ellipse2D.java b/libjava/classpath/java/awt/geom/Ellipse2D.java index e883077..3bbf2f0 100644 --- a/libjava/classpath/java/awt/geom/Ellipse2D.java +++ b/libjava/classpath/java/awt/geom/Ellipse2D.java @@ -101,7 +101,7 @@ public abstract class Ellipse2D extends RectangularShape * Note: An ellipse cannot be represented exactly in PathIterator * segments, the outline is thefore approximated with cubic * Bezier segments. - * + * * @param at an optional transform. * @return A path iterator. */ @@ -242,7 +242,7 @@ public abstract class Ellipse2D extends RectangularShape /** * Returns <code>true</code> if the ellipse encloses no area, and * <code>false</code> otherwise. - * + * * @return A boolean. */ public boolean isEmpty() @@ -368,7 +368,7 @@ public abstract class Ellipse2D extends RectangularShape /** * Returns <code>true</code> if the ellipse encloses no area, and * <code>false</code> otherwise. - * + * * @return A boolean. */ public boolean isEmpty() diff --git a/libjava/classpath/java/awt/geom/FlatteningPathIterator.java b/libjava/classpath/java/awt/geom/FlatteningPathIterator.java index b06e6cc..629936b 100644 --- a/libjava/classpath/java/awt/geom/FlatteningPathIterator.java +++ b/libjava/classpath/java/awt/geom/FlatteningPathIterator.java @@ -141,8 +141,8 @@ public class FlatteningPathIterator */ private int[] recLevel; - - + + private final double[] scratch = new double[6]; @@ -387,7 +387,7 @@ public class FlatteningPathIterator } srcSegType = srcIter.currentSegment(scratch); - + switch (srcSegType) { case PathIterator.SEG_CLOSE: @@ -493,7 +493,7 @@ public class FlatteningPathIterator && (CubicCurve2D.getFlatnessSq(stack, sp) >= flatnessSq)) { recLevel[stackSize] = recLevel[stackSize - 1] = ++level; - + CubicCurve2D.subdivide(stack, sp, stack, sp - 6, stack, sp); ++stackSize; sp -= 6; diff --git a/libjava/classpath/java/awt/geom/GeneralPath.java b/libjava/classpath/java/awt/geom/GeneralPath.java index fa27d19..99f1905 100644 --- a/libjava/classpath/java/awt/geom/GeneralPath.java +++ b/libjava/classpath/java/awt/geom/GeneralPath.java @@ -61,11 +61,11 @@ import java.awt.Shape; * * <p>The NON_ZERO winding rule defines a point as inside a path if: * The path intersects the ray in an equal number of opposite directions. - * Point <b>A</b> in the image is outside (one intersection in the + * Point <b>A</b> in the image is outside (one intersection in the * ’up’ - * direction, one in the ’down’ direction) Point <b>B</b> in + * direction, one in the ’down’ direction) Point <b>B</b> in * the image is inside (one intersection ’down’) - * Point <b>C</b> in the image is inside (two intersections in the + * Point <b>C</b> in the image is inside (two intersections in the * ’down’ direction) * * @see Line2D @@ -135,9 +135,9 @@ public final class GeneralPath implements Shape, Cloneable /** * Constructs a GeneralPath with a specific winding rule * and the default initial capacity (20). - * @param rule the winding rule ({@link #WIND_NON_ZERO} or + * @param rule the winding rule ({@link #WIND_NON_ZERO} or * {@link #WIND_EVEN_ODD}) - * + * * @throws IllegalArgumentException if <code>rule</code> is not one of the * listed values. */ @@ -150,10 +150,10 @@ public final class GeneralPath implements Shape, Cloneable * Constructs a GeneralPath with a specific winding rule * and the initial capacity. The initial capacity should be * the approximate number of path segments to be used. - * @param rule the winding rule ({@link #WIND_NON_ZERO} or + * @param rule the winding rule ({@link #WIND_NON_ZERO} or * {@link #WIND_EVEN_ODD}) * @param capacity the inital capacity, in path segments - * + * * @throws IllegalArgumentException if <code>rule</code> is not one of the * listed values. */ @@ -172,9 +172,9 @@ public final class GeneralPath implements Shape, Cloneable /** * Constructs a GeneralPath from an arbitrary shape object. * The Shapes PathIterator path and winding rule will be used. - * + * * @param s the shape (<code>null</code> not permitted). - * + * * @throws NullPointerException if <code>shape</code> is <code>null</code>. */ public GeneralPath(Shape s) @@ -189,7 +189,7 @@ public final class GeneralPath implements Shape, Cloneable /** * Adds a new point to a path. - * + * * @param x the x-coordinate. * @param y the y-coordinate. */ @@ -269,13 +269,13 @@ public final class GeneralPath implements Shape, Cloneable } /** - * Appends the segments of a Shape to the path. If <code>connect</code> is + * Appends the segments of a Shape to the path. If <code>connect</code> is * true, the new path segments are connected to the existing one with a line. * The winding rule of the Shape is ignored. - * + * * @param s the shape (<code>null</code> not permitted). * @param connect whether to connect the new shape to the existing path. - * + * * @throws NullPointerException if <code>s</code> is <code>null</code>. */ public void append(Shape s, boolean connect) @@ -306,42 +306,42 @@ public final class GeneralPath implements Shape, Cloneable float[] f = new float[6]; while (! iter.isDone()) { - switch (iter.currentSegment(f)) - { - case PathIterator.SEG_MOVETO: - if (! connect || (index == 0)) - { - moveTo(f[0], f[1]); - break; - } - if ((index >= 1) && (types[index - 1] == PathIterator.SEG_CLOSE) - && (f[0] == xpoints[index - 1]) - && (f[1] == ypoints[index - 1])) - break; - - // Fall through. - case PathIterator.SEG_LINETO: - lineTo(f[0], f[1]); - break; - case PathIterator.SEG_QUADTO: - quadTo(f[0], f[1], f[2], f[3]); - break; - case PathIterator.SEG_CUBICTO: - curveTo(f[0], f[1], f[2], f[3], f[4], f[5]); - break; - case PathIterator.SEG_CLOSE: - closePath(); - break; - } - - connect = false; - iter.next(); + switch (iter.currentSegment(f)) + { + case PathIterator.SEG_MOVETO: + if (! connect || (index == 0)) + { + moveTo(f[0], f[1]); + break; + } + if ((index >= 1) && (types[index - 1] == PathIterator.SEG_CLOSE) + && (f[0] == xpoints[index - 1]) + && (f[1] == ypoints[index - 1])) + break; + + // Fall through. + case PathIterator.SEG_LINETO: + lineTo(f[0], f[1]); + break; + case PathIterator.SEG_QUADTO: + quadTo(f[0], f[1], f[2], f[3]); + break; + case PathIterator.SEG_CUBICTO: + curveTo(f[0], f[1], f[2], f[3], f[4], f[5]); + break; + case PathIterator.SEG_CLOSE: + closePath(); + break; + } + + connect = false; + iter.next(); } } /** * Returns the path’s current winding rule. - * + * * @return {@link #WIND_EVEN_ODD} or {@link #WIND_NON_ZERO}. */ public int getWindingRule() @@ -350,11 +350,11 @@ public final class GeneralPath implements Shape, Cloneable } /** - * Sets the path’s winding rule, which controls which areas are - * considered ’inside’ or ’outside’ the path - * on drawing. Valid rules are WIND_EVEN_ODD for an even-odd winding rule, + * Sets the path’s winding rule, which controls which areas are + * considered ’inside’ or ’outside’ the path + * on drawing. Valid rules are WIND_EVEN_ODD for an even-odd winding rule, * or WIND_NON_ZERO for a non-zero winding rule. - * + * * @param rule the rule ({@link #WIND_EVEN_ODD} or {@link #WIND_NON_ZERO}). */ public void setWindingRule(int rule) @@ -366,7 +366,7 @@ public final class GeneralPath implements Shape, Cloneable /** * Returns the current appending point of the path. - * + * * @return The point. */ public Point2D getCurrentPoint() @@ -387,7 +387,7 @@ public final class GeneralPath implements Shape, Cloneable /** * Applies a transform to the path. - * + * * @param xform the transform (<code>null</code> not permitted). */ public void transform(AffineTransform xform) @@ -398,10 +398,10 @@ public final class GeneralPath implements Shape, Cloneable xform.getMatrix(m); for (int i = 0; i < index; i++) { - nx = m[0] * xpoints[i] + m[2] * ypoints[i] + m[4]; - ny = m[1] * xpoints[i] + m[3] * ypoints[i] + m[5]; - xpoints[i] = (float) nx; - ypoints[i] = (float) ny; + nx = m[0] * xpoints[i] + m[2] * ypoints[i] + m[4]; + ny = m[1] * xpoints[i] + m[3] * ypoints[i] + m[5]; + xpoints[i] = (float) nx; + ypoints[i] = (float) ny; } } @@ -437,18 +437,18 @@ public final class GeneralPath implements Shape, Cloneable if (index > 0) { - x1 = x2 = xpoints[0]; - y1 = y2 = ypoints[0]; + x1 = x2 = xpoints[0]; + y1 = y2 = ypoints[0]; } else x1 = x2 = y1 = y2 = 0.0f; for (int i = 0; i < index; i++) { - x1 = Math.min(xpoints[i], x1); - y1 = Math.min(ypoints[i], y1); - x2 = Math.max(xpoints[i], x2); - y2 = Math.max(ypoints[i], y2); + x1 = Math.min(xpoints[i], x1); + y1 = Math.min(ypoints[i], y1); + x2 = Math.max(xpoints[i], x2); + y2 = Math.max(ypoints[i], y2); } return (new Rectangle2D.Float(x1, y1, x2 - x1, y2 - y1)); } @@ -563,11 +563,11 @@ public final class GeneralPath implements Shape, Cloneable /** * The number of coordinate values for each segment type. */ - private static final int[] NUM_COORDS = { - /* 0: SEG_MOVETO */ 1, - /* 1: SEG_LINETO */ 1, - /* 2: SEG_QUADTO */ 2, - /* 3: SEG_CUBICTO */ 3, + private static final int[] NUM_COORDS = { + /* 0: SEG_MOVETO */ 1, + /* 1: SEG_LINETO */ 1, + /* 2: SEG_QUADTO */ 2, + /* 3: SEG_CUBICTO */ 3, /* 4: SEG_CLOSE */ 0}; /** @@ -630,9 +630,9 @@ public final class GeneralPath implements Shape, Cloneable */ seg = path.types[pos]; if (seg == SEG_CLOSE) - pos++; + pos++; else - pos += NUM_COORDS[seg]; + pos += NUM_COORDS[seg]; } /** @@ -647,17 +647,17 @@ public final class GeneralPath implements Shape, Cloneable numCoords = NUM_COORDS[seg]; if (numCoords > 0) { - for (int i = 0; i < numCoords; i++) - { - coords[i << 1] = path.xpoints[pos + i]; - coords[(i << 1) + 1] = path.ypoints[pos + i]; - } - - if (transform != null) - transform.transform( /* src */ - coords, /* srcOffset */ - 0, /* dest */ coords, /* destOffset */ - 0, /* numPoints */ numCoords); + for (int i = 0; i < numCoords; i++) + { + coords[i << 1] = path.xpoints[pos + i]; + coords[(i << 1) + 1] = path.ypoints[pos + i]; + } + + if (transform != null) + transform.transform( /* src */ + coords, /* srcOffset */ + 0, /* dest */ coords, /* destOffset */ + 0, /* numPoints */ numCoords); } return seg; } @@ -674,16 +674,16 @@ public final class GeneralPath implements Shape, Cloneable numCoords = NUM_COORDS[seg]; if (numCoords > 0) { - for (int i = 0; i < numCoords; i++) - { - coords[i << 1] = (double) path.xpoints[pos + i]; - coords[(i << 1) + 1] = (double) path.ypoints[pos + i]; - } - if (transform != null) - transform.transform( /* src */ - coords, /* srcOffset */ - 0, /* dest */ coords, /* destOffset */ - 0, /* numPoints */ numCoords); + for (int i = 0; i < numCoords; i++) + { + coords[i << 1] = (double) path.xpoints[pos + i]; + coords[(i << 1) + 1] = (double) path.ypoints[pos + i]; + } + if (transform != null) + transform.transform( /* src */ + coords, /* srcOffset */ + 0, /* dest */ coords, /* destOffset */ + 0, /* numPoints */ numCoords); } return seg; } @@ -710,7 +710,7 @@ public final class GeneralPath implements Shape, Cloneable } /** - * Creates a new shape of the same run-time type with the same contents + * Creates a new shape of the same run-time type with the same contents * as this one. * * @return the clone @@ -728,7 +728,7 @@ public final class GeneralPath implements Shape, Cloneable /** * Helper method - ensure the size of the data arrays, * otherwise, reallocate new ones twice the size - * + * * @param size the minimum array size. */ private void ensureSize(int size) @@ -749,7 +749,7 @@ public final class GeneralPath implements Shape, Cloneable } /** - * Helper method - Get the total number of intersections from (x,y) along + * Helper method - Get the total number of intersections from (x,y) along * a given axis, within a given distance. */ private int getAxisIntersections(double x, double y, boolean useYaxis, @@ -763,21 +763,21 @@ public final class GeneralPath implements Shape, Cloneable */ private int getWindingNumber(double x, double y) { - /* Evaluate the crossings from x,y to infinity on the y axis (arbitrary - choice). Note that we don't actually use Double.INFINITY, since that's + /* Evaluate the crossings from x,y to infinity on the y axis (arbitrary + choice). Note that we don't actually use Double.INFINITY, since that's slower, and may cause problems. */ return (evaluateCrossings(x, y, true, true, BIG_VALUE)); } /** - * Helper method - evaluates the number of intersections on an axis from + * Helper method - evaluates the number of intersections on an axis from * the point (x,y) to the point (x,y+distance) or (x+distance,y). * @param x x coordinate. * @param y y coordinate. - * @param neg True if opposite-directed intersections should cancel, + * @param neg True if opposite-directed intersections should cancel, * false to sum all intersections. * @param useYaxis Use the Y axis, false uses the X axis. - * @param distance Interval from (x,y) on the selected axis to find + * @param distance Interval from (x,y) on the selected axis to find * intersections. */ private int evaluateCrossings(double x, double y, boolean neg, @@ -808,186 +808,185 @@ public final class GeneralPath implements Shape, Cloneable return (0); if (useYaxis) { - float[] swap1; - swap1 = ypoints; - ypoints = xpoints; - xpoints = swap1; - double swap2; - swap2 = y; - y = x; - x = swap2; + float[] swap1; + swap1 = ypoints; + ypoints = xpoints; + xpoints = swap1; + double swap2; + swap2 = y; + y = x; + x = swap2; } /* Get a value which is hopefully small but not insignificant relative the path. */ epsilon = ypoints[0] * 1E-7; - if(epsilon == 0) + if(epsilon == 0) epsilon = 1E-7; pos = 0; while (pos < index) { - switch (types[pos]) - { - case PathIterator.SEG_MOVETO: - if (pathStarted) // close old path - { - x0 = cx; - y0 = cy; - x1 = firstx; - y1 = firsty; - - if (y0 == 0.0) - y0 -= epsilon; - if (y1 == 0.0) - y1 -= epsilon; - if (Line2D.linesIntersect(x0, y0, x1, y1, - epsilon, 0.0, distance, 0.0)) - windingNumber += (y1 < y0) ? 1 : negative; - - cx = firstx; - cy = firsty; - } - cx = firstx = xpoints[pos] - (float) x; - cy = firsty = ypoints[pos++] - (float) y; - pathStarted = true; - break; - case PathIterator.SEG_CLOSE: - x0 = cx; - y0 = cy; - x1 = firstx; - y1 = firsty; - - if (y0 == 0.0) - y0 -= epsilon; - if (y1 == 0.0) - y1 -= epsilon; - if (Line2D.linesIntersect(x0, y0, x1, y1, - epsilon, 0.0, distance, 0.0)) - windingNumber += (y1 < y0) ? 1 : negative; - - cx = firstx; - cy = firsty; - pos++; - pathStarted = false; - break; - case PathIterator.SEG_LINETO: - x0 = cx; - y0 = cy; - x1 = xpoints[pos] - (float) x; - y1 = ypoints[pos++] - (float) y; - - if (y0 == 0.0) - y0 -= epsilon; - if (y1 == 0.0) - y1 -= epsilon; - if (Line2D.linesIntersect(x0, y0, x1, y1, - epsilon, 0.0, distance, 0.0)) - windingNumber += (y1 < y0) ? 1 : negative; - - cx = xpoints[pos - 1] - (float) x; - cy = ypoints[pos - 1] - (float) y; - break; - case PathIterator.SEG_QUADTO: - x0 = cx; - y0 = cy; - x1 = xpoints[pos] - x; - y1 = ypoints[pos++] - y; - x2 = xpoints[pos] - x; - y2 = ypoints[pos++] - y; - - /* check if curve may intersect X+ axis. */ - if ((x0 > 0.0 || x1 > 0.0 || x2 > 0.0) - && (y0 * y1 <= 0 || y1 * y2 <= 0)) - { - if (y0 == 0.0) - y0 -= epsilon; - if (y2 == 0.0) - y2 -= epsilon; - - r[0] = y0; - r[1] = 2 * (y1 - y0); - r[2] = (y2 - 2 * y1 + y0); - - /* degenerate roots (=tangent points) do not - contribute to the winding number. */ - if ((nRoots = QuadCurve2D.solveQuadratic(r)) == 2) - for (int i = 0; i < nRoots; i++) - { - float t = (float) r[i]; - if (t > 0.0f && t < 1.0f) - { - double crossing = t * t * (x2 - 2 * x1 + x0) - + 2 * t * (x1 - x0) + x0; - if (crossing >= 0.0 && crossing <= distance) - windingNumber += (2 * t * (y2 - 2 * y1 + y0) - + 2 * (y1 - y0) < 0) ? 1 : negative; - } - } - } - - cx = xpoints[pos - 1] - (float) x; - cy = ypoints[pos - 1] - (float) y; - break; - case PathIterator.SEG_CUBICTO: - x0 = cx; - y0 = cy; - x1 = xpoints[pos] - x; - y1 = ypoints[pos++] - y; - x2 = xpoints[pos] - x; - y2 = ypoints[pos++] - y; - x3 = xpoints[pos] - x; - y3 = ypoints[pos++] - y; - - /* check if curve may intersect X+ axis. */ - if ((x0 > 0.0 || x1 > 0.0 || x2 > 0.0 || x3 > 0.0) - && (y0 * y1 <= 0 || y1 * y2 <= 0 || y2 * y3 <= 0)) - { - if (y0 == 0.0) - y0 -= epsilon; - if (y3 == 0.0) - y3 -= epsilon; - - r[0] = y0; - r[1] = 3 * (y1 - y0); - r[2] = 3 * (y2 + y0 - 2 * y1); - r[3] = y3 - 3 * y2 + 3 * y1 - y0; - - if ((nRoots = CubicCurve2D.solveCubic(r)) != 0) - for (int i = 0; i < nRoots; i++) - { - float t = (float) r[i]; - if (t > 0.0 && t < 1.0) - { - double crossing = -(t * t * t) * (x0 - 3 * x1 - + 3 * x2 - x3) - + 3 * t * t * (x0 - 2 * x1 + x2) - + 3 * t * (x1 - x0) + x0; - if (crossing >= 0 && crossing <= distance) - windingNumber += (3 * t * t * (y3 + 3 * y1 - - 3 * y2 - y0) - + 6 * t * (y0 - 2 * y1 + y2) - + 3 * (y1 - y0) < 0) ? 1 : negative; - } - } - } - - cx = xpoints[pos - 1] - (float) x; - cy = ypoints[pos - 1] - (float) y; - break; - } + switch (types[pos]) + { + case PathIterator.SEG_MOVETO: + if (pathStarted) // close old path + { + x0 = cx; + y0 = cy; + x1 = firstx; + y1 = firsty; + + if (y0 == 0.0) + y0 -= epsilon; + if (y1 == 0.0) + y1 -= epsilon; + if (Line2D.linesIntersect(x0, y0, x1, y1, + epsilon, 0.0, distance, 0.0)) + windingNumber += (y1 < y0) ? 1 : negative; + + cx = firstx; + cy = firsty; + } + cx = firstx = xpoints[pos] - (float) x; + cy = firsty = ypoints[pos++] - (float) y; + pathStarted = true; + break; + case PathIterator.SEG_CLOSE: + x0 = cx; + y0 = cy; + x1 = firstx; + y1 = firsty; + + if (y0 == 0.0) + y0 -= epsilon; + if (y1 == 0.0) + y1 -= epsilon; + if (Line2D.linesIntersect(x0, y0, x1, y1, + epsilon, 0.0, distance, 0.0)) + windingNumber += (y1 < y0) ? 1 : negative; + + cx = firstx; + cy = firsty; + pos++; + pathStarted = false; + break; + case PathIterator.SEG_LINETO: + x0 = cx; + y0 = cy; + x1 = xpoints[pos] - (float) x; + y1 = ypoints[pos++] - (float) y; + + if (y0 == 0.0) + y0 -= epsilon; + if (y1 == 0.0) + y1 -= epsilon; + if (Line2D.linesIntersect(x0, y0, x1, y1, + epsilon, 0.0, distance, 0.0)) + windingNumber += (y1 < y0) ? 1 : negative; + + cx = xpoints[pos - 1] - (float) x; + cy = ypoints[pos - 1] - (float) y; + break; + case PathIterator.SEG_QUADTO: + x0 = cx; + y0 = cy; + x1 = xpoints[pos] - x; + y1 = ypoints[pos++] - y; + x2 = xpoints[pos] - x; + y2 = ypoints[pos++] - y; + + /* check if curve may intersect X+ axis. */ + if ((x0 > 0.0 || x1 > 0.0 || x2 > 0.0) + && (y0 * y1 <= 0 || y1 * y2 <= 0)) + { + if (y0 == 0.0) + y0 -= epsilon; + if (y2 == 0.0) + y2 -= epsilon; + + r[0] = y0; + r[1] = 2 * (y1 - y0); + r[2] = (y2 - 2 * y1 + y0); + + /* degenerate roots (=tangent points) do not + contribute to the winding number. */ + if ((nRoots = QuadCurve2D.solveQuadratic(r)) == 2) + for (int i = 0; i < nRoots; i++) + { + float t = (float) r[i]; + if (t > 0.0f && t < 1.0f) + { + double crossing = t * t * (x2 - 2 * x1 + x0) + + 2 * t * (x1 - x0) + x0; + if (crossing >= 0.0 && crossing <= distance) + windingNumber += (2 * t * (y2 - 2 * y1 + y0) + + 2 * (y1 - y0) < 0) ? 1 : negative; + } + } + } + + cx = xpoints[pos - 1] - (float) x; + cy = ypoints[pos - 1] - (float) y; + break; + case PathIterator.SEG_CUBICTO: + x0 = cx; + y0 = cy; + x1 = xpoints[pos] - x; + y1 = ypoints[pos++] - y; + x2 = xpoints[pos] - x; + y2 = ypoints[pos++] - y; + x3 = xpoints[pos] - x; + y3 = ypoints[pos++] - y; + + /* check if curve may intersect X+ axis. */ + if ((x0 > 0.0 || x1 > 0.0 || x2 > 0.0 || x3 > 0.0) + && (y0 * y1 <= 0 || y1 * y2 <= 0 || y2 * y3 <= 0)) + { + if (y0 == 0.0) + y0 -= epsilon; + if (y3 == 0.0) + y3 -= epsilon; + + r[0] = y0; + r[1] = 3 * (y1 - y0); + r[2] = 3 * (y2 + y0 - 2 * y1); + r[3] = y3 - 3 * y2 + 3 * y1 - y0; + + if ((nRoots = CubicCurve2D.solveCubic(r)) != 0) + for (int i = 0; i < nRoots; i++) + { + float t = (float) r[i]; + if (t > 0.0 && t < 1.0) + { + double crossing = -(t * t * t) * (x0 - 3 * x1 + + 3 * x2 - x3) + + 3 * t * t * (x0 - 2 * x1 + x2) + + 3 * t * (x1 - x0) + x0; + if (crossing >= 0 && crossing <= distance) + windingNumber += (3 * t * t * (y3 + 3 * y1 + - 3 * y2 - y0) + + 6 * t * (y0 - 2 * y1 + y2) + + 3 * (y1 - y0) < 0) ? 1 : negative; + } + } + } + + cx = xpoints[pos - 1] - (float) x; + cy = ypoints[pos - 1] - (float) y; + break; + } } // swap coordinates back if (useYaxis) { - float[] swap; - swap = ypoints; - ypoints = xpoints; - xpoints = swap; + float[] swap; + swap = ypoints; + ypoints = xpoints; + xpoints = swap; } return (windingNumber); } } // class GeneralPath - diff --git a/libjava/classpath/java/awt/geom/Line2D.java b/libjava/classpath/java/awt/geom/Line2D.java index e15e7cf..c92aab0 100644 --- a/libjava/classpath/java/awt/geom/Line2D.java +++ b/libjava/classpath/java/awt/geom/Line2D.java @@ -238,55 +238,55 @@ public abstract class Line2D implements Shape, Cloneable /** * Computes twice the (signed) area of the triangle defined by the three * points. This method is used for intersection testing. - * + * * @param x1 the x-coordinate of the first point. * @param y1 the y-coordinate of the first point. * @param x2 the x-coordinate of the second point. * @param y2 the y-coordinate of the second point. * @param x3 the x-coordinate of the third point. * @param y3 the y-coordinate of the third point. - * + * * @return Twice the area. */ private static double area2(double x1, double y1, double x2, double y2, - double x3, double y3) + double x3, double y3) { - return (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1); + return (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1); } /** * Returns <code>true</code> if (x3, y3) lies between (x1, y1) and (x2, y2), - * and false otherwise, This test assumes that the three points are + * and false otherwise, This test assumes that the three points are * collinear, and is used for intersection testing. - * + * * @param x1 the x-coordinate of the first point. * @param y1 the y-coordinate of the first point. * @param x2 the x-coordinate of the second point. * @param y2 the y-coordinate of the second point. * @param x3 the x-coordinate of the third point. * @param y3 the y-coordinate of the third point. - * + * * @return A boolean. */ - private static boolean between(double x1, double y1, - double x2, double y2, - double x3, double y3) + private static boolean between(double x1, double y1, + double x2, double y2, + double x3, double y3) { if (x1 != x2) { - return (x1 <= x3 && x3 <= x2) || (x1 >= x3 && x3 >= x2); + return (x1 <= x3 && x3 <= x2) || (x1 >= x3 && x3 >= x2); } else { - return (y1 <= y3 && y3 <= y2) || (y1 >= y3 && y3 >= y2); + return (y1 <= y3 && y3 <= y2) || (y1 >= y3 && y3 >= y2); } } /** - * Test if the line segment (x1,y1)->(x2,y2) intersects the line segment + * Test if the line segment (x1,y1)->(x2,y2) intersects the line segment * (x3,y3)->(x4,y4). * * @param x1 the first x coordinate of the first segment - * @param y1 the first y coordinate of the first segment + * @param y1 the first y coordinate of the first segment * @param x2 the second x coordinate of the first segment * @param y2 the second y coordinate of the first segment * @param x3 the first x coordinate of the second segment @@ -301,21 +301,21 @@ public abstract class Line2D implements Shape, Cloneable double x4, double y4) { double a1, a2, a3, a4; - + // deal with special cases - if ((a1 = area2(x1, y1, x2, y2, x3, y3)) == 0.0) + if ((a1 = area2(x1, y1, x2, y2, x3, y3)) == 0.0) { // check if p3 is between p1 and p2 OR // p4 is collinear also AND either between p1 and p2 OR at opposite ends - if (between(x1, y1, x2, y2, x3, y3)) + if (between(x1, y1, x2, y2, x3, y3)) { return true; } - else + else { - if (area2(x1, y1, x2, y2, x4, y4) == 0.0) + if (area2(x1, y1, x2, y2, x4, y4) == 0.0) { - return between(x3, y3, x4, y4, x1, y1) + return between(x3, y3, x4, y4, x1, y1) || between (x3, y3, x4, y4, x2, y2); } else { @@ -323,13 +323,13 @@ public abstract class Line2D implements Shape, Cloneable } } } - else if ((a2 = area2(x1, y1, x2, y2, x4, y4)) == 0.0) + else if ((a2 = area2(x1, y1, x2, y2, x4, y4)) == 0.0) { // check if p4 is between p1 and p2 (we already know p3 is not // collinear) return between(x1, y1, x2, y2, x4, y4); } - + if ((a3 = area2(x3, y3, x4, y4, x1, y1)) == 0.0) { // check if p1 is between p3 and p4 OR // p2 is collinear also AND either between p1 and p2 OR at opposite ends @@ -338,7 +338,7 @@ public abstract class Line2D implements Shape, Cloneable } else { if (area2(x3, y3, x4, y4, x2, y2) == 0.0) { - return between(x1, y1, x2, y2, x3, y3) + return between(x1, y1, x2, y2, x3, y3) || between (x1, y1, x2, y2, x4, y4); } else { @@ -353,7 +353,7 @@ public abstract class Line2D implements Shape, Cloneable } else { // test for regular intersection return ((a1 > 0.0) ^ (a2 > 0.0)) && ((a3 > 0.0) ^ (a4 > 0.0)); - } + } } /** diff --git a/libjava/classpath/java/awt/geom/QuadCurve2D.java b/libjava/classpath/java/awt/geom/QuadCurve2D.java index d247c79..62c829d 100644 --- a/libjava/classpath/java/awt/geom/QuadCurve2D.java +++ b/libjava/classpath/java/awt/geom/QuadCurve2D.java @@ -496,14 +496,14 @@ public abstract class QuadCurve2D implements Shape, Cloneable if (left != null) { - left[leftOff] = x1; - left[leftOff + 1] = y1; + left[leftOff] = x1; + left[leftOff + 1] = y1; } if (right != null) { - right[rightOff + 4] = x2; - right[rightOff + 5] = y2; + right[rightOff + 4] = x2; + right[rightOff + 5] = y2; } x1 = (x1 + xc) / 2; @@ -515,18 +515,18 @@ public abstract class QuadCurve2D implements Shape, Cloneable if (left != null) { - left[leftOff + 2] = x1; - left[leftOff + 3] = y1; - left[leftOff + 4] = xc; - left[leftOff + 5] = yc; + left[leftOff + 2] = x1; + left[leftOff + 3] = y1; + left[leftOff + 4] = xc; + left[leftOff + 5] = yc; } if (right != null) { - right[rightOff] = xc; - right[rightOff + 1] = yc; - right[rightOff + 2] = x2; - right[rightOff + 3] = y2; + right[rightOff] = xc; + right[rightOff + 1] = yc; + right[rightOff + 2] = x2; + right[rightOff + 3] = y2; } } @@ -643,11 +643,11 @@ public abstract class QuadCurve2D implements Shape, Cloneable // for linear functions. if (a == 0) { - if (b == 0) - return -1; + if (b == 0) + return -1; - res[0] = -c / b; - return 1; + res[0] = -c / b; + return 1; } disc = b * b - 4 * a * c; @@ -657,32 +657,32 @@ public abstract class QuadCurve2D implements Shape, Cloneable if (disc == 0) { - // The GNU Scientific Library returns two identical results here. - // We just return one. - res[0] = -0.5 * b / a; - return 1; + // The GNU Scientific Library returns two identical results here. + // We just return one. + res[0] = -0.5 * b / a; + return 1; } // disc > 0 if (b == 0) { - double r; + double r; - r = Math.abs(0.5 * Math.sqrt(disc) / a); - res[0] = -r; - res[1] = r; + r = Math.abs(0.5 * Math.sqrt(disc) / a); + res[0] = -r; + res[1] = r; } else { - double sgnb; - double temp; + double sgnb; + double temp; - sgnb = (b > 0 ? 1 : -1); - temp = -0.5 * (b + sgnb * Math.sqrt(disc)); + sgnb = (b > 0 ? 1 : -1); + temp = -0.5 * (b + sgnb * Math.sqrt(disc)); - // The GNU Scientific Library sorts the result here. We don't. - res[0] = temp / a; - res[1] = c / temp; + // The GNU Scientific Library sorts the result here. We don't. + res[0] = temp / a; + res[1] = c / temp; } return 2; } @@ -750,7 +750,7 @@ public abstract class QuadCurve2D implements Shape, Cloneable } /** - * Determines whether any part of a Rectangle2D is inside the area bounded + * Determines whether any part of a Rectangle2D is inside the area bounded * by the curve and the straight line connecting its end points. * @see #intersects(double, double, double, double) */ @@ -790,7 +790,7 @@ public abstract class QuadCurve2D implements Shape, Cloneable } /** - * Determines whether a Rectangle2D is entirely inside the area that is + * Determines whether a Rectangle2D is entirely inside the area that is * bounded by the curve and the straight line connecting its end points. * @see #contains(double, double, double, double) */ @@ -818,73 +818,73 @@ public abstract class QuadCurve2D implements Shape, Cloneable { return new PathIterator() { - /** Current coordinate. */ - private int current = 0; - - public int getWindingRule() - { - return WIND_NON_ZERO; - } - - public boolean isDone() - { - return current >= 2; - } - - public void next() - { - current++; - } - - public int currentSegment(float[] coords) - { - int result; - switch (current) - { - case 0: - coords[0] = (float) getX1(); - coords[1] = (float) getY1(); - result = SEG_MOVETO; - break; - case 1: - coords[0] = (float) getCtrlX(); - coords[1] = (float) getCtrlY(); - coords[2] = (float) getX2(); - coords[3] = (float) getY2(); - result = SEG_QUADTO; - break; - default: - throw new NoSuchElementException("quad iterator out of bounds"); - } - if (at != null) - at.transform(coords, 0, coords, 0, 2); - return result; - } - - public int currentSegment(double[] coords) - { - int result; - switch (current) - { - case 0: - coords[0] = getX1(); - coords[1] = getY1(); - result = SEG_MOVETO; - break; - case 1: - coords[0] = getCtrlX(); - coords[1] = getCtrlY(); - coords[2] = getX2(); - coords[3] = getY2(); - result = SEG_QUADTO; - break; - default: - throw new NoSuchElementException("quad iterator out of bounds"); - } - if (at != null) - at.transform(coords, 0, coords, 0, 2); - return result; - } + /** Current coordinate. */ + private int current = 0; + + public int getWindingRule() + { + return WIND_NON_ZERO; + } + + public boolean isDone() + { + return current >= 2; + } + + public void next() + { + current++; + } + + public int currentSegment(float[] coords) + { + int result; + switch (current) + { + case 0: + coords[0] = (float) getX1(); + coords[1] = (float) getY1(); + result = SEG_MOVETO; + break; + case 1: + coords[0] = (float) getCtrlX(); + coords[1] = (float) getCtrlY(); + coords[2] = (float) getX2(); + coords[3] = (float) getY2(); + result = SEG_QUADTO; + break; + default: + throw new NoSuchElementException("quad iterator out of bounds"); + } + if (at != null) + at.transform(coords, 0, coords, 0, 2); + return result; + } + + public int currentSegment(double[] coords) + { + int result; + switch (current) + { + case 0: + coords[0] = getX1(); + coords[1] = getY1(); + result = SEG_MOVETO; + break; + case 1: + coords[0] = getCtrlX(); + coords[1] = getCtrlY(); + coords[2] = getX2(); + coords[3] = getY2(); + result = SEG_QUADTO; + break; + default: + throw new NoSuchElementException("quad iterator out of bounds"); + } + if (at != null) + at.transform(coords, 0, coords, 0, 2); + return result; + } }; } @@ -902,11 +902,11 @@ public abstract class QuadCurve2D implements Shape, Cloneable { try { - return super.clone(); + return super.clone(); } catch (CloneNotSupportedException e) { - throw (Error) new InternalError().initCause(e); // Impossible + throw (Error) new InternalError().initCause(e); // Impossible } } @@ -940,34 +940,34 @@ public abstract class QuadCurve2D implements Shape, Cloneable if (useYaxis) { - a0 = getY1() - y; - a1 = getCtrlY() - y; - a2 = getY2() - y; - b0 = getX1() - x; - b1 = getCtrlX() - x; - b2 = getX2() - x; + a0 = getY1() - y; + a1 = getCtrlY() - y; + a2 = getY2() - y; + b0 = getX1() - x; + b1 = getCtrlX() - x; + b2 = getX2() - x; } else { - a0 = getX1() - x; - a1 = getCtrlX() - x; - a2 = getX2() - x; - b0 = getY1() - y; - b1 = getCtrlY() - y; - b2 = getY2() - y; + a0 = getX1() - x; + a1 = getCtrlX() - x; + a2 = getX2() - x; + b0 = getY1() - y; + b1 = getCtrlY() - y; + b2 = getY2() - y; } - /* If the axis intersects a start/endpoint, shift it up by some small + /* If the axis intersects a start/endpoint, shift it up by some small amount to guarantee the line is 'inside' If this is not done,bad behaviour may result for points on that axis. */ if (a0 == 0.0 || a2 == 0.0) { - double small = getFlatness() * EPSILON; - if (a0 == 0.0) - a0 -= small; + double small = getFlatness() * EPSILON; + if (a0 == 0.0) + a0 -= small; - if (a2 == 0.0) - a2 -= small; + if (a2 == 0.0) + a2 -= small; } r[0] = a0; @@ -977,26 +977,26 @@ public abstract class QuadCurve2D implements Shape, Cloneable nRoots = solveQuadratic(r); for (int i = 0; i < nRoots; i++) { - double t = r[i]; - if (t >= 0.0 && t <= 1.0) - { - double crossing = t * t * (b2 - 2 * b1 + b0) + 2 * t * (b1 - b0) - + b0; - /* single root is always doubly degenerate in quads */ - if (crossing > 0 && crossing < distance) - nCrossings += (nRoots == 1) ? 2 : 1; - } + double t = r[i]; + if (t >= 0.0 && t <= 1.0) + { + double crossing = t * t * (b2 - 2 * b1 + b0) + 2 * t * (b1 - b0) + + b0; + /* single root is always doubly degenerate in quads */ + if (crossing > 0 && crossing < distance) + nCrossings += (nRoots == 1) ? 2 : 1; + } } if (useYaxis) { - if (Line2D.linesIntersect(b0, a0, b2, a2, EPSILON, 0.0, distance, 0.0)) - nCrossings++; + if (Line2D.linesIntersect(b0, a0, b2, a2, EPSILON, 0.0, distance, 0.0)) + nCrossings++; } else { - if (Line2D.linesIntersect(a0, b0, a2, b2, 0.0, EPSILON, 0.0, distance)) - nCrossings++; + if (Line2D.linesIntersect(a0, b0, a2, b2, 0.0, EPSILON, 0.0, distance)) + nCrossings++; } return (nCrossings); diff --git a/libjava/classpath/java/awt/geom/RectangularShape.java b/libjava/classpath/java/awt/geom/RectangularShape.java index 3ee1615..68bc451 100644 --- a/libjava/classpath/java/awt/geom/RectangularShape.java +++ b/libjava/classpath/java/awt/geom/RectangularShape.java @@ -228,15 +228,15 @@ public abstract class RectangularShape implements Shape, Cloneable { if (x1 > x2) { - double t = x2; - x2 = x1; - x1 = t; + double t = x2; + x2 = x1; + x1 = t; } if (y1 > y2) { - double t = y2; - y2 = y1; - y1 = t; + double t = y2; + y2 = y1; + y1 = t; } setFrame(x1, y1, x2 - x1, y2 - y1); } diff --git a/libjava/classpath/java/awt/geom/RoundRectangle2D.java b/libjava/classpath/java/awt/geom/RoundRectangle2D.java index ac4d89f..19a7b42 100644 --- a/libjava/classpath/java/awt/geom/RoundRectangle2D.java +++ b/libjava/classpath/java/awt/geom/RoundRectangle2D.java @@ -45,29 +45,29 @@ package java.awt.geom; */ public abstract class RoundRectangle2D extends RectangularShape { - /** + /** * Return the arc height of this round rectangle. The arc height and width * control the roundness of the corners of the rectangle. - * + * * @return The arc height. - * + * * @see #getArcWidth() */ public abstract double getArcHeight(); - /** + /** * Return the arc width of this round rectangle. The arc width and height * control the roundness of the corners of the rectangle. - * + * * @return The arc width. - * + * * @see #getArcHeight() */ public abstract double getArcWidth(); - /** + /** * Set the values of this round rectangle. - * + * * @param x The x coordinate * @param y The y coordinate * @param w The width @@ -78,7 +78,7 @@ public abstract class RoundRectangle2D extends RectangularShape public abstract void setRoundRect(double x, double y, double w, double h, double arcWidth, double arcHeight); - /** + /** * Create a RoundRectangle2D. This is protected because this class * is abstract and cannot be instantiated. */ @@ -86,7 +86,7 @@ public abstract class RoundRectangle2D extends RectangularShape { } - /** + /** * Return true if this object contains the specified point. * @param x The x coordinate * @param y The y coordinate @@ -123,7 +123,7 @@ public abstract class RoundRectangle2D extends RectangularShape return dx * dx + dy * dy <= 1.0; } - /** + /** * Return true if this object contains the specified rectangle * @param x The x coordinate * @param y The y coordinate @@ -138,32 +138,32 @@ public abstract class RoundRectangle2D extends RectangularShape && contains(x + w, y)); } - /** + /** * Return a new path iterator which iterates over this rectangle. - * + * * @param at An affine transform to apply to the object */ - public PathIterator getPathIterator(final AffineTransform at) + public PathIterator getPathIterator(final AffineTransform at) { double arcW = Math.min(getArcWidth(), getWidth()); double arcH = Math.min(getArcHeight(), getHeight()); - + // check for special cases... if (arcW <= 0 || arcH <= 0) { - Rectangle2D r = new Rectangle2D.Double(getX(), getY(), getWidth(), + Rectangle2D r = new Rectangle2D.Double(getX(), getY(), getWidth(), getHeight()); return r.getPathIterator(at); } - else if (arcW >= getWidth() && arcH >= getHeight()) + else if (arcW >= getWidth() && arcH >= getHeight()) { - Ellipse2D e = new Ellipse2D.Double(getX(), getY(), getWidth(), + Ellipse2D e = new Ellipse2D.Double(getX(), getY(), getWidth(), getHeight()); return e.getPathIterator(at); } - + // otherwise return the standard case... - return new PathIterator() + return new PathIterator() { double x = getX(); double y = getY(); @@ -175,7 +175,7 @@ public abstract class RoundRectangle2D extends RectangularShape PathIterator corner; int step = -1; - public int currentSegment(double[] coords) + public int currentSegment(double[] coords) { if (corner != null) // steps 1, 3, 5 and 7 { @@ -184,7 +184,7 @@ public abstract class RoundRectangle2D extends RectangularShape r = SEG_LINETO; return r; } - if (step == -1) + if (step == -1) { // move to the start position coords[0] = x + w - arcW / 2; @@ -196,7 +196,7 @@ public abstract class RoundRectangle2D extends RectangularShape coords[0] = x + arcW / 2; coords[1] = y; } - else if (step == 2) + else if (step == 2) { // left line coords[0] = x; @@ -227,7 +227,7 @@ public abstract class RoundRectangle2D extends RectangularShape r = SEG_LINETO; return r; } - if (step == -1) + if (step == -1) { // move to the start position coords[0] = (float) (x + w - arcW / 2); @@ -239,7 +239,7 @@ public abstract class RoundRectangle2D extends RectangularShape coords[0] = (float) (x + arcW / 2); coords[1] = (float) y; } - else if (step == 2) + else if (step == 2) { // left line coords[0] = (float) x; @@ -270,7 +270,7 @@ public abstract class RoundRectangle2D extends RectangularShape return step >= 8; } - public void next() + public void next() { if (corner != null) { @@ -284,7 +284,7 @@ public abstract class RoundRectangle2D extends RectangularShape else { step++; - if (step == 1) + if (step == 1) { // create top left corner arc.setArc(x, y, arcW, arcH, 90, 90, Arc2D.OPEN); @@ -292,21 +292,21 @@ public abstract class RoundRectangle2D extends RectangularShape } else if (step == 3) { - // create bottom left corner - arc.setArc(x, y + h - arcH, arcW, arcH, 180, 90, + // create bottom left corner + arc.setArc(x, y + h - arcH, arcW, arcH, 180, 90, Arc2D.OPEN); corner = arc.getPathIterator(at); } else if (step == 5) { - // create bottom right corner + // create bottom right corner arc.setArc(x + w - arcW, y + h - arcH, arcW, arcH, 270, 90, Arc2D.OPEN); corner = arc.getPathIterator(at); } else if (step == 7) { - // create top right corner + // create top right corner arc.setArc(x + w - arcW, y, arcW, arcH, 0, 90, Arc2D.OPEN); corner = arc.getPathIterator(at); } @@ -315,7 +315,7 @@ public abstract class RoundRectangle2D extends RectangularShape }; } - /** + /** * Return true if the given rectangle intersects this shape. * @param x The x coordinate * @param y The y coordinate @@ -329,7 +329,7 @@ public abstract class RoundRectangle2D extends RectangularShape || contains(x + w, y)); } - /** + /** * Set the boundary of this round rectangle. * @param x The x coordinate * @param y The y coordinate @@ -342,7 +342,7 @@ public abstract class RoundRectangle2D extends RectangularShape setRoundRect(x, y, w, h, getArcWidth(), getArcHeight()); } - /** + /** * Set the values of this round rectangle to be the same as those * of the argument. * @param rr The round rectangle to copy @@ -353,9 +353,9 @@ public abstract class RoundRectangle2D extends RectangularShape rr.getArcWidth(), rr.getArcHeight()); } - /** + /** * A subclass of RoundRectangle which keeps its parameters as - * doubles. + * doubles. */ public static class Double extends RoundRectangle2D { @@ -377,14 +377,14 @@ public abstract class RoundRectangle2D extends RectangularShape /** The height of this object. */ public double height; - /** - * Construct a new instance, with all parameters set to 0. + /** + * Construct a new instance, with all parameters set to 0. */ public Double() { } - /** + /** * Construct a new instance with the given arguments. * @param x The x coordinate * @param y The y coordinate @@ -456,9 +456,9 @@ public abstract class RoundRectangle2D extends RectangularShape } } // class Double - /** + /** * A subclass of RoundRectangle which keeps its parameters as - * floats. + * floats. */ public static class Float extends RoundRectangle2D { @@ -480,14 +480,14 @@ public abstract class RoundRectangle2D extends RectangularShape /** The height of this object. */ public float height; - /** - * Construct a new instance, with all parameters set to 0. + /** + * Construct a new instance, with all parameters set to 0. */ public Float() { } - /** + /** * Construct a new instance with the given arguments. * @param x The x coordinate * @param y The y coordinate @@ -549,14 +549,14 @@ public abstract class RoundRectangle2D extends RectangularShape /** * Sets the dimensions for this rounded rectangle. - * + * * @param x the x-coordinate of the top left corner. * @param y the y-coordinate of the top left corner. * @param w the width of the rectangle. * @param h the height of the rectangle. * @param arcWidth the arc width. * @param arcHeight the arc height. - * + * * @see #setRoundRect(double, double, double, double, double, double) */ public void setRoundRect(float x, float y, float w, float h, |