From 45967a8a28379fe5fbaa4b284eacc2db0dcf7c1c Mon Sep 17 00:00:00 2001 From: Sascha Brawer Date: Wed, 29 Oct 2003 17:17:51 +0100 Subject: [PATCH] CubicCurve2D.java (contains): Docfix for URL of embedded drawing. 2003-10-29 Sascha Brawer * java/awt/geom/CubicCurve2D.java (contains): Docfix for URL of embedded drawing. * java/awt/geom/QuadCurve2D.java: Likewise. 2003-10-29 Sascha Brawer * java/awt/geom/CubicCurve2D.java: Added documentation. * java/awt/geom/QuadCurve2D.java: Likewise. * java/awt/geom/doc-files/QuadCurve2D-4.png, java/awt/geom/doc-files/QuadCurve2D-5.png, java/awt/geom/doc-files/CubicCurve2D-4.png, java/awt/geom/doc-files/Cubicurve2D-5.png: New illustrations. 2003-10-29 Sascha Brawer * java/awt/geom/CubicCurve2D.java (getFlatnessSq): Implement. (subdivide(CubicCurve2D, CubicCurve2D)): Avoid useless object allocation. (subdivide(double[],int,double[],int,double[],int)): Implement. 2003-10-29 Sascha Brawer * java/awt/geom/doc-files/CubicCurve2D-1.png, java/awt/geom/doc-files/CubicCurve2D-2.png, java/awt/geom/doc-files/CubicCurve2D-3.png: New illustrations. From-SVN: r73048 --- libjava/ChangeLog | 27 + libjava/java/awt/geom/CubicCurve2D.java | 1019 ++++++++++++++++- libjava/java/awt/geom/QuadCurve2D.java | 202 +++- .../awt/geom/doc-files/CubicCurve2D-1.png | Bin 0 -> 6280 bytes .../awt/geom/doc-files/CubicCurve2D-2.png | Bin 0 -> 5791 bytes .../awt/geom/doc-files/CubicCurve2D-3.png | Bin 0 -> 13168 bytes .../awt/geom/doc-files/CubicCurve2D-4.png | Bin 0 -> 7839 bytes .../awt/geom/doc-files/CubicCurve2D-5.png | Bin 0 -> 5112 bytes .../java/awt/geom/doc-files/QuadCurve2D-4.png | Bin 0 -> 7797 bytes .../java/awt/geom/doc-files/QuadCurve2D-5.png | Bin 0 -> 4757 bytes 10 files changed, 1206 insertions(+), 42 deletions(-) create mode 100644 libjava/java/awt/geom/doc-files/CubicCurve2D-1.png create mode 100644 libjava/java/awt/geom/doc-files/CubicCurve2D-2.png create mode 100644 libjava/java/awt/geom/doc-files/CubicCurve2D-3.png create mode 100644 libjava/java/awt/geom/doc-files/CubicCurve2D-4.png create mode 100644 libjava/java/awt/geom/doc-files/CubicCurve2D-5.png create mode 100644 libjava/java/awt/geom/doc-files/QuadCurve2D-4.png create mode 100644 libjava/java/awt/geom/doc-files/QuadCurve2D-5.png diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 3de9a60786a..d91fa185c3f 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,30 @@ +2003-10-29 Sascha Brawer + + * java/awt/geom/CubicCurve2D.java (contains): Docfix for URL of embedded drawing. + * java/awt/geom/QuadCurve2D.java: Likewise. + +2003-10-29 Sascha Brawer + + * java/awt/geom/CubicCurve2D.java: Added documentation. + * java/awt/geom/QuadCurve2D.java: Likewise. + + * java/awt/geom/doc-files/QuadCurve2D-4.png, + java/awt/geom/doc-files/QuadCurve2D-5.png, + java/awt/geom/doc-files/CubicCurve2D-4.png, + java/awt/geom/doc-files/Cubicurve2D-5.png: New illustrations. + +2003-10-29 Sascha Brawer + + * java/awt/geom/CubicCurve2D.java (getFlatnessSq): Implement. + (subdivide(CubicCurve2D, CubicCurve2D)): Avoid useless object allocation. + (subdivide(double[],int,double[],int,double[],int)): Implement. + +2003-10-29 Sascha Brawer + + * java/awt/geom/doc-files/CubicCurve2D-1.png, + java/awt/geom/doc-files/CubicCurve2D-2.png, + java/awt/geom/doc-files/CubicCurve2D-3.png: New illustrations. + 2003-10-29 Ito Kazumitsu * java/text/DecimalFormat.java diff --git a/libjava/java/awt/geom/CubicCurve2D.java b/libjava/java/awt/geom/CubicCurve2D.java index 2bc0b358b19..1e38d3ada9a 100644 --- a/libjava/java/awt/geom/CubicCurve2D.java +++ b/libjava/java/awt/geom/CubicCurve2D.java @@ -1,5 +1,5 @@ /* CubicCurve2D.java -- represents a parameterized cubic curve in 2-D space - Copyright (C) 2002 Free Software Foundation + Copyright (C) 2002, 2003 Free Software Foundation This file is part of GNU Classpath. @@ -42,31 +42,168 @@ import java.awt.Rectangle; import java.awt.Shape; import java.util.NoSuchElementException; + /** - * STUBS ONLY - * XXX Implement and document. + * A two-dimensional curve that is parameterized with a cubic + * function. + * + *

A drawing of a CubicCurve2D + * + * @author Eric Blake (ebb9@email.byu.edu) + * @author Graydon Hoare (graydon@redhat.com) + * @author Sascha Brawer (brawer@dandelis.ch) + * + * @since 1.2 */ -public abstract class CubicCurve2D implements Shape, Cloneable +public abstract class CubicCurve2D + implements Shape, Cloneable { + /** + * Constructs a new CubicCurve2D. Typical users will want to + * construct instances of a subclass, such as {@link + * CubicCurve2D.Float} or {@link CubicCurve2D.Double}. + */ protected CubicCurve2D() { } + + /** + * Returns the x coordinate of the curve’s start + * point. + */ public abstract double getX1(); + + + /** + * Returns the y coordinate of the curve’s start + * point. + */ public abstract double getY1(); + + + /** + * Returns the curve’s start point. + */ public abstract Point2D getP1(); + + + /** + * Returns the x coordinate of the curve’s first + * control point. + */ public abstract double getCtrlX1(); + + + /** + * Returns the y coordinate of the curve’s first + * control point. + */ public abstract double getCtrlY1(); + + + /** + * Returns the curve’s first control point. + */ public abstract Point2D getCtrlP1(); + + + /** + * Returns the x coordinate of the curve’s second + * control point. + */ public abstract double getCtrlX2(); + + + /** + * Returns the y coordinate of the curve’s second + * control point. + */ public abstract double getCtrlY2(); + + + /** + * Returns the curve’s second control point. + */ public abstract Point2D getCtrlP2(); + + + /** + * Returns the x coordinate of the curve’s end + * point. + */ public abstract double getX2(); + + + /** + * Returns the y coordinate of the curve’s end + * point. + */ public abstract double getY2(); + + + /** + * Returns the curve’s end point. + */ public abstract Point2D getP2(); + + /** + * Changes the curve geometry, separately specifying each coordinate + * value. + * + *

A drawing of a CubicCurve2D + * + * @param x1 the x coordinate of the curve’s new start + * point. + * + * @param y1 the y coordinate of the curve’s new start + * point. + * + * @param cx1 the x coordinate of the curve’s new + * first control point. + * + * @param cy1 the y coordinate of the curve’s new + * first control point. + * + * @param cx2 the x coordinate of the curve’s new + * second control point. + * + * @param cy2 the y coordinate of the curve’s new + * second control point. + * + * @param x2 the x coordinate of the curve’s new end + * point. + * + * @param y2 the y coordinate of the curve’s new end + * point. + */ public abstract void setCurve(double x1, double y1, double cx1, double cy1, double cx2, double cy2, double x2, double y2); + + + /** + * Changes the curve geometry, specifying coordinate values in an + * array. + * + * @param coords an array containing the new coordinate values. The + * x coordinate of the new start point is located at + * coords[offset], its y coordinate at + * coords[offset + 1]. The x coordinate of the + * new first control point is located at coords[offset + + * 2], its y coordinate at coords[offset + + * 3]. The x coordinate of the new second control + * point is located at coords[offset + 4], its y + * coordinate at coords[offset + 5]. The x + * coordinate of the new end point is located at coords[offset + * + 6], its y coordinate at coords[offset + + * 7]. + * + * @param offset the offset of the first coordinate value in + * coords. + */ public void setCurve(double[] coords, int offset) { setCurve(coords[offset++], coords[offset++], @@ -74,11 +211,51 @@ public abstract class CubicCurve2D implements Shape, Cloneable coords[offset++], coords[offset++], coords[offset++], coords[offset++]); } + + + /** + * Changes the curve geometry, specifying coordinate values in + * separate Point objects. + * + *

A drawing of a CubicCurve2D + * + *

The curve does not keep any reference to the passed point + * objects. Therefore, a later change to p1, + * c1, c2 or p2 will not + * affect the curve geometry. + * + * @param p1 the new start point. + * @param c1 the new first control point. + * @param c2 the new second control point. + * @param p2 the new end point. + */ public void setCurve(Point2D p1, Point2D c1, Point2D c2, Point2D p2) { setCurve(p1.getX(), p1.getY(), c1.getX(), c1.getY(), c2.getX(), c2.getY(), p2.getX(), p2.getY()); } + + + /** + * Changes the curve geometry, specifying coordinate values in an + * array of Point objects. + * + *

A drawing of a CubicCurve2D + * + *

The curve does not keep references to the passed point + * objects. Therefore, a later change to the pts array + * or any of its elements will not affect the curve geometry. + * + * @param pts an array containing the points. The new start point + * is located at pts[offset], the new first control + * point at pts[offset + 1], the new second control + * point at pts[offset + 2], and the new end point + * at pts[offset + 3]. + * + * @param offset the offset of the start point in pts. + */ public void setCurve(Point2D[] pts, int offset) { setCurve(pts[offset].getX(), pts[offset++].getY(), @@ -86,24 +263,115 @@ public abstract class CubicCurve2D implements Shape, Cloneable pts[offset].getX(), pts[offset++].getY(), pts[offset].getX(), pts[offset++].getY()); } + + + /** + * Changes the curve geometry to that of another curve. + * + * @param c the curve whose coordinates will be copied. + */ public void setCurve(CubicCurve2D c) { setCurve(c.getX1(), c.getY1(), c.getCtrlX1(), c.getCtrlY1(), c.getCtrlX2(), c.getCtrlY2(), c.getX2(), c.getY2()); } + + + /** + * Calculates the squared flatness of a cubic curve, directly + * specifying each coordinate value. The flatness is the maximal + * distance of a control point to the line between start and end + * point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. In comparison to C1, + * control point C2 is father away from the gray line. Therefore, + * the result will be the square of the distance between C2 and the + * gray line, i.e. the squared length of the red line. + * + * @param x1 the x coordinate of the start point P1. + * @param y1 the y coordinate of the start point P1. + * @param cx1 the x coordinate of the first control point C1. + * @param cy1 the y coordinate of the first control point C1. + * @param cx2 the x coordinate of the second control point C2. + * @param cy2 the y coordinate of the second control point C2. + * @param x2 the x coordinate of the end point P2. + * @param y2 the y coordinate of the end point P2. + */ public static double getFlatnessSq(double x1, double y1, double cx1, double cy1, double cx2, double cy2, double x2, double y2) { - // XXX Implement. - throw new Error("not implemented"); + return Math.max(Line2D.ptSegDistSq(x1, y1, x2, y2, cx1, cy1), + Line2D.ptSegDistSq(x1, y1, x2, y2, cx2, cy2)); } + + + /** + * Calculates the flatness of a cubic curve, directly specifying + * each coordinate value. The flatness is the maximal distance of a + * control point to the line between start and end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. In comparison to C1, + * control point C2 is father away from the gray line. Therefore, + * the result will be the distance between C2 and the gray line, + * i.e. the length of the red line. + * + * @param x1 the x coordinate of the start point P1. + * @param y1 the y coordinate of the start point P1. + * @param cx1 the x coordinate of the first control point C1. + * @param cy1 the y coordinate of the first control point C1. + * @param cx2 the x coordinate of the second control point C2. + * @param cy2 the y coordinate of the second control point C2. + * @param x2 the x coordinate of the end point P2. + * @param y2 the y coordinate of the end point P2. + */ public static double getFlatness(double x1, double y1, double cx1, double cy1, double cx2, double cy2, double x2, double y2) { return Math.sqrt(getFlatnessSq(x1, y1, cx1, cy1, cx2, cy2, x2, y2)); } + + + /** + * Calculates the squared flatness of a cubic curve, specifying the + * coordinate values in an array. The flatness is the maximal + * distance of a control point to the line between start and end + * point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. In comparison to C1, + * control point C2 is father away from the gray line. Therefore, + * the result will be the square of the distance between C2 and the + * gray line, i.e. the squared length of the red line. + * + * @param coords an array containing the coordinate values. The + * x coordinate of the start point P1 is located at + * coords[offset], its y coordinate at + * coords[offset + 1]. The x coordinate of the + * first control point C1 is located at coords[offset + + * 2], its y coordinate at coords[offset + + * 3]. The x coordinate of the second control point C2 + * is located at coords[offset + 4], its y + * coordinate at coords[offset + 5]. The x + * coordinate of the end point P2 is located at coords[offset + * + 6], its y coordinate at coords[offset + + * 7]. + * + * @param offset the offset of the first coordinate value in + * coords. + */ public static double getFlatnessSq(double[] coords, int offset) { return getFlatnessSq(coords[offset++], coords[offset++], @@ -111,6 +379,39 @@ public abstract class CubicCurve2D implements Shape, Cloneable coords[offset++], coords[offset++], coords[offset++], coords[offset++]); } + + + /** + * Calculates the flatness of a cubic curve, specifying the + * coordinate values in an array. The flatness is the maximal + * distance of a control point to the line between start and end + * point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. In comparison to C1, + * control point C2 is father away from the gray line. Therefore, + * the result will be the distance between C2 and the gray line, + * i.e. the length of the red line. + * + * @param coords an array containing the coordinate values. The + * x coordinate of the start point P1 is located at + * coords[offset], its y coordinate at + * coords[offset + 1]. The x coordinate of the + * first control point C1 is located at coords[offset + + * 2], its y coordinate at coords[offset + + * 3]. The x coordinate of the second control point C2 + * is located at coords[offset + 4], its y + * coordinate at coords[offset + 5]. The x + * coordinate of the end point P2 is located at coords[offset + * + 6], its y coordinate at coords[offset + + * 7]. + * + * @param offset the offset of the first coordinate value in + * coords. + */ public static double getFlatness(double[] coords, int offset) { return Math.sqrt(getFlatnessSq(coords[offset++], coords[offset++], @@ -118,11 +419,43 @@ public abstract class CubicCurve2D implements Shape, Cloneable coords[offset++], coords[offset++], coords[offset++], coords[offset++])); } + + + /** + * Calculates the squared flatness of this curve. The flatness is + * the maximal distance of a control point to the line between start + * and end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. In comparison to C1, + * control point C2 is father away from the gray line. Therefore, + * the result will be the square of the distance between C2 and the + * gray line, i.e. the squared length of the red line. + */ public double getFlatnessSq() { return getFlatnessSq(getX1(), getY1(), getCtrlX1(), getCtrlY1(), getCtrlX2(), getCtrlY2(), getX2(), getY2()); } + + + /** + * Calculates the flatness of this curve. The flatness is the + * maximal distance of a control point to the line between start and + * end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. In comparison to C1, + * control point C2 is father away from the gray line. Therefore, + * the result will be the distance between C2 and the gray line, + * i.e. the length of the red line. + */ public double getFlatness() { return Math.sqrt(getFlatnessSq(getX1(), getY1(), getCtrlX1(), @@ -130,75 +463,266 @@ public abstract class CubicCurve2D implements Shape, Cloneable getX2(), getY2())); } - public void subdivide(CubicCurve2D l, CubicCurve2D r) + + /** + * Subdivides this curve into two halves. + * + *

A drawing that illustrates the effects of
+   * subdividing a CubicCurve2D + * + * @param left a curve whose geometry will be set to the left half + * of this curve, or null if the caller is not + * interested in the left half. + * + * @param right a curve whose geometry will be set to the right half + * of this curve, or null if the caller is not + * interested in the right half. + */ + public void subdivide(CubicCurve2D left, CubicCurve2D right) { - if (l == null) - l = new CubicCurve2D.Double(); - if (r == null) - r = new CubicCurve2D.Double(); // Use empty slots at end to share single array. double[] d = new double[] { getX1(), getY1(), getCtrlX1(), getCtrlY1(), getCtrlX2(), getCtrlY2(), getX2(), getY2(), 0, 0, 0, 0, 0, 0 }; subdivide(d, 0, d, 0, d, 6); - l.setCurve(d, 0); - r.setCurve(d, 6); + if (left != null) + left.setCurve(d, 0); + if (right != null) + right.setCurve(d, 6); } + + + /** + * Subdivides a cubic curve into two halves. + * + *

A drawing that illustrates the effects of
+   * subdividing a CubicCurve2D + * + * @param src the curve to be subdivided. + * + * @param left a curve whose geometry will be set to the left half + * of src, or null if the caller is not + * interested in the left half. + * + * @param right a curve whose geometry will be set to the right half + * of src, or null if the caller is not + * interested in the right half. + */ public static void subdivide(CubicCurve2D src, - CubicCurve2D l, CubicCurve2D r) + CubicCurve2D left, CubicCurve2D right) { - src.subdivide(l, r); + src.subdivide(left, right); } + + + /** + * Subdivides a cubic curve into two halves, passing all coordinates + * in an array. + * + *

A drawing that illustrates the effects of
+   * subdividing a CubicCurve2D + * + *

The left end point and the right start point will always be + * identical. Memory-concious programmers thus may want to pass the + * same array for both left and right, and + * set rightOff to leftOff + 6. + * + * @param src an array containing the coordinates of the curve to be + * subdivided. The x coordinate of the start point P1 is + * located at src[srcOff], its y at + * src[srcOff + 1]. The x coordinate of the + * first control point C1 is located at src[srcOff + + * 2], its y at src[srcOff + 3]. The + * x coordinate of the second control point C2 is located at + * src[srcOff + 4], its y at src[srcOff + + * 5]. The x coordinate of the end point is located at + * src[srcOff + 6], its y at src[srcOff + + * 7]. + * + * @param srcOff an offset into src, specifying + * the index of the start point’s x coordinate. + * + * @param left an array that will receive the coordinates of the + * left half of src. It is acceptable to pass + * src. A caller who is not interested in the left half + * can pass null. + * + * @param leftOff an offset into left, specifying the + * index where the start point’s x coordinate will be + * stored. + * + * @param right an array that will receive the coordinates of the + * right half of src. It is acceptable to pass + * src or left. A caller who is not + * interested in the right half can pass null. + * + * @param rightOff an offset into right, specifying the + * index where the start point’s x coordinate will be + * stored. + */ public static void subdivide(double[] src, int srcOff, double[] left, int leftOff, double[] right, int rightOff) { - // XXX Implement. - throw new Error("not implemented"); + // To understand this code, please have a look at the image + // "CubicCurve2D-3.png" in the sub-directory "doc-files". + double src_C1_x, src_C1_y, src_C2_x, src_C2_y; + double left_P1_x, left_P1_y; + double left_C1_x, left_C1_y, left_C2_x, left_C2_y; + double right_C1_x, right_C1_y, right_C2_x, right_C2_y; + double right_P2_x, right_P2_y; + double Mid_x, Mid_y; // Mid = left.P2 = right.P1 + + left_P1_x = src[srcOff]; + left_P1_y = src[srcOff + 1]; + src_C1_x = src[srcOff + 2]; + src_C1_y = src[srcOff + 3]; + src_C2_x = src[srcOff + 4]; + src_C2_y = src[srcOff + 5]; + right_P2_x = src[srcOff + 6]; + right_P2_y = src[srcOff + 7]; + + left_C1_x = (left_P1_x + src_C1_x) / 2; + left_C1_y = (left_P1_y + src_C1_y) / 2; + right_C2_x = (right_P2_x + src_C2_x) / 2; + right_C2_y = (right_P2_y + src_C2_y) / 2; + Mid_x = (src_C1_x + src_C2_x) / 2; + Mid_y = (src_C1_y + src_C2_y) / 2; + left_C2_x = (left_C1_x + Mid_x) / 2; + left_C2_y = (left_C1_y + Mid_y) / 2; + right_C1_x = (Mid_x + right_C2_x) / 2; + right_C1_y = (Mid_y + right_C2_y) / 2; + Mid_x = (left_C2_x + right_C1_x) / 2; + Mid_y = (left_C2_y + right_C1_y) / 2; + + 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; + } + + 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; + } } + + public static int solveCubic(double[] eqn) { return solveCubic(eqn, eqn); } + + public static int solveCubic(double[] eqn, double[] res) { - if (eqn[3] == 0) + double a, b, c, q, r, Q, R; + + double c3 = eqn[3]; + if (c3 == 0) return QuadCurve2D.solveQuadratic(eqn, res); - // XXX Implement. - throw new Error("not implemented"); + + // Divide the equation by the cubic coefficient. + c = eqn[0] / c3; + b = eqn[1] / c3; + a = eqn[2] / c3; + + // We now need to solve x^3 + ax^2 + bx + c = 0. + throw new Error("not implemented"); // FIXME } + + /** + * Determines whether a position lies inside the area that is bounded + * by the curve and the straight line connecting its end points. + * + *

A drawing of the area spanned by the curve + * + *

The above drawing illustrates in which area points are + * considered “contained” in a CubicCurve2D. + */ public boolean contains(double x, double y) { // XXX Implement. throw new Error("not implemented"); } + + + /** + * Determines whether a point lies inside the area that is bounded + * by the curve and the straight line connecting its end points. + * + *

A drawing of the area spanned by the curve + * + *

The above drawing illustrates in which area points are + * considered “contained” in a CubicCurve2D. + */ public boolean contains(Point2D p) { return contains(p.getX(), p.getY()); } + + public boolean intersects(double x, double y, double w, double h) { // XXX Implement. throw new Error("not implemented"); } + + public boolean intersects(Rectangle2D r) { return intersects(r.getX(), r.getY(), r.getWidth(), r.getHeight()); } + + public boolean contains(double x, double y, double w, double h) { // XXX Implement. throw new Error("not implemented"); } + + public boolean contains(Rectangle2D r) { return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight()); } + + + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control points. As the illustration + * below shows, the invisible control points may cause the bounds to + * be much larger than the area that is actually covered by the + * curve. + * + *

An illustration of the bounds of a CubicCurve2D + */ public Rectangle getBounds() { return getBounds2D().getBounds(); } + + public PathIterator getPathIterator(final AffineTransform at) { return new PathIterator() @@ -276,47 +800,135 @@ public abstract class CubicCurve2D implements Shape, Cloneable } }; } + + public PathIterator getPathIterator(AffineTransform at, double flatness) { return new FlatteningPathIterator(getPathIterator(at), flatness); } + /** - * Create a new curve of the same run-time type with the same contents as - * this one. + * Create a new curve with the same contents as this one. * - * @return the clone + * @return the clone. */ public Object clone() { try - { - return super.clone(); - } + { + return super.clone(); + } catch (CloneNotSupportedException e) - { - throw (Error) new InternalError().initCause(e); // Impossible - } + { + throw (Error) new InternalError().initCause(e); // Impossible + } } + /** - * STUBS ONLY + * A two-dimensional curve that is parameterized with a cubic + * function and stores coordinate values in double-precision + * floating-point format. + * + * @see CubicCurve2D.Float + * + * @author Eric Blake (ebb9@email.byu.edu) + * @author Sascha Brawer (brawer@dandelis.ch) */ - public static class Double extends CubicCurve2D + public static class Double + extends CubicCurve2D { + /** + * The x coordinate of the curve’s start point. + */ public double x1; + + + /** + * The y coordinate of the curve’s start point. + */ public double y1; + + + /** + * The x coordinate of the curve’s first control point. + */ public double ctrlx1; + + + /** + * The y coordinate of the curve’s first control point. + */ public double ctrly1; + + + /** + * The x coordinate of the curve’s second control point. + */ public double ctrlx2; + + + /** + * The y coordinate of the curve’s second control point. + */ public double ctrly2; + + + /** + * The x coordinate of the curve’s end point. + */ public double x2; + + + /** + * The y coordinate of the curve’s end point. + */ public double y2; + + /** + * Constructs a new CubicCurve2D that stores its coordinate values + * in double-precision floating-point format. All points are + * initially at position (0, 0). + */ public Double() { } + + /** + * Constructs a new CubicCurve2D that stores its coordinate values + * in double-precision floating-point format, specifying the + * initial position of each point. + * + *

A drawing of a CubicCurve2D + * + * @param x1 the x coordinate of the curve’s start + * point. + * + * @param y1 the y coordinate of the curve’s start + * point. + * + * @param cx1 the x coordinate of the curve’s first + * control point. + * + * @param cy1 the y coordinate of the curve’s first + * control point. + * + * @param cx2 the x coordinate of the curve’s second + * control point. + * + * @param cy2 the y coordinate of the curve’s second + * control point. + * + * @param x2 the x coordinate of the curve’s end + * point. + * + * @param y2 the y coordinate of the curve’s end + * point. + */ public Double(double x1, double y1, double cx1, double cy1, double cx2, double cy2, double x2, double y2) { @@ -330,58 +942,154 @@ public abstract class CubicCurve2D implements Shape, Cloneable this.y2 = y2; } + + /** + * Returns the x coordinate of the curve’s start + * point. + */ public double getX1() { return x1; } + + + /** + * Returns the y coordinate of the curve’s start + * point. + */ public double getY1() { return y1; } + + + /** + * Returns the curve’s start point. + */ public Point2D getP1() { return new Point2D.Double(x1, y1); } + + /** + * Returns the x coordinate of the curve’s first + * control point. + */ public double getCtrlX1() { return ctrlx1; } + + + /** + * Returns the y coordinate of the curve’s first + * control point. + */ public double getCtrlY1() { return ctrly1; } + + + /** + * Returns the curve’s first control point. + */ public Point2D getCtrlP1() { return new Point2D.Double(ctrlx1, ctrly1); } + + /** + * Returns the x coordinate of the curve’s second + * control point. + */ public double getCtrlX2() { return ctrlx2; } + + + /** + * Returns the y coordinate of the curve’s second + * control point. + */ public double getCtrlY2() { return ctrly2; } + + + /** + * Returns the curve’s second control point. + */ public Point2D getCtrlP2() { return new Point2D.Double(ctrlx2, ctrly2); } + + /** + * Returns the x coordinate of the curve’s end + * point. + */ public double getX2() { return x2; } + + + /** + * Returns the y coordinate of the curve’s end + * point. + */ public double getY2() { return y2; } + + + /** + * Returns the curve’s end point. + */ public Point2D getP2() { return new Point2D.Double(x2, y2); } + + /** + * Changes the curve geometry, separately specifying each coordinate + * value. + * + *

A drawing of a CubicCurve2D + * + * @param x1 the x coordinate of the curve’s new start + * point. + * + * @param y1 the y coordinate of the curve’s new start + * point. + * + * @param cx1 the x coordinate of the curve’s new + * first control point. + * + * @param cy1 the y coordinate of the curve’s new + * first control point. + * + * @param cx2 the x coordinate of the curve’s new + * second control point. + * + * @param cy2 the y coordinate of the curve’s new + * second control point. + * + * @param x2 the x coordinate of the curve’s new end + * point. + * + * @param y2 the y coordinate of the curve’s new end + * point. + */ public void setCurve(double x1, double y1, double cx1, double cy1, double cx2, double cy2, double x2, double y2) { @@ -394,6 +1102,18 @@ public abstract class CubicCurve2D implements Shape, Cloneable this.x2 = x2; this.y2 = y2; } + + + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control points. As the + * illustration below shows, the invisible control points may cause + * the bounds to be much larger than the area that is actually + * covered by the curve. + * + *

An illustration of the bounds of a CubicCurve2D + */ public Rectangle2D getBounds2D() { double nx1 = Math.min(Math.min(x1, ctrlx1), Math.min(ctrlx2, x2)); @@ -402,26 +1122,112 @@ public abstract class CubicCurve2D implements Shape, Cloneable double ny2 = Math.max(Math.max(y1, ctrly1), Math.max(ctrly2, y2)); return new Rectangle2D.Double(nx1, ny1, nx2 - nx1, ny2 - ny1); } - } // class Double + } + /** - * STUBS ONLY + * A two-dimensional curve that is parameterized with a cubic + * function and stores coordinate values in single-precision + * floating-point format. + * + * @see CubicCurve2D.Float + * + * @author Eric Blake (ebb9@email.byu.edu) + * @author Sascha Brawer (brawer@dandelis.ch) */ - public static class Float extends CubicCurve2D + public static class Float + extends CubicCurve2D { + /** + * The x coordinate of the curve’s start point. + */ public float x1; + + + /** + * The y coordinate of the curve’s start point. + */ public float y1; + + + /** + * The x coordinate of the curve’s first control point. + */ public float ctrlx1; + + + /** + * The y coordinate of the curve’s first control point. + */ public float ctrly1; + + + /** + * The x coordinate of the curve’s second control point. + */ public float ctrlx2; + + + /** + * The y coordinate of the curve’s second control point. + */ public float ctrly2; + + + /** + * The x coordinate of the curve’s end point. + */ public float x2; + + + /** + * The y coordinate of the curve’s end point. + */ public float y2; + + /** + * Constructs a new CubicCurve2D that stores its coordinate values + * in single-precision floating-point format. All points are + * initially at position (0, 0). + */ public Float() { } + + /** + * Constructs a new CubicCurve2D that stores its coordinate values + * in single-precision floating-point format, specifying the + * initial position of each point. + * + *

A drawing of a CubicCurve2D + * + * @param x1 the x coordinate of the curve’s start + * point. + * + * @param y1 the y coordinate of the curve’s start + * point. + * + * @param cx1 the x coordinate of the curve’s first + * control point. + * + * @param cy1 the y coordinate of the curve’s first + * control point. + * + * @param cx2 the x coordinate of the curve’s second + * control point. + * + * @param cy2 the y coordinate of the curve’s second + * control point. + * + * @param x2 the x coordinate of the curve’s end + * point. + * + * @param y2 the y coordinate of the curve’s end + * point. + */ public Float(float x1, float y1, float cx1, float cy1, float cx2, float cy2, float x2, float y2) { @@ -435,58 +1241,154 @@ public abstract class CubicCurve2D implements Shape, Cloneable this.y2 = y2; } + + /** + * Returns the x coordinate of the curve’s start + * point. + */ public double getX1() { return x1; } + + + /** + * Returns the y coordinate of the curve’s start + * point. + */ public double getY1() { return y1; } + + + /** + * Returns the curve’s start point. + */ public Point2D getP1() { return new Point2D.Float(x1, y1); } + + /** + * Returns the x coordinate of the curve’s first + * control point. + */ public double getCtrlX1() { return ctrlx1; } + + + /** + * Returns the y coordinate of the curve’s first + * control point. + */ public double getCtrlY1() { return ctrly1; } + + + /** + * Returns the curve’s first control point. + */ public Point2D getCtrlP1() { return new Point2D.Float(ctrlx1, ctrly1); } + + /** + * Returns the s coordinate of the curve’s second + * control point. + */ public double getCtrlX2() { return ctrlx2; } + + + /** + * Returns the y coordinate of the curve’s second + * control point. + */ public double getCtrlY2() { return ctrly2; } + + + /** + * Returns the curve’s second control point. + */ public Point2D getCtrlP2() { return new Point2D.Float(ctrlx2, ctrly2); } + + /** + * Returns the x coordinate of the curve’s end + * point. + */ public double getX2() { return x2; } + + + /** + * Returns the y coordinate of the curve’s end + * point. + */ public double getY2() { return y2; } + + + /** + * Returns the curve’s end point. + */ public Point2D getP2() { return new Point2D.Float(x2, y2); } + + /** + * Changes the curve geometry, separately specifying each coordinate + * value as a double-precision floating-point number. + * + *

A drawing of a CubicCurve2D + * + * @param x1 the x coordinate of the curve’s new start + * point. + * + * @param y1 the y coordinate of the curve’s new start + * point. + * + * @param cx1 the x coordinate of the curve’s new + * first control point. + * + * @param cy1 the y coordinate of the curve’s new + * first control point. + * + * @param cx2 the x coordinate of the curve’s new + * second control point. + * + * @param cy2 the y coordinate of the curve’s new + * second control point. + * + * @param x2 the x coordinate of the curve’s new end + * point. + * + * @param y2 the y coordinate of the curve’s new end + * point. + */ public void setCurve(double x1, double y1, double cx1, double cy1, double cx2, double cy2, double x2, double y2) { @@ -499,6 +1401,39 @@ public abstract class CubicCurve2D implements Shape, Cloneable this.x2 = (float) x2; this.y2 = (float) y2; } + + + /** + * Changes the curve geometry, separately specifying each coordinate + * value as a single-precision floating-point number. + * + *

A drawing of a CubicCurve2D + * + * @param x1 the x coordinate of the curve’s new start + * point. + * + * @param y1 the y coordinate of the curve’s new start + * point. + * + * @param cx1 the x coordinate of the curve’s new + * first control point. + * + * @param cy1 the y coordinate of the curve’s new + * first control point. + * + * @param cx2 the x coordinate of the curve’s new + * second control point. + * + * @param cy2 the y coordinate of the curve’s new + * second control point. + * + * @param x2 the x coordinate of the curve’s new end + * point. + * + * @param y2 the y coordinate of the curve’s new end + * point. + */ public void setCurve(float x1, float y1, float cx1, float cy1, float cx2, float cy2, float x2, float y2) { @@ -511,6 +1446,18 @@ public abstract class CubicCurve2D implements Shape, Cloneable this.x2 = x2; this.y2 = y2; } + + + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control points. As the + * illustration below shows, the invisible control points may cause + * the bounds to be much larger than the area that is actually + * covered by the curve. + * + *

An illustration of the bounds of a CubicCurve2D + */ public Rectangle2D getBounds2D() { float nx1 = (float) Math.min(Math.min(x1, ctrlx1), Math.min(ctrlx2, x2)); @@ -519,5 +1466,5 @@ public abstract class CubicCurve2D implements Shape, Cloneable float ny2 = (float) Math.max(Math.max(y1, ctrly1), Math.max(ctrly2, y2)); return new Rectangle2D.Float(nx1, ny1, nx2 - nx1, ny2 - ny1); } - } // class Float -} // class CubicCurve2D + } +} diff --git a/libjava/java/awt/geom/QuadCurve2D.java b/libjava/java/awt/geom/QuadCurve2D.java index e737ec1a470..5bc63e6c6cf 100644 --- a/libjava/java/awt/geom/QuadCurve2D.java +++ b/libjava/java/awt/geom/QuadCurve2D.java @@ -51,6 +51,7 @@ import java.util.NoSuchElementException; * alt="A drawing of a QuadCurve2D" /> * * @author Eric Blake (ebb9@email.byu.edu) + * @author Graydon Hoare (graydon@redhat.com) * @author Sascha Brawer (brawer@dandelis.ch) * * @since 1.2 @@ -129,7 +130,8 @@ public abstract class QuadCurve2D /** - * Changes the geometry of the curve. + * Changes the curve geometry, separately specifying each coordinate + * value. * * @param x1 the x coordinate of the curve’s new start * point. @@ -153,6 +155,23 @@ public abstract class QuadCurve2D double x2, double y2); + /** + * Changes the curve geometry, passing coordinate values in an + * array. + * + * @param coords an array containing the new coordinate values. The + * x coordinate of the new start point is located at + * coords[offset], its y coordinate at + * coords[offset + 1]. The x coordinate of the + * new control point is located at coords[offset + 2], + * its y coordinate at coords[offset + 3]. The + * x coordinate of the new end point is located at + * coords[offset + 4], its y coordinate at + * coords[offset + 5]. + * + * @param offset the offset of the first coordinate value in + * coords. + */ public void setCurve(double[] coords, int offset) { setCurve(coords[offset++], coords[offset++], @@ -161,6 +180,22 @@ public abstract class QuadCurve2D } + /** + * Changes the curve geometry, specifying coordinate values in + * separate Point objects. + * + *

A drawing of a QuadCurve2D + * + *

The curve does not keep any reference to the passed point + * objects. Therefore, a later change to p1, + * c p2 will not affect the curve + * geometry. + * + * @param p1 the new start point. + * @param c the new control point. + * @param p2 the new end point. + */ public void setCurve(Point2D p1, Point2D c, Point2D p2) { setCurve(p1.getX(), p1.getY(), c.getX(), c.getY(), @@ -168,11 +203,29 @@ public abstract class QuadCurve2D } + /** + * Changes the curve geometry, specifying coordinate values in an + * array of Point objects. + * + *

A drawing of a QuadCurve2D + * + *

The curve does not keep references to the passed point + * objects. Therefore, a later change to the pts array + * or any of its elements will not affect the curve geometry. + * + * @param pts an array containing the points. The new start point + * is located at pts[offset], the new control + * point at pts[offset + 1], and the new end point + * at pts[offset + 2]. + * + * @param offset the offset of the start point in pts. + */ public void setCurve(Point2D[] pts, int offset) { - setCurve(pts[offset].getX(), pts[offset++].getY(), - pts[offset].getX(), pts[offset++].getY(), - pts[offset].getX(), pts[offset++].getY()); + setCurve(pts[offset].getX(), pts[offset].getY(), + pts[offset + 1].getX(), pts[offset + 1].getY(), + pts[offset + 2].getX(), pts[offset + 2].getY()); } @@ -188,6 +241,26 @@ public abstract class QuadCurve2D } + /** + * Calculates the squared flatness of a quadratic curve, directly + * specifying each coordinate value. The flatness is the distance of + * the control point to the line between start and end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. The result will be the + * the square of the distance between C and the gray line, i.e. + * the squared length of the red line. + * + * @param x1 the x coordinate of the start point P1. + * @param y1 the y coordinate of the start point P1. + * @param cx the x coordinate of the control point C. + * @param cy the y coordinate of the control point C. + * @param x2 the x coordinate of the end point P2. + * @param y2 the y coordinate of the end point P2. + */ public static double getFlatnessSq(double x1, double y1, double cx, double cy, double x2, double y2) { @@ -195,6 +268,26 @@ public abstract class QuadCurve2D } + /** + * Calculates the flatness of a quadratic curve, directly specifying + * each coordinate value. The flatness is the distance of the + * control point to the line between start and end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. The result will be the + * the distance between C and the gray line, i.e. the length of + * the red line. + * + * @param x1 the x coordinate of the start point P1. + * @param y1 the y coordinate of the start point P1. + * @param cx the x coordinate of the control point C. + * @param cy the y coordinate of the control point C. + * @param x2 the x coordinate of the end point P2. + * @param y2 the y coordinate of the end point P2. + */ public static double getFlatness(double x1, double y1, double cx, double cy, double x2, double y2) { @@ -202,6 +295,32 @@ public abstract class QuadCurve2D } + /** + * Calculates the squared flatness of a quadratic curve, specifying + * the coordinate values in an array. The flatness is the distance + * of the control point to the line between start and end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. The result will be the + * the square of the distance between C and the gray line, i.e. + * the squared length of the red line. + * + * @param coords an array containing the coordinate values. The + * x coordinate of the start point P1 is located at + * coords[offset], its y coordinate at + * coords[offset + 1]. The x coordinate of the + * control point C is located at coords[offset + 2], + * its y coordinate at coords[offset + 3]. The + * x coordinate of the end point P2 is located at + * coords[offset + 4], its y coordinate at + * coords[offset + 5]. + * + * @param offset the offset of the first coordinate value in + * coords. + */ public static double getFlatnessSq(double[] coords, int offset) { return Line2D.ptSegDistSq(coords[offset], coords[offset + 1], @@ -210,6 +329,32 @@ public abstract class QuadCurve2D } + /** + * Calculates the flatness of a quadratic curve, specifying the + * coordinate values in an array. The flatness is the distance of + * the control point to the line between start and end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. The result will be the + * the the distance between C and the gray line, i.e. the length of + * the red line. + * + * @param coords an array containing the coordinate values. The + * x coordinate of the start point P1 is located at + * coords[offset], its y coordinate at + * coords[offset + 1]. The x coordinate of the + * control point C is located at coords[offset + 2], + * its y coordinate at coords[offset + 3]. The + * x coordinate of the end point P2 is located at + * coords[offset + 4], its y coordinate at + * coords[offset + 5]. + * + * @param offset the offset of the first coordinate value in + * coords. + */ public static double getFlatness(double[] coords, int offset) { return Line2D.ptSegDist(coords[offset], coords[offset + 1], @@ -218,6 +363,19 @@ public abstract class QuadCurve2D } + /** + * Calculates the squared flatness of this curve. The flatness is + * the distance of the control point to the line between start and + * end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. The result will be the + * the square of the distance between C and the gray line, i.e. the + * squared length of the red line. + */ public double getFlatnessSq() { return Line2D.ptSegDistSq(getX1(), getY1(), @@ -226,6 +384,19 @@ public abstract class QuadCurve2D } + /** + * Calculates the flatness of this curve. The flatness is the + * distance of the control point to the line between start and end + * point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. The result will be the + * the distance between C and the gray line, i.e. the length of the + * red line. + */ public double getFlatness() { return Line2D.ptSegDist(getX1(), getY1(), @@ -417,6 +588,16 @@ public abstract class QuadCurve2D } + /** + * Determines whether a point lies inside the area that is bounded + * by the curve and the straight line connecting its end points. + * + *

A drawing of the area spanned by the curve + * + *

The above drawing illustrates in which area points are + * considered “contained” in a QuadCurve2D. + */ public boolean contains(double x, double y) { // XXX Implement. @@ -424,6 +605,16 @@ public abstract class QuadCurve2D } + /** + * Determines whether a point lies inside the area that is bounded + * by the curve and the straight line connecting its end points. + * + *

A drawing of the area spanned by the curve + * + *

The above drawing illustrates in which area points are + * considered “contained” in a QuadCurve2D. + */ public boolean contains(Point2D p) { return contains(p.getX(), p.getY()); @@ -563,8 +754,7 @@ public abstract class QuadCurve2D /** - * Creates a new curve with the same contents as - * this one. + * Creates a new curve with the same contents as this one. * * @return the clone. */ diff --git a/libjava/java/awt/geom/doc-files/CubicCurve2D-1.png b/libjava/java/awt/geom/doc-files/CubicCurve2D-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1784509be61ad1db86eeb147e09f7ff45bafadd6 GIT binary patch literal 6280 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 uoZ#tmv~@H9eS7zL8?j`uyO^n!2bYr^5?n$ literal 0 HcmV?d00001 diff --git a/libjava/java/awt/geom/doc-files/CubicCurve2D-3.png b/libjava/java/awt/geom/doc-files/CubicCurve2D-3.png new file mode 100644 index 0000000000000000000000000000000000000000..b200dad37a8e5608ed5914361cee047abef8ad56 GIT binary patch literal 13168 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 literal 0 HcmV?d00001 diff --git a/libjava/java/awt/geom/doc-files/CubicCurve2D-4.png b/libjava/java/awt/geom/doc-files/CubicCurve2D-4.png new file mode 100644 index 0000000000000000000000000000000000000000..e57ffdc5cf0e8d0504ad40efa236c1a5a465a2c4 GIT binary patch literal 7839 zcmd6sRa6|!6X+M$g~gpLPDp~g?!w~k1PSgM+}$C#gx~~+Ai;uL@Zb>Kb%8)2xZeH# z&-dlN-8pAwx@YS2sjjK6`gKi=nu;tCn-UuU008CXU>X1b(g#Gl5fd44)!dq;LEKQS zp~_GIUZN;SsG&&n+$`CD#Ob@005wQmWM&LymL-+ zv9ySF+lHJ`khdkPz-(+)MWLaX+($o>aA`3x7-A0gSm_uBe~2p6vzT9gmj9_ly2EX< z&E@lvkW+-oJW17Vm@PaY>P!v!?!J_})G{Z16`}u@sW@k;QKp-$_ z959#crvr4sL}7P#*W24W+!aFq`nCKy=^@$)ui~6 z*CIMDZl%#yQ@1##G_?2HQgO1SlcD37geLgmGTjy5KdbTHx9J5 zS8(xQ>g_!W_@OIn>*CI6J&|<2Gt#ng1g?#i4xK5G=wbFhN3(S(hHv$c7&xnE1Jr}% zinn6Ykg?HJR2ccv8JV%ubboF`ZKsH``PH-Q{Dp)(s~soX&ng{>giUyoK*`_jO)lY5 z4vx0lN7@%R-Cn*mA>c2;GX+vT%yK1;aA??YU&I_UOvWzYLo#1I?bLfp;>TNtfL#h2 zWf57h++_->fuEqHoS^TdUkfE(bmpx z#oW1e?6?9Kp~A}ryv*WAOGB+->=A5*p&*5C%5S>S)tu>fofM00M-&O19ouuv8A;Xm zz(aj;z2{Yitb^LZ{Vzo_kdU$O7-nV)Ch7wNwT7FW7d-Ob zMj%#=x(F>Tt-QRvLy)8-at8?og)Qwd;aA>roV1$T+vdv-ANO_CIxPDIN>+hfVOXWr z;Z$=WMJBs?SeT7G1OlPNU|jSy1B2@8>m9hbK$rvfVWl|Y9VdDFR+Lpzg~-MrBB`Hd z%kriJ*kSwf({wWvMqekH7?XltvbA(lJdWLy-zh@hl1_f%iz`V@O@&fkpDdxYfhOl^ zH9$sD;7`^Le596l2P@$Qa{-`}7meH;DrMCI0_wd+3vpXO9?uHhOSB{S9 z8$am0Bi~|17=v?A8JU^c)~;q=

b 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 literal 0 HcmV?d00001 diff --git a/libjava/java/awt/geom/doc-files/CubicCurve2D-5.png b/libjava/java/awt/geom/doc-files/CubicCurve2D-5.png new file mode 100644 index 0000000000000000000000000000000000000000..701ab138f0b10c5d6bc22b96233e1ed06f84811d GIT binary patch literal 5112 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 literal 0 HcmV?d00001 diff --git a/libjava/java/awt/geom/doc-files/QuadCurve2D-5.png b/libjava/java/awt/geom/doc-files/QuadCurve2D-5.png new file mode 100644 index 0000000000000000000000000000000000000000..72110cd5a624d72d3a99692620316eba45c10f00 GIT binary patch literal 4757 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