diff options
author | Tom Tromey <tromey@cygnus.com> | 2000-07-23 00:24:14 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2000-07-23 00:24:14 +0000 |
commit | 8039a4ea734415951af932bb5dc93a9cbc5f13dc (patch) | |
tree | 015eb01267de18f0f0507f24597797582f311e45 /libjava/java/awt/geom/Rectangle2D.java | |
parent | 4eb00163ad2a600403a9b36fdc7a47fd79ce98e6 (diff) | |
download | gcc-8039a4ea734415951af932bb5dc93a9cbc5f13dc.zip gcc-8039a4ea734415951af932bb5dc93a9cbc5f13dc.tar.gz gcc-8039a4ea734415951af932bb5dc93a9cbc5f13dc.tar.bz2 |
Makefile.in: Rebuilt.
* Makefile.in: Rebuilt.
* Makefile.am (awt_java_source_files): Updated for new files.
* java/awt/Adjustable.java (HORIZONTAL, VERTICAL): Set values.
* java/awt/Label.java: New file.
* java/awt/Rectangle.java (Rectangle): Extend Rectangle2D.
(createIntersection, createUnion, getBounds2D): New methods.
* java/awt/Scrollbar.java: New file.
* java/awt/Shape.java: Updated to 1.2.
* java/awt/geom/AffineTransform.java: New file.
* java/awt/geom/Ellipse2D.java: New file.
* java/awt/geom/NoninvertibleTransformException.java: New file.
* java/awt/geom/PathIterator.java: New file.
* java/awt/geom/Rectangle2D.java: New file.
* java/awt/geom/RectangularShape.java: New file.
* java/awt/geom/Point2D.java (Double, Float): New inner classes.
* java/awt/geom/IllegalPathStateException.java: New file.
From-SVN: r35195
Diffstat (limited to 'libjava/java/awt/geom/Rectangle2D.java')
-rw-r--r-- | libjava/java/awt/geom/Rectangle2D.java | 428 |
1 files changed, 428 insertions, 0 deletions
diff --git a/libjava/java/awt/geom/Rectangle2D.java b/libjava/java/awt/geom/Rectangle2D.java new file mode 100644 index 0000000..16ab826 --- /dev/null +++ b/libjava/java/awt/geom/Rectangle2D.java @@ -0,0 +1,428 @@ +/* Copyright (C) 2000 Free Software Foundation + + This file is part of libjava. + +This software is copyrighted work licensed under the terms of the +Libjava License. Please consult the file "LIBJAVA_LICENSE" for +details. */ + +package java.awt.geom; + +/** + * @author Tom Tromey <tromey@cygnus.com> + * @date April 16, 2000 + */ + +public abstract class Rectangle2D extends RectangularShape +{ + public static final int OUT_LEFT = 1; + public static final int OUT_TOP = 2; + public static final int OUT_RIGHT = 4; + public static final int OUT_BOTTOM = 8; + + protected Rectangle2D () + { + } + + /** Set the bounding box of this rectangle. + * @param x X coordinate + * @param y Y coordinate + * @param w Width + * @param h Height + */ + public abstract void setRect (double x, double y, double w, double h); + + /** Set the bounding box of this rectangle. + * @param r Bounding rectangle. + */ + public void setRect (Rectangle2D r) + { + setRect (r.getX (), r.getY (), r.getWidth (), r.getHeight ()); + } + + /** Returns true if line segment intersects interior of this + * rectangle. + * @param x1 X coordinate of first end of line segment + * @param y1 Y coordinate of first end of line segment + * @param x2 X coordinate of second end of line segment + * @param y1 Y coordinate of segment end of line segment + */ + public boolean intersectsLine (double x1, double y1, double x2, double y2) + { + int o1 = outcode (x1, y1); + int o2 = outcode (x2, y2); + + double mx = getX (); + double my = getY (); + double mx2 = getWidth (); + double my2 = getHeight (); + x1 -= mx; + x2 -= mx; + y1 -= my; + y2 -= my; + + // Here we handle all lines that stay entirely on one side of the + // rectangle. We also handle some lines that intersect the + // rectangle. All vertical and horizontal lines are handled here. + int xor = o1 ^ o2; + int or = o1 | o2; + if ((xor & (OUT_BOTTOM | OUT_TOP)) == 0) + { + if ((or & (OUT_BOTTOM | OUT_TOP)) != 0) + return false; + return ((o1 & (OUT_LEFT | OUT_RIGHT)) != 0 + || (o2 & (OUT_LEFT | OUT_RIGHT)) != 0); + } + else if ((xor & (OUT_LEFT | OUT_RIGHT)) == 0) + { + if ((or & (OUT_LEFT | OUT_RIGHT)) != 0) + return false; + return ((o1 & (OUT_BOTTOM | OUT_TOP)) != 0 + || (o2 & (OUT_BOTTOM | OUT_TOP)) != 0); + } + + double dx = x2 - x1; + double dy = y2 - y1; + + double t1l = - x1 / dx; + double t1h = (mx2 - x1) / dx; + + if (t1l >= t1h) + return false; + double t2l = - y1 / dy; + double t2h = (my2 - y1) / dy; + + if (t2l >= t2h || t2l >= t1h || t2h < t1l) + return false; + return true; + } + + /** Return true if line segment intersects interior of this + * rectangle. + * @param l The line segment + */ +// public boolean intersectsLine (Line2D l) +// { +// } + + public abstract int outcode (double x, double y); + + public int outcode (Point2D p) + { + return outcode (p.getX (), p.getY ()); + } + + /** Set bounding frame for this rectangle. + * @param x X coordinate + * @param y Y coordinate + * @param w Width + * @param h Height + */ + public void setFrame (double x, double y, double w, double h) + { + setRect (x, y, w, h); + } + + public Rectangle2D getBounds2D () + { + // FIXME. + return (Rectangle2D) clone (); + } + + public boolean contains (double x, double y) + { + double mx = getX (); + double mw = getWidth (); + if (x < mx || x >= mx + mw) + return false; + double my = getY (); + double mh = getHeight (); + return y >= my && y < my + mh; + } + + public boolean intersects (double x, double y, double w, double h) + { + double mx = getX (); + double mw = getWidth (); + if (x < mx || x >= mx + mw || x + w < mx || x + w >= mx + mw) + return false; + double my = getY (); + double mh = getHeight (); + return y >= my && y < my + mh && y + h >= my && y + h < my + mh; + } + + public boolean contains (double x, double y, double w, double h) + { + return contains (x, y) && contains (x + w, y + h); + } + + public abstract Rectangle2D createIntersection (Rectangle2D r); + + public static void intersect (Rectangle2D src1, Rectangle2D src2, + Rectangle2D dest) + { + double x1l = src1.getMinX (); + double x2l = src2.getMinX (); + double nxl = Math.max (x1l, x2l); + double x1h = src1.getMaxX (); + double x2h = src2.getMaxX (); + double nxh = Math.min (x1h, x2h); + if (nxh < nxl) + nxh = nxl; + double y1l = src1.getMinY (); + double y2l = src2.getMinY (); + double nyl = Math.max (y1l, y2l); + double y1h = src1.getMaxY (); + double y2h = src2.getMaxY (); + double nyh = Math.min (y1h, y2h); + if (nyh < nyl) + nyh = nyl; + dest.setFrameFromDiagonal (nxl, nyl, nxh, nyh); + } + + public abstract Rectangle2D createUnion (Rectangle2D r); + + public static void union (Rectangle2D src1, Rectangle2D src2, + Rectangle2D dest) + { + double x1l = src1.getMinX (); + double x2l = src2.getMinX (); + double nxl = Math.max (x1l, x2l); + double x1h = src1.getMaxX (); + double x2h = src2.getMaxX (); + double nxh = Math.min (x1h, x2h); + double y1l = src1.getMinY (); + double y2l = src2.getMinY (); + double nyl = Math.max (y1l, y2l); + double y1h = src1.getMaxY (); + double y2h = src2.getMaxY (); + double nyh = Math.min (y1h, y2h); + dest.setFrameFromDiagonal (nxl, nyl, nxh, nyh); + } + + public void add (double newx, double newy) + { + double minx = Math.min (getMinX (), newx); + double maxx = Math.max (getMaxX (), newx); + double miny = Math.min (getMinY (), newy); + double maxy = Math.max (getMaxY (), newy); + setFrameFromDiagonal (minx, miny, maxx, maxy); + } + + public void add (Point2D p) + { + add (p.getX (), p.getY ()); + } + + public void add (Rectangle2D r) + { + add (r.getMinX (), r.getMinY ()); + add (r.getMaxX (), r.getMaxY ()); + } + + public PathIterator getPathIterator (AffineTransform at) + { + // We know the superclass just ignores the flatness parameter. + return getPathIterator (at, 0); + } + + public static class Double extends Rectangle2D + { + public double height; + public double width; + public double x; + public double y; + + public Double () + { + height = width = x = y = 0; + } + + public Double (double x, double y, double w, double h) + { + this.x = x; + this.y = y; + this.width = w; + this.height = h; + } + + public double getX () + { + return x; + } + + public double getY () + { + return y; + } + + public double getWidth () + { + return width; + } + + public double getHeight () + { + return height; + } + + public boolean isEmpty () + { + return width <= 0 || height <= 0; + } + + public void setRect (double x, double y, double w, double h) + { + this.x = x; + this.y = y; + this.width = w; + this.height = h; + } + + public void setRect (Rectangle2D r) + { + this.x = r.getX (); + this.y = r.getY (); + this.width = r.getWidth (); + this.height = r.getHeight (); + } + + public int outcode (double x, double y) + { + int code = 0; + if (x < this.x) + code |= OUT_LEFT; + else if (x >= this.x + this.width) + code |= OUT_RIGHT; + if (y < this.y) + code |= OUT_TOP; + else if (y >= this.y + this.height) + code |= OUT_BOTTOM; + return code; + } + + public Rectangle2D getBounds2D () + { + return new Rectangle2D.Double (x, y, width, height); + } + + public Rectangle2D createIntersection (Rectangle2D r) + { + Double res = new Double (); + intersect (this, r, res); + return res; + } + + public Rectangle2D createUnion (Rectangle2D r) + { + Double res = new Double (); + union (this, r, res); + return res; + } + + public String toString () + { + return "fixme"; + } + } + + public static class Float extends Rectangle2D + { + public float height; + public float width; + public float x; + public float y; + + public Float () + { + height = width = x = y = 0; + } + + public Float (float x, float y, float w, float h) + { + this.x = x; + this.y = y; + this.width = w; + this.height = h; + } + + public double getX () + { + return x; + } + + public double getY () + { + return y; + } + + public double getWidth () + { + return width; + } + + public double getHeight () + { + return height; + } + + public boolean isEmpty () + { + return width <= 0 || height <= 0; + } + + public void setRect (double x, double y, double w, double h) + { + this.x = (float) x; + this.y = (float) y; + this.width = (float) w; + this.height = (float) h; + } + + public void setRect (Rectangle2D r) + { + this.x = (float) r.getX (); + this.y = (float) r.getY (); + this.width = (float) r.getWidth (); + this.height = (float) r.getHeight (); + } + + public int outcode (double x, double y) + { + int code = 0; + if (x < this.x) + code |= OUT_LEFT; + else if (x >= this.x + this.width) + code |= OUT_RIGHT; + if (y < this.y) + code |= OUT_TOP; + else if (y >= this.y + this.height) + code |= OUT_BOTTOM; + return code; + } + + public Rectangle2D getBounds2D () + { + return new Rectangle2D.Float (x, y, width, height); + } + + public Rectangle2D createIntersection (Rectangle2D r) + { + Float res = new Float (); + intersect (this, r, res); + return res; + } + + public Rectangle2D createUnion (Rectangle2D r) + { + Float res = new Float (); + union (this, r, res); + return res; + } + + public String toString () + { + return "fixme"; + } + } +} |