From 12be91a78c9f6caadd4024d3af5bc468f9a32130 Mon Sep 17 00:00:00 2001
From: Sascha Brawer <brawer@dandelis.ch>
Date: Wed, 22 Oct 2003 10:54:19 +0200
Subject: [PATCH] QuadCurve2D.java (subdivide): Added documentation.

2003-10-22  Sascha Brawer  <brawer@dandelis.ch>

	* java/awt/geom/QuadCurve2D.java (subdivide): Added documentation.
	java/awt/geom/doc-files/QuadCurve2D-3.png: New illustration.

2003-10-22  Sascha Brawer  <brawer@dandelis.ch>

	* java/awt/geom/QuadCurve2D.java: Reformatted, wrote Javadoc.
	* java/awt/geom/doc-files: New directory.
	* java/awt/geom/doc-files/QuadCurve2D-1.png,
	java/awt/geom/doc-files/QuadCurve2D-2.png: New illustrations.

2003-10-22  Sascha Brawer  <brawer@dandelis.ch>

	* java/awt/geom/QuadCurve2D.java (subdivide): Implement.

2003-10-22  Sascha Brawer  <brawer@dandelis.ch>

	* java/awt/geom/QuadCurve2D.java (getFlatness, getFlatnessSq): Implement.

From-SVN: r72791
---
 libjava/ChangeLog                             |  20 +
 libjava/java/awt/geom/QuadCurve2D.java        | 779 +++++++++++++++---
 .../java/awt/geom/doc-files/QuadCurve2D-1.png | Bin 0 -> 6363 bytes
 .../java/awt/geom/doc-files/QuadCurve2D-2.png | Bin 0 -> 5872 bytes
 .../java/awt/geom/doc-files/QuadCurve2D-3.png | Bin 0 -> 12334 bytes
 5 files changed, 706 insertions(+), 93 deletions(-)
 create mode 100644 libjava/java/awt/geom/doc-files/QuadCurve2D-1.png
 create mode 100644 libjava/java/awt/geom/doc-files/QuadCurve2D-2.png
 create mode 100644 libjava/java/awt/geom/doc-files/QuadCurve2D-3.png

diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 7f53a3625640..1d3e7bbb0148 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,23 @@
+2003-10-22  Sascha Brawer  <brawer@dandelis.ch>
+
+	* java/awt/geom/QuadCurve2D.java (subdivide): Added documentation.
+	java/awt/geom/doc-files/QuadCurve2D-3.png: New illustration.
+
+2003-10-22  Sascha Brawer  <brawer@dandelis.ch>
+
+	* java/awt/geom/QuadCurve2D.java: Reformatted, wrote Javadoc.
+	* java/awt/geom/doc-files: New directory.
+	* java/awt/geom/doc-files/QuadCurve2D-1.png,
+	java/awt/geom/doc-files/QuadCurve2D-2.png: New illustrations.
+	
+2003-10-22  Sascha Brawer  <brawer@dandelis.ch>
+
+	* java/awt/geom/QuadCurve2D.java (subdivide): Implement.
+
+2003-10-22  Sascha Brawer  <brawer@dandelis.ch>
+
+	* java/awt/geom/QuadCurve2D.java (getFlatness, getFlatnessSq): Implement.
+
 2003-10-22  Michael Koch  <konqueror@gmx.de>
 
 	* java/io/File.java
diff --git a/libjava/java/awt/geom/QuadCurve2D.java b/libjava/java/awt/geom/QuadCurve2D.java
index 6aed05907562..e737ec1a4706 100644
--- a/libjava/java/awt/geom/QuadCurve2D.java
+++ b/libjava/java/awt/geom/QuadCurve2D.java
@@ -1,5 +1,5 @@
 /* QuadCurve2D.java -- represents a parameterized quadratic 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,124 +42,361 @@ 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 quadratic
+ * function.
+ *
+ * <p><img src="doc-files/QuadCurve2D-1.png" width="350" height="180"
+ * alt="A drawing of a QuadCurve2D" />
+ *
+ * @author Eric Blake (ebb9@email.byu.edu)
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ *
+ * @since 1.2
  */
-public abstract class QuadCurve2D implements Shape, Cloneable
+public abstract class QuadCurve2D
+  implements Shape, Cloneable
 {
+  /**
+   * Constructs a new QuadCurve2D. Typical users will want to
+   * construct instances of a subclass, such as {@link
+   * QuadCurve2D.Float} or {@link QuadCurve2D.Double}.
+   */
   protected QuadCurve2D()
   {
   }
 
+
+  /**
+   * Returns the <i>x</i> coordinate of the curve&#x2019;s start
+   * point.
+   */
   public abstract double getX1();
+
+
+  /**
+   * Returns the <i>y</i> coordinate of the curve&#x2019;s start
+   * point.
+   */
   public abstract double getY1();
+
+
+  /**
+   * Returns the curve&#x2019;s start point.
+   */
   public abstract Point2D getP1();
+
+
+  /**
+   * Returns the <i>x</i> coordinate of the curve&#x2019;s control
+   * point.
+   */
   public abstract double getCtrlX();
+
+
+  /**
+   * Returns the <i>y</i> coordinate of the curve&#x2019;s control
+   * point.
+   */
   public abstract double getCtrlY();
+
+
+  /**
+   * Returns the curve&#x2019;s control point.
+   */
   public abstract Point2D getCtrlPt();
+
+
+  /**
+   * Returns the <i>x</i> coordinate of the curve&#x2019;s end
+   * point.
+   */
   public abstract double getX2();
+
+
+  /**
+   * Returns the <i>y</i> coordinate of the curve&#x2019;s end
+   * point.
+   */
   public abstract double getY2();
+
+
+  /**
+   * Returns the curve&#x2019;s end point.
+   */
   public abstract Point2D getP2();
 
+
+  /**
+   * Changes the geometry of the curve.
+   *
+   * @param x1 the <i>x</i> coordinate of the curve&#x2019;s new start
+   * point.
+   *
+   * @param y1 the <i>y</i> coordinate of the curve&#x2019;s new start
+   * point.
+   *
+   * @param cx the <i>x</i> coordinate of the curve&#x2019;s new
+   * control point.
+   *
+   * @param cy the <i>y</i> coordinate of the curve&#x2019;s new
+   * control point.
+   *
+   * @param x2 the <i>x</i> coordinate of the curve&#x2019;s new end
+   * point.
+   *
+   * @param y2 the <i>y</i> coordinate of the curve&#x2019;s new end
+   * point.
+   */
   public abstract void setCurve(double x1, double y1, double cx, double cy,
                                 double x2, double y2);
+
+
   public void setCurve(double[] coords, int offset)
   {
     setCurve(coords[offset++], coords[offset++],
              coords[offset++], coords[offset++],
              coords[offset++], coords[offset++]);
   }
+
+
   public void setCurve(Point2D p1, Point2D c, Point2D p2)
   {
     setCurve(p1.getX(), p1.getY(), c.getX(), c.getY(),
              p2.getX(), p2.getY());
   }
+
+
   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());
   }
+
+
+  /**
+   * Changes the geometry of the curve to that of another curve.
+   *
+   * @param c the curve whose coordinates will be copied.
+   */
   public void setCurve(QuadCurve2D c)
   {
     setCurve(c.getX1(), c.getY1(), c.getCtrlX(), c.getCtrlY(),
              c.getX2(), c.getY2());
   }
+
+
   public static double getFlatnessSq(double x1, double y1, double cx,
                                      double cy, double x2, double y2)
   {
-    // XXX Implement.
-    throw new Error("not implemented");
+    return Line2D.ptSegDistSq(x1, y1, x2, y2, cx, cy);
   }
+
+
   public static double getFlatness(double x1, double y1, double cx, double cy,
                                    double x2, double y2)
   {
-    return Math.sqrt(getFlatnessSq(x1, y1, cx, cy, x2, y2));
+    return Line2D.ptSegDist(x1, y1, x2, y2, cx, cy);
   }
+
+
   public static double getFlatnessSq(double[] coords, int offset)
   {
-    return getFlatnessSq(coords[offset++], coords[offset++],
-                         coords[offset++], coords[offset++],
-                         coords[offset++], coords[offset++]);
+    return Line2D.ptSegDistSq(coords[offset], coords[offset + 1],
+                              coords[offset + 4], coords[offset + 5],
+                              coords[offset + 2], coords[offset + 3]);
   }
+
+
   public static double getFlatness(double[] coords, int offset)
   {
-    return Math.sqrt(getFlatnessSq(coords[offset++], coords[offset++],
-                                   coords[offset++], coords[offset++],
-                                   coords[offset++], coords[offset++]));
+    return Line2D.ptSegDist(coords[offset], coords[offset + 1],
+                            coords[offset + 4], coords[offset + 5],
+                            coords[offset + 2], coords[offset + 3]);
   }
+
+
   public double getFlatnessSq()
   {
-    return getFlatnessSq(getX1(), getY1(), getCtrlX(), getCtrlY(),
-                         getX2(), getY2());
+    return Line2D.ptSegDistSq(getX1(), getY1(),
+                              getX2(), getY2(),
+                              getCtrlX(), getCtrlY());
   }
+
+
   public double getFlatness()
   {
-    return Math.sqrt(getFlatnessSq(getX1(), getY1(), getCtrlX(), getCtrlY(),
-                                   getX2(), getY2()));
+    return Line2D.ptSegDist(getX1(), getY1(),
+                            getX2(), getY2(),
+                            getCtrlX(), getCtrlY());
   }
 
-  public void subdivide(QuadCurve2D l, QuadCurve2D r)
+
+  /**
+   * Subdivides this curve into two halves.
+   *
+   * <p><img src="doc-files/QuadCurve2D-3.png" width="700"
+   * height="180" alt="A drawing that illustrates the effects of
+   * subdividing a QuadCurve2D" />
+   *
+   * @param left a curve whose geometry will be set to the left half
+   * of this curve, or <code>null</code> 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 <code>null</code> if the caller is not
+   * interested in the right half.
+   */
+  public void subdivide(QuadCurve2D left, QuadCurve2D right)
   {
-    if (l == null)
-      l = new QuadCurve2D.Double();
-    if (r == null)
-      r = new QuadCurve2D.Double();
     // Use empty slots at end to share single array.
     double[] d = new double[] { getX1(), getY1(), getCtrlX(), getCtrlY(),
                                 getX2(), getY2(), 0, 0, 0, 0 };
     subdivide(d, 0, d, 0, d, 4);
-    l.setCurve(d, 0);
-    r.setCurve(d, 4);
+    if (left != null)
+      left.setCurve(d, 0);
+    if (right != null)
+      right.setCurve(d, 4);
   }
-  public static void subdivide(QuadCurve2D src, QuadCurve2D l, QuadCurve2D r)
+
+
+  /**
+   * Subdivides a quadratic curve into two halves.
+   *
+   * <p><img src="doc-files/QuadCurve2D-3.png" width="700"
+   * height="180" alt="A drawing that illustrates the effects of
+   * subdividing a QuadCurve2D" />
+   *
+   * @param src the curve to be subdivided.
+   *
+   * @param left a curve whose geometry will be set to the left half
+   * of <code>src</code>, or <code>null</code> if the caller is not
+   * interested in the left half.
+   *
+   * @param right a curve whose geometry will be set to the right half
+   * of <code>src</code>, or <code>null</code> if the caller is not
+   * interested in the right half.
+   */
+  public static void subdivide(QuadCurve2D src, QuadCurve2D left,
+                               QuadCurve2D right)
   {
-    src.subdivide(l, r);
+    src.subdivide(left, right);
   }
+
+
+  /**
+   * Subdivides a quadratic curve into two halves, passing all
+   * coordinates in an array.
+   *
+   * <p><img src="doc-files/QuadCurve2D-3.png" width="700"
+   * height="180" alt="A drawing that illustrates the effects of
+   * subdividing a QuadCurve2D" />
+   *
+   * <p>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 <code>left</code> and <code>right</code>, and
+   * set <code>rightOff</code> to <code>leftOff + 4</code>.
+   *
+   * @param src an array containing the coordinates of the curve to be
+   * subdivided.  The <i>x</i> coordinate of the start point is
+   * located at <code>src[srcOff]</code>, its <i>y</i> at
+   * <code>src[srcOff + 1]</code>.  The <i>x</i> coordinate of the
+   * control point is located at <code>src[srcOff + 2]</code>, its
+   * <i>y</i> at <code>src[srcOff + 3]</code>.  The <i>x</i>
+   * coordinate of the end point is located at <code>src[srcOff +
+   * 4]</code>, its <i>y</i> at <code>src[srcOff + 5]</code>.
+   *
+   * @param srcOff an offset into <code>src</code>, specifying
+   * the index of the start point&#x2019;s <i>x</i> coordinate.
+   *
+   * @param left an array that will receive the coordinates of the
+   * left half of <code>src</code>. It is acceptable to pass
+   * <code>src</code>. A caller who is not interested in the left half
+   * can pass <code>null</code>.
+   *
+   * @param leftOff an offset into <code>left</code>, specifying the
+   * index where the start point&#x2019;s <i>x</i> coordinate will be
+   * stored.
+   *
+   * @param right an array that will receive the coordinates of the
+   * right half of <code>src</code>. It is acceptable to pass
+   * <code>src</code> or <code>left</code>. A caller who is not
+   * interested in the right half can pass <code>null</code>.
+   *
+   * @param rightOff an offset into <code>right</code>, specifying the
+   * index where the start point&#x2019;s <i>x</i> 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");
+    double x1, y1, xc, yc, x2, y2;
+
+    x1 = src[srcOff];
+    y1 = src[srcOff + 1];
+    xc = src[srcOff + 2];
+    yc = src[srcOff + 3];
+    x2 = src[srcOff + 4];
+    y2 = src[srcOff + 5];
+
+    if (left != null)
+    {
+      left[leftOff] = x1;
+      left[leftOff + 1] = y1;
+    }
+
+    if (right != null)
+    {
+      right[rightOff + 4] = x2;
+      right[rightOff + 5] = y2;
+    }
+
+    x1 = (x1 + xc) / 2;
+    x2 = (xc + x2) / 2;
+    xc = (x1 + x2) / 2;
+    y1 = (y1 + yc) / 2;
+    y2 = (y2 + yc) / 2;
+    yc = (y1 + y2) / 2;
+
+    if (left != null)
+    {
+      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;
+    }
   }
+
+
   public static int solveQuadratic(double[] eqn)
   {
     return solveQuadratic(eqn, eqn);
   }
+
+
   public static int solveQuadratic(double[] eqn, double[] res)
   {
     double c = eqn[0];
     double b = eqn[1];
     double a = eqn[2];
     if (a == 0)
-      {
-        if (b == 0)
-          return -1;
-        res[0] = -c / b;
-        return 1;
-      }
+    {
+      if (b == 0)
+        return -1;
+      res[0] = -c / b;
+      return 1;
+    }
     c /= a;
     b /= a * 2;
     double det = Math.sqrt(b * b - c);
@@ -167,49 +404,74 @@ public abstract class QuadCurve2D implements Shape, Cloneable
       return 0;
     // For fewer rounding errors, we calculate the two roots differently.
     if (b > 0)
-      {
-        res[0] = -b - det;
-        res[1] = -c / (b + det);
-      }
+    {
+      res[0] = -b - det;
+      res[1] = -c / (b + det);
+    }
     else
-      {
-        res[0] = -c / (b - det);
-        res[1] = -b + det;
-      }
+    {
+      res[0] = -c / (b - det);
+      res[1] = -b + det;
+    }
     return 2;
   }
 
+
   public boolean contains(double x, double y)
   {
     // XXX Implement.
     throw new Error("not implemented");
   }
+
+
   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&#x2019;s start, end and control point. As the illustration
+   * below shows, the invisible control point may cause the bounds to
+   * be much larger than the area that is actually covered by the
+   * curve.
+   *
+   * <p><img src="doc-files/QuadCurve2D-2.png" width="350" height="180"
+   * alt="An illustration of the bounds of a QuadCurve2D" />
+   */
   public Rectangle getBounds()
   {
     return getBounds2D().getBounds();
   }
+
+
   public PathIterator getPathIterator(final AffineTransform at)
   {
     return new PathIterator()
@@ -217,115 +479,190 @@ public abstract class QuadCurve2D implements Shape, Cloneable
       /** 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");
-          }
+        {
+        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");
-          }
+        {
+        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;
       }
     };
   }
+
+
   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
+   * Creates a new curve with the same contents as
    * this one.
    *
-   * @return the clone
-   *
-   * @exception OutOfMemoryError If there is not enough memory available.
-   *
-   * @since 1.2
+   * @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 quadratic
+   * function and stores coordinate values in double-precision
+   * floating-point format.
+   *
+   * @see QuadCurve2D.Float
+   *
+   * @author Eric Blake (ebb9@email.byu.edu)
+   * @author Sascha Brawer (brawer@dandelis.ch)
    */
-  public static class Double extends QuadCurve2D
+  public static class Double
+    extends QuadCurve2D
   {
+    /**
+     * The <i>x</i> coordinate of the curve&#x2019;s start point.
+     */
     public double x1;
+
+
+    /**
+     * The <i>y</i> coordinate of the curve&#x2019;s start point.
+     */
     public double y1;
+
+
+    /**
+     * The <i>x</i> coordinate of the curve&#x2019;s control point.
+     */
     public double ctrlx;
+
+
+    /**
+     * The <i>y</i> coordinate of the curve&#x2019;s control point.
+     */
     public double ctrly;
+
+
+    /**
+     * The <i>x</i> coordinate of the curve&#x2019;s end point.
+     */
     public double x2;
+
+
+    /**
+     * The <i>y</i> coordinate of the curve&#x2019;s end point.
+     */
     public double y2;
 
+
+    /**
+     * Constructs a new QuadCurve2D that stores its coordinate values
+     * in double-precision floating-point format. All points are
+     * initially at position (0, 0).
+     */
     public Double()
     {
     }
 
+
+    /**
+     * Constructs a new QuadCurve2D that stores its coordinate values
+     * in double-precision floating-point format, specifying the
+     * initial position of each point.
+     *
+     * @param x1 the <i>x</i> coordinate of the curve&#x2019;s start
+     * point.
+     *
+     * @param y1 the <i>y</i> coordinate of the curve&#x2019;s start
+     * point.
+     *
+     * @param cx the <i>x</i> coordinate of the curve&#x2019;s control
+     * point.
+     *
+     * @param cy the <i>y</i> coordinate of the curve&#x2019;s control
+     * point.
+     *
+     * @param x2 the <i>x</i> coordinate of the curve&#x2019;s end
+     * point.
+     *
+     * @param y2 the <i>y</i> coordinate of the curve&#x2019;s end
+     * point.
+     */
     public Double(double x1, double y1, double cx, double cy,
                   double x2, double y2)
     {
@@ -337,45 +674,115 @@ public abstract class QuadCurve2D implements Shape, Cloneable
       this.y2 = y2;
     }
 
+
+    /**
+     * Returns the <i>x</i> coordinate of the curve&#x2019;s start
+     * point.
+     */
     public double getX1()
     {
       return x1;
     }
+
+
+    /**
+     * Returns the <i>y</i> coordinate of the curve&#x2019;s start
+     * point.
+     */
     public double getY1()
     {
       return y1;
     }
+
+
+    /**
+     * Returns the curve&#x2019;s start point.
+     */
     public Point2D getP1()
     {
       return new Point2D.Double(x1, y1);
     }
 
+
+    /**
+     * Returns the <i>x</i> coordinate of the curve&#x2019;s control
+     * point.
+     */
     public double getCtrlX()
     {
       return ctrlx;
     }
+
+
+    /**
+     * Returns the <i>y</i> coordinate of the curve&#x2019;s control
+     * point.
+     */
     public double getCtrlY()
     {
       return ctrly;
     }
+
+
+    /**
+     * Returns the curve&#x2019;s control point.
+     */
     public Point2D getCtrlPt()
     {
       return new Point2D.Double(ctrlx, ctrly);
     }
 
+
+    /**
+     * Returns the <i>x</i> coordinate of the curve&#x2019;s end
+     * point.
+     */
     public double getX2()
     {
       return x2;
     }
+
+
+    /**
+     * Returns the <i>y</i> coordinate of the curve&#x2019;s end
+     * point.
+     */
     public double getY2()
     {
       return y2;
     }
+
+
+    /**
+     * Returns the curve&#x2019;s end point.
+     */
     public Point2D getP2()
     {
       return new Point2D.Double(x2, y2);
     }
 
+
+    /**
+     * Changes the geometry of the curve.
+     *
+     * @param x1 the <i>x</i> coordinate of the curve&#x2019;s new
+     * start point.
+     *
+     * @param y1 the <i>y</i> coordinate of the curve&#x2019;s new
+     * start point.
+     *
+     * @param cx the <i>x</i> coordinate of the curve&#x2019;s new
+     * control point.
+     *
+     * @param cy the <i>y</i> coordinate of the curve&#x2019;s new
+     * control point.
+     *
+     * @param x2 the <i>x</i> coordinate of the curve&#x2019;s new
+     * end point.
+     *
+     * @param y2 the <i>y</i> coordinate of the curve&#x2019;s new
+     * end point.
+     */
     public void setCurve(double x1, double y1, double cx, double cy,
                          double x2, double y2)
     {
@@ -386,6 +793,18 @@ public abstract class QuadCurve2D implements Shape, Cloneable
       this.x2 = x2;
       this.y2 = y2;
     }
+
+
+    /**
+     * Determines the smallest rectangle that encloses the
+     * curve&#x2019;s start, end and control point. As the
+     * illustration below shows, the invisible control point may cause
+     * the bounds to be much larger than the area that is actually
+     * covered by the curve.
+     *
+     * <p><img src="doc-files/QuadCurve2D-2.png" width="350" height="180"
+     * alt="An illustration of the bounds of a QuadCurve2D" />
+     */
     public Rectangle2D getBounds2D()
     {
       double nx1 = Math.min(Math.min(x1, ctrlx), x2);
@@ -394,24 +813,91 @@ public abstract class QuadCurve2D implements Shape, Cloneable
       double ny2 = Math.max(Math.max(y1, ctrly), y2);
       return new Rectangle2D.Double(nx1, ny1, nx2 - nx1, ny2 - ny1);
     }
-  } // class Double
+  }
+
 
   /**
-   * STUBS ONLY
+   * A two-dimensional curve that is parameterized with a quadratic
+   * function and stores coordinate values in single-precision
+   * floating-point format.
+   *
+   * @see QuadCurve2D.Double
+   *
+   * @author Eric Blake (ebb9@email.byu.edu)
+   * @author Sascha Brawer (brawer@dandelis.ch)
    */
-  public static class Float extends QuadCurve2D
+  public static class Float
+    extends QuadCurve2D
   {
+    /**
+     * The <i>x</i> coordinate of the curve&#x2019;s start point.
+     */
     public float x1;
+
+
+    /**
+     * The <i>y</i> coordinate of the curve&#x2019;s start point.
+     */
     public float y1;
+
+
+    /**
+     * The <i>x</i> coordinate of the curve&#x2019;s control point.
+     */
     public float ctrlx;
+
+
+    /**
+     * The <i>y</i> coordinate of the curve&#x2019;s control point.
+     */
     public float ctrly;
+
+
+    /**
+     * The <i>x</i> coordinate of the curve&#x2019;s end point.
+     */
     public float x2;
+
+
+    /**
+     * The <i>y</i> coordinate of the curve&#x2019;s end point.
+     */
     public float y2;
 
+
+    /**
+     * Constructs a new QuadCurve2D that stores its coordinate values
+     * in single-precision floating-point format. All points are
+     * initially at position (0, 0).
+     */
     public Float()
     {
     }
 
+
+    /**
+     * Constructs a new QuadCurve2D that stores its coordinate values
+     * in single-precision floating-point format, specifying the
+     * initial position of each point.
+     *
+     * @param x1 the <i>x</i> coordinate of the curve&#x2019;s start
+     * point.
+     *
+     * @param y1 the <i>y</i> coordinate of the curve&#x2019;s start
+     * point.
+     *
+     * @param cx the <i>x</i> coordinate of the curve&#x2019;s control
+     * point.
+     *
+     * @param cy the <i>y</i> coordinate of the curve&#x2019;s control
+     * point.
+     *
+     * @param x2 the <i>x</i> coordinate of the curve&#x2019;s end
+     * point.
+     *
+     * @param y2 the <i>y</i> coordinate of the curve&#x2019;s end
+     * point.
+     */
     public Float(float x1, float y1, float cx, float cy,
                  float x2, float y2)
     {
@@ -423,45 +909,116 @@ public abstract class QuadCurve2D implements Shape, Cloneable
       this.y2 = y2;
     }
 
+
+    /**
+     * Returns the <i>x</i> coordinate of the curve&#x2019;s start
+     * point.
+     */
     public double getX1()
     {
       return x1;
     }
+
+
+    /**
+     * Returns the <i>y</i> coordinate of the curve&#x2019;s start
+     * point.
+     */
     public double getY1()
     {
       return y1;
     }
+
+
+    /**
+     * Returns the curve&#x2019;s start point.
+     */
     public Point2D getP1()
     {
       return new Point2D.Float(x1, y1);
     }
 
+
+    /**
+     * Returns the <i>x</i> coordinate of the curve&#x2019;s control
+     * point.
+     */
     public double getCtrlX()
     {
       return ctrlx;
     }
+
+
+    /**
+     * Returns the <i>y</i> coordinate of the curve&#x2019;s control
+     * point.
+     */
     public double getCtrlY()
     {
       return ctrly;
     }
+
+
+    /**
+     * Returns the curve&#x2019;s control point.
+     */
     public Point2D getCtrlPt()
     {
       return new Point2D.Float(ctrlx, ctrly);
     }
 
+
+    /**
+     * Returns the <i>x</i> coordinate of the curve&#x2019;s end
+     * point.
+     */
     public double getX2()
     {
       return x2;
     }
+
+
+    /**
+     * Returns the <i>y</i> coordinate of the curve&#x2019;s end
+     * point.
+     */
     public double getY2()
     {
       return y2;
     }
+
+
+    /**
+     * Returns the curve&#x2019;s end point.
+     */
     public Point2D getP2()
     {
       return new Point2D.Float(x2, y2);
     }
 
+
+    /**
+     * Changes the geometry of the curve, specifying coordinate values
+     * as double-precision floating-point numbers.
+     *
+     * @param x1 the <i>x</i> coordinate of the curve&#x2019;s new
+     * start point.
+     *
+     * @param y1 the <i>y</i> coordinate of the curve&#x2019;s new
+     * start point.
+     *
+     * @param cx the <i>x</i> coordinate of the curve&#x2019;s new
+     * control point.
+     *
+     * @param cy the <i>y</i> coordinate of the curve&#x2019;s new
+     * control point.
+     *
+     * @param x2 the <i>x</i> coordinate of the curve&#x2019;s new
+     * end point.
+     *
+     * @param y2 the <i>y</i> coordinate of the curve&#x2019;s new
+     * end point.
+     */
     public void setCurve(double x1, double y1, double cx, double cy,
                          double x2, double y2)
     {
@@ -472,6 +1029,30 @@ public abstract class QuadCurve2D implements Shape, Cloneable
       this.x2 = (float) x2;
       this.y2 = (float) y2;
     }
+
+
+    /**
+     * Changes the geometry of the curve, specifying coordinate values
+     * as single-precision floating-point numbers.
+     *
+     * @param x1 the <i>x</i> coordinate of the curve&#x2019;s new
+     * start point.
+     *
+     * @param y1 the <i>y</i> coordinate of the curve&#x2019;s new
+     * start point.
+     *
+     * @param cx the <i>x</i> coordinate of the curve&#x2019;s new
+     * control point.
+     *
+     * @param cy the <i>y</i> coordinate of the curve&#x2019;s new
+     * control point.
+     *
+     * @param x2 the <i>x</i> coordinate of the curve&#x2019;s new
+     * end point.
+     *
+     * @param y2 the <i>y</i> coordinate of the curve&#x2019;s new
+     * end point.
+     */
     public void setCurve(float x1, float y1, float cx, float cy,
                          float x2, float y2)
     {
@@ -482,6 +1063,18 @@ public abstract class QuadCurve2D implements Shape, Cloneable
       this.x2 = x2;
       this.y2 = y2;
     }
+
+
+    /**
+     * Determines the smallest rectangle that encloses the
+     * curve&#x2019;s start, end and control point. As the
+     * illustration below shows, the invisible control point may cause
+     * the bounds to be much larger than the area that is actually
+     * covered by the curve.
+     *
+     * <p><img src="doc-files/QuadCurve2D-2.png" width="350" height="180"
+     * alt="An illustration of the bounds of a QuadCurve2D" />
+     */
     public Rectangle2D getBounds2D()
     {
       float nx1 = (float) Math.min(Math.min(x1, ctrlx), x2);
@@ -490,5 +1083,5 @@ public abstract class QuadCurve2D implements Shape, Cloneable
       float ny2 = (float) Math.max(Math.max(y1, ctrly), y2);
       return new Rectangle2D.Float(nx1, ny1, nx2 - nx1, ny2 - ny1);
     }
-  } // class Float
-} // class CubicCurve2D
+  }
+}
diff --git a/libjava/java/awt/geom/doc-files/QuadCurve2D-1.png b/libjava/java/awt/geom/doc-files/QuadCurve2D-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c2ec0ea9cbc4bb0516c12cd357ba63b0aa27404
GIT binary patch
literal 6363
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

literal 0
HcmV?d00001

diff --git a/libjava/java/awt/geom/doc-files/QuadCurve2D-2.png b/libjava/java/awt/geom/doc-files/QuadCurve2D-2.png
new file mode 100644
index 0000000000000000000000000000000000000000..496180c44746f3f265dbd03b606064e07998a58f
GIT binary patch
literal 5872
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
O9hK$PVKuVm;r|0<r2;qr

literal 0
HcmV?d00001

diff --git a/libjava/java/awt/geom/doc-files/QuadCurve2D-3.png b/libjava/java/awt/geom/doc-files/QuadCurve2D-3.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7557ba7bafd1b658aedf94074fb6307083c1c1f
GIT binary patch
literal 12334
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%0AfN?-^LZwH(tb%_fM2
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
Fe*m<6wJQJs

literal 0
HcmV?d00001

-- 
GitLab