From 7b1c54e78d5e8067e1f8177ba83a698cb794ebb0 Mon Sep 17 00:00:00 2001 From: tromey Date: Sun, 23 Jul 2000 00:24:14 +0000 Subject: * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@35195 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/java/awt/geom/RectangularShape.java | 293 ++++++++++++++++++++++++++++ 1 file changed, 293 insertions(+) create mode 100644 libjava/java/awt/geom/RectangularShape.java (limited to 'libjava/java/awt/geom/RectangularShape.java') diff --git a/libjava/java/awt/geom/RectangularShape.java b/libjava/java/awt/geom/RectangularShape.java new file mode 100644 index 00000000000..b581c63525b --- /dev/null +++ b/libjava/java/awt/geom/RectangularShape.java @@ -0,0 +1,293 @@ +/* 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; +import java.awt.*; +import java.awt.geom.Rectangle2D; + +/** + * @author Tom Tromey + * @date April 16, 2000 + */ + +public abstract class RectangularShape implements Shape, Cloneable +{ + protected RectangularShape () + { + } + + public abstract double getX (); + public abstract double getY (); + public abstract double getWidth (); + public abstract double getHeight (); + + public double getMinX () + { + return Math.min (getX (), getX () + getWidth ()); + } + + public double getMinY () + { + return Math.min (getY (), getY () + getHeight ()); + } + + public double getMaxX () + { + return Math.max (getX (), getX () + getWidth ()); + } + + public double getMaxY () + { + return Math.max (getY (), getY () + getHeight ()); + } + + public double getCenterX () + { + return getX () + getWidth () / 2; + } + + public double getCenterY () + { + return getY () + getHeight () / 2; + } + + public Rectangle2D getFrame () + { + return new Rectangle2D.Double (getX (), getY (), + getWidth (), getHeight ()); + } + + public abstract boolean isEmpty (); + public abstract void setFrame (double x, double y, double w, double h); + + public void setFrame (Point2D loc, Dimension2D size) + { + setFrame (loc.getX (), loc.getY (), size.getWidth (), size.getHeight ()); + } + + public void setFrame (Rectangle2D r) + { + setFrame (r.getX (), r.getY (), r.getWidth (), r.getHeight ()); + } + + public void setFrameFromDiagonal (double x1, double y1, + double x2, double y2) + { + if (x1 > x2) + { + double t = x2; + x2 = x1; + x1 = t; + } + if (y1 > y2) + { + double t = y2; + y2 = y1; + y1 = t; + } + setFrame (x1, y1, x2 - x1, y2 - y1); + } + + public void setFrameFromDiagonal (Point2D p1, Point2D p2) + { + setFrameFromDiagonal (p1.getX (), p1.getY (), + p2.getX (), p2.getY ()); + } + + public void setFrameFromCenter (double centerX, double centerY, + double cornerX, double cornerY) + { + double halfw = Math.abs (cornerX - centerX); + double halfh = Math.abs (cornerY - centerY); + setFrame (centerX - halfw, centerY - halfh, + 2 * halfw, 2 * halfh); + } + + public void setFrameFromCenter (Point2D center, Point2D corner) + { + setFrameFromCenter (center.getX (), center.getY (), + corner.getX (), corner.getY ()); + } + + public boolean contains (Point2D p) + { + double x = p.getX (); + double y = p.getY (); + double rx = getX (); + double ry = getY (); + double w = getWidth (); + double h = getHeight (); + return x >= rx && x < rx + w && y >= ry && y < ry + h; + } + + public boolean intersects (Rectangle2D r) + { + double x = getX (); + double w = getWidth (); + double mx = r.getX (); + double mw = r.getWidth (); + if (x < mx || x >= mx + mw || x + w < mx || x + w >= mx + mw) + return false; + double y = getY (); + double h = getHeight (); + double my = r.getY (); + double mh = r.getHeight (); + return y >= my && y < my + mh && y + h >= my && y + h < my + mh; + } + + private boolean containsPoint (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 contains (Rectangle2D r) + { + return (containsPoint (r.getMinX (), r.getMinY ()) + && containsPoint (r.getMaxX (), r.getMaxY ())); + } + + public Rectangle getBounds () + { + return new Rectangle ((int) getX (), (int) getY (), + (int) getWidth (), (int) getHeight ()); + } + + public PathIterator getPathIterator (AffineTransform at, double flatness) + { + // FIXME + // return new AffineTransform.Iterator (new Iterator ()); + return null; + } + + public Object clone () + { + return super.clone (); + } + + // This implements the PathIterator for all RectangularShape objects + // that don't override getPathIterator. + private class Iterator implements PathIterator + { + // Our current coordinate. + private int coord; + + private static final int START = 0; + private static final int END_PLUS_ONE = 5; + + public Iterator () + { + coord = START; + } + + public int currentSegment (double[] coords) + { + int r; + switch (coord) + { + case 0: + coords[0] = getX (); + coords[1] = getY (); + r = SEG_MOVETO; + break; + + case 1: + coords[0] = getX () + getWidth (); + coords[1] = getY (); + r = SEG_LINETO; + break; + + case 2: + coords[0] = getX () + getWidth (); + coords[1] = getY () + getHeight (); + r = SEG_LINETO; + break; + + case 3: + coords[0] = getX (); + coords[1] = getY () + getHeight (); + r = SEG_LINETO; + break; + + case 4: + r = SEG_CLOSE; + break; + + default: + // It isn't clear what to do if the caller calls us after + // isDone returns true. + r = SEG_CLOSE; + break; + } + + return r; + } + + public int currentSegment (float[] coords) + { + int r; + switch (coord) + { + case 0: + coords[0] = (float) getX (); + coords[1] = (float) getY (); + r = SEG_MOVETO; + break; + + case 1: + coords[0] = (float) (getX () + getWidth ()); + coords[1] = (float) getY (); + r = SEG_LINETO; + break; + + case 2: + coords[0] = (float) (getX () + getWidth ()); + coords[1] = (float) (getY () + getHeight ()); + r = SEG_LINETO; + break; + + case 3: + coords[0] = (float) getX (); + coords[1] = (float) (getY () + getHeight ()); + r = SEG_LINETO; + break; + + case 4: + default: + // It isn't clear what to do if the caller calls us after + // isDone returns true. We elect to keep returning + // SEG_CLOSE. + r = SEG_CLOSE; + break; + } + + return r; + } + + public int getWindingRule () + { + return WIND_NON_ZERO; + } + + public boolean isDone () + { + return coord == END_PLUS_ONE; + } + + public void next () + { + if (coord < END_PLUS_ONE) + ++coord; + } + } +} -- cgit v1.2.3