- /*
- * @(#)Rectangle.java 1.70 04/05/18
- *
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
- package java.awt;
-
- import java.awt.geom.Rectangle2D;
-
- /**
- * A <code>Rectangle</code> specifies an area in a coordinate space that is
- * enclosed by the <code>Rectangle</code> object's top-left point
- * (<i>x</i>, <i>y</i>)
- * in the coordinate space, its width, and its height.
- * <p>
- * A <code>Rectangle</code> object's <code>width</code> and
- * <code>height</code> are <code>public</code> fields. The constructors
- * that create a <code>Rectangle</code>, and the methods that can modify
- * one, do not prevent setting a negative value for width or height.
- * <p>
- * A <code>Rectangle</code> whose width or height is negative is considered
- * empty. If the <code>Rectangle</code> is empty, then the
- * <code>isEmpty</code> method returns <code>true</code>. No point can be
- * contained by or inside an empty <code>Rectangle</code>. The
- * values of <code>width</code> and <code>height</code>, however, are still
- * valid. An empty <code>Rectangle</code> still has a location in the
- * coordinate space, and methods that change its size or location remain
- * valid. The behavior of methods that operate on more than one
- * <code>Rectangle</code> is undefined if any of the participating
- * <code>Rectangle</code> objects has a negative
- * <code>width</code> or <code>height</code>. These methods include
- * <code>intersects</code>, <code>intersection</code>, and
- * <code>union</code>.
- *
- * @version 1.70, 05/18/04
- * @author Sami Shaio
- * @since JDK1.0
- */
- public class Rectangle extends Rectangle2D
- implements Shape, java.io.Serializable
- {
-
- /**
- * The <i>x</i> coordinate of the <code>Rectangle</code>.
- *
- * @serial
- * @see #setLocation(int, int)
- * @see #getLocation()
- */
- public int x;
-
- /**
- * The <i>y</i> coordinate of the <code>Rectangle</code>.
- *
- * @serial
- * @see #setLocation(int, int)
- * @see #getLocation()
- */
- public int y;
-
- /**
- * The width of the <code>Rectangle</code>.
- * @serial
- * @see #setSize(int, int)
- * @see #getSize()
- * @since JDK1.0.
- */
- public int width;
-
- /**
- * The height of the <code>Rectangle</code>.
- *
- * @serial
- * @see #setSize(int, int)
- * @see #getSize()
- */
- public int height;
-
- /*
- * JDK 1.1 serialVersionUID
- */
- private static final long serialVersionUID = -4345857070255674764L;
-
- /**
- * Initialize JNI field and method IDs
- */
- private static native void initIDs();
-
- static {
- /* ensure that the necessary native libraries are loaded */
- Toolkit.loadLibraries();
- if (!GraphicsEnvironment.isHeadless()) {
- initIDs();
- }
- }
-
- /**
- * Constructs a new <code>Rectangle</code> whose top-left corner
- * is at (0, 0) in the coordinate space, and whose width and
- * height are both zero.
- */
- public Rectangle() {
- this(0, 0, 0, 0);
- }
-
- /**
- * Constructs a new <code>Rectangle</code>, initialized to match
- * the values of the specified <code>Rectangle</code>.
- * @param r the <code>Rectangle</code> from which to copy initial values
- * to a newly constructed <code>Rectangle</code>
- * @since JDK1.1
- */
- public Rectangle(Rectangle r) {
- this(r.x, r.y, r.width, r.height);
- }
-
- /**
- * Constructs a new <code>Rectangle</code> whose top-left corner is
- * specified as
- * (<code>x</code>, <code>y</code>) and whose width and height
- * are specified by the arguments of the same name.
- * @param x the specified x coordinate
- * @param y the specified y coordinate
- * @param width the width of the <code>Rectangle</code>
- * @param height the height of the <code>Rectangle</code>
- */
- public Rectangle(int x, int y, int width, int height) {
- this.x = x;
- this.y = y;
- this.width = width;
- this.height = height;
- }
-
- /**
- * Constructs a new <code>Rectangle</code> whose top-left corner
- * is at (0, 0) in the coordinate space, and whose width and
- * height are specified by the arguments of the same name.
- * @param width the width of the <code>Rectangle</code>
- * @param height the height of the <code>Rectangle</code>
- */
- public Rectangle(int width, int height) {
- this(0, 0, width, height);
- }
-
- /**
- * Constructs a new <code>Rectangle</code> whose top-left corner is
- * specified by the {@link Point} argument, and
- * whose width and height are specified by the
- * {@link Dimension} argument.
- * @param p a <code>Point</code> that is the top-left corner of
- * the <code>Rectangle</code>
- * @param d a <code>Dimension</code>, representing the
- * width and height of the <code>Rectangle</code>
- */
- public Rectangle(Point p, Dimension d) {
- this(p.x, p.y, d.width, d.height);
- }
-
- /**
- * Constructs a new <code>Rectangle</code> whose top-left corner is the
- * specified <code>Point</code>, and whose width and height are both zero.
- * @param p a <code>Point</code> that is the top left corner
- * of the <code>Rectangle</code>
- */
- public Rectangle(Point p) {
- this(p.x, p.y, 0, 0);
- }
-
- /**
- * Constructs a new <code>Rectangle</code> whose top left corner is
- * (0, 0) and whose width and height are specified
- * by the <code>Dimension</code> argument.
- * @param d a <code>Dimension</code>, specifying width and height
- */
- public Rectangle(Dimension d) {
- this(0, 0, d.width, d.height);
- }
-
- /**
- * Returns the X coordinate of the bounding <code>Rectangle</code> in
- * <code>double</code> precision.
- * @return the x coordinate of the bounding <code>Rectangle</code>.
- */
- public double getX() {
- return x;
- }
-
- /**
- * Returns the Y coordinate of the bounding <code>Rectangle</code> in
- * <code>double</code> precision.
- * @return the y coordinate of the bounding <code>Rectangle</code>.
- */
- public double getY() {
- return y;
- }
-
- /**
- * Returns the width of the bounding <code>Rectangle</code> in
- * <code>double</code> precision.
- * @return the width of the bounding <code>Rectangle</code>.
- */
- public double getWidth() {
- return width;
- }
-
- /**
- * Returns the height of the bounding <code>Rectangle</code> in
- * <code>double</code> precision.
- * @return the height of the bounding <code>Rectangle</code>.
- */
- public double getHeight() {
- return height;
- }
-
- /**
- * Gets the bounding <code>Rectangle</code> of this <code>Rectangle</code>.
- * <p>
- * This method is included for completeness, to parallel the
- * <code>getBounds</code> method of
- * {@link Component}.
- * @return a new <code>Rectangle</code>, equal to the
- * bounding <code>Rectangle</code> for this <code>Rectangle</code>.
- * @see java.awt.Component#getBounds
- * @see #setBounds(Rectangle)
- * @see #setBounds(int, int, int, int)
- * @since JDK1.1
- */
- public Rectangle getBounds() {
- return new Rectangle(x, y, width, height);
- }
-
- /**
- * Return the high precision bounding box of this rectangle.
- * @since 1.2
- */
- public Rectangle2D getBounds2D() {
- return new Rectangle(x, y, width, height);
- }
-
- /**
- * Sets the bounding <code>Rectangle</code> of this <code>Rectangle</code>
- * to match the specified <code>Rectangle</code>.
- * <p>
- * This method is included for completeness, to parallel the
- * <code>setBounds</code> method of <code>Component</code>.
- * @param r the specified <code>Rectangle</code>
- * @see #getBounds
- * @see java.awt.Component#setBounds(java.awt.Rectangle)
- * @since JDK1.1
- */
- public void setBounds(Rectangle r) {
- setBounds(r.x, r.y, r.width, r.height);
- }
-
- /**
- * Sets the bounding <code>Rectangle</code> of this
- * <code>Rectangle</code> to the specified
- * <code>x</code>, <code>y</code>, <code>width</code>,
- * and <code>height</code>.
- * <p>
- * This method is included for completeness, to parallel the
- * <code>setBounds</code> method of <code>Component</code>.
- * @param x the new x coordinate for the top-left
- * corner of this <code>Rectangle</code>
- * @param y the new y coordinate for the top-left
- * corner of this <code>Rectangle</code>
- * @param width the new width for this <code>Rectangle</code>
- * @param height the new height for this <code>Rectangle</code>
- * @see #getBounds
- * @see java.awt.Component#setBounds(int, int, int, int)
- * @since JDK1.1
- */
- public void setBounds(int x, int y, int width, int height) {
- reshape(x, y, width, height);
- }
-
- /**
- * Sets the bounds of this <code>Rectangle</code> to the specified
- * <code>x</code>, <code>y</code>, <code>width</code>,
- * and <code>height</code>.
- * This method is included for completeness, to parallel the
- * <code>setBounds</code> method of <code>Component</code>.
- * @param x the x coordinate of the upper-left corner of
- * the specified rectangle
- * @param y the y coordinate of the upper-left corner of
- * the specified rectangle
- * @param width the new width for the <code>Dimension</code> object
- * @param height the new height for the <code>Dimension</code> object
- */
- public void setRect(double x, double y, double width, double height) {
- int x0 = (int) Math.floor(x);
- int y0 = (int) Math.floor(y);
- int x1 = (int) Math.ceil(x+width);
- int y1 = (int) Math.ceil(y+height);
- setBounds(x0, y0, x1-x0, y1-y0);
- }
-
- /**
- * Sets the bounding <code>Rectangle</code> of this
- * <code>Rectangle</code> to the specified
- * <code>x</code>, <code>y</code>, <code>width</code>,
- * and <code>height</code>.
- * <p>
- * @param x the new x coordinate for the top-left
- * corner of this <code>Rectangle</code>
- * @param y the new y coordinate for the top-left
- * corner of this <code>Rectangle</code>
- * @param width the new width for this <code>Rectangle</code>
- * @param height the new height for this <code>Rectangle</code>
- * @deprecated As of JDK version 1.1,
- * replaced by <code>setBounds(int, int, int, int)</code>.
- */
- @Deprecated
- public void reshape(int x, int y, int width, int height) {
- this.x = x;
- this.y = y;
- this.width = width;
- this.height = height;
- }
-
- /**
- * Returns the location of this <code>Rectangle</code>.
- * <p>
- * This method is included for completeness, to parallel the
- * <code>getLocation</code> method of <code>Component</code>.
- * @return the <code>Point</code> that is the top-left corner of
- * this <code>Rectangle</code>.
- * @see java.awt.Component#getLocation
- * @see #setLocation(Point)
- * @see #setLocation(int, int)
- * @since JDK1.1
- */
- public Point getLocation() {
- return new Point(x, y);
- }
-
- /**
- * Moves this <code>Rectangle</code> to the specified location.
- * <p>
- * This method is included for completeness, to parallel the
- * <code>setLocation</code> method of <code>Component</code>.
- * @param p the <code>Point</code> specifying the new location
- * for this <code>Rectangle</code>
- * @see java.awt.Component#setLocation(java.awt.Point)
- * @see #getLocation
- * @since JDK1.1
- */
- public void setLocation(Point p) {
- setLocation(p.x, p.y);
- }
-
- /**
- * Moves this <code>Rectangle</code> to the specified location.
- * <p>
- * This method is included for completeness, to parallel the
- * <code>setLocation</code> method of <code>Component</code>.
- * @param x the x coordinate of the new location
- * @param y the y coordinate of the new location
- * @see #getLocation
- * @see java.awt.Component#setLocation(int, int)
- * @since JDK1.1
- */
- public void setLocation(int x, int y) {
- move(x, y);
- }
-
- /**
- * Moves this <code>Rectangle</code> to the specified location.
- * <p>
- * @param x the x coordinate of the new location
- * @param y the y coordinate of the new location
- * @deprecated As of JDK version 1.1,
- * replaced by <code>setLocation(int, int)</code>.
- */
- @Deprecated
- public void move(int x, int y) {
- this.x = x;
- this.y = y;
- }
-
- /**
- * Translates this <code>Rectangle</code> the indicated distance,
- * to the right along the x coordinate axis, and
- * downward along the y coordinate axis.
- * @param x the distance to move this <code>Rectangle</code>
- * along the x axis
- * @param y the distance to move this <code>Rectangle</code>
- * along the y axis
- * @see java.awt.Rectangle#setLocation(int, int)
- * @see java.awt.Rectangle#setLocation(java.awt.Point)
- */
- public void translate(int x, int y) {
- this.x += x;
- this.y += y;
- }
-
- /**
- * Gets the size of this <code>Rectangle</code>, represented by
- * the returned <code>Dimension</code>.
- * <p>
- * This method is included for completeness, to parallel the
- * <code>getSize</code> method of <code>Component</code>.
- * @return a <code>Dimension</code>, representing the size of
- * this <code>Rectangle</code>.
- * @see java.awt.Component#getSize
- * @see #setSize(Dimension)
- * @see #setSize(int, int)
- * @since JDK1.1
- */
- public Dimension getSize() {
- return new Dimension(width, height);
- }
-
- /**
- * Sets the size of this <code>Rectangle</code> to match the
- * specified <code>Dimension</code>.
- * <p>
- * This method is included for completeness, to parallel the
- * <code>setSize</code> method of <code>Component</code>.
- * @param d the new size for the <code>Dimension</code> object
- * @see java.awt.Component#setSize(java.awt.Dimension)
- * @see #getSize
- * @since JDK1.1
- */
- public void setSize(Dimension d) {
- setSize(d.width, d.height);
- }
-
- /**
- * Sets the size of this <code>Rectangle</code> to the specified
- * width and height.
- * <p>
- * This method is included for completeness, to parallel the
- * <code>setSize</code> method of <code>Component</code>.
- * @param width the new width for this <code>Rectangle</code>
- * @param height the new height for this <code>Rectangle</code>
- * @see java.awt.Component#setSize(int, int)
- * @see #getSize
- * @since JDK1.1
- */
- public void setSize(int width, int height) {
- resize(width, height);
- }
-
- /**
- * Sets the size of this <code>Rectangle</code> to the specified
- * width and height.
- * <p>
- * @param width the new width for this <code>Rectangle</code>
- * @param height the new height for this <code>Rectangle</code>
- * @deprecated As of JDK version 1.1,
- * replaced by <code>setSize(int, int)</code>.
- */
- @Deprecated
- public void resize(int width, int height) {
- this.width = width;
- this.height = height;
- }
-
- /**
- * Checks whether or not this <code>Rectangle</code> contains the
- * specified <code>Point</code>.
- * @param p the <code>Point</code> to test
- * @return <code>true</code> if the <code>Point</code>
- * (<i>x</i>, <i>y</i>) is inside this
- * <code>Rectangle</code>
- * <code>false</code> otherwise.
- * @since JDK1.1
- */
- public boolean contains(Point p) {
- return contains(p.x, p.y);
- }
-
- /**
- * Checks whether or not this <code>Rectangle</code> contains the
- * point at the specified location
- * (<i>x</i>, <i>y</i>).
- * @param x the specified x coordinate
- * @param y the specified y coordinate
- * @return <code>true</code> if the point
- * (<i>x</i>, <i>y</i>) is inside this
- * <code>Rectangle</code>
- * <code>false</code> otherwise.
- * @since JDK1.1
- */
- public boolean contains(int x, int y) {
- return inside(x, y);
- }
-
- /**
- * Checks whether or not this <code>Rectangle</code> entirely contains
- * the specified <code>Rectangle</code>.
- *
- * @param r the specified <code>Rectangle</code>
- * @return <code>true</code> if the <code>Rectangle</code>
- * is contained entirely inside this <code>Rectangle</code>
- * <code>false</code> otherwise
- * @since JDK1.2
- */
- public boolean contains(Rectangle r) {
- return contains(r.x, r.y, r.width, r.height);
- }
-
- /**
- * Checks whether this <code>Rectangle</code> entirely contains
- * the <code>Rectangle</code>
- * at the specified location (<i>X</i>, <i>Y</i>) with the
- * specified dimensions (<i>W</i>, <i>H</i>).
- * @param X the specified x coordinate
- * @param Y the specified y coordinate
- * @param W the width of the <code>Rectangle</code>
- * @param H the height of the <code>Rectangle</code>
- * @return <code>true</code> if the <code>Rectangle</code> specified by
- * (<i>X</i>, <i>Y</i>, <i>W</i>, <i>H</i>)
- * is entirely enclosed inside this <code>Rectangle</code>
- * <code>false</code> otherwise.
- * @since JDK1.1
- */
- public boolean contains(int X, int Y, int W, int H) {
- int w = this.width;
- int h = this.height;
- if ((w | h | W | H) < 0) {
- // At least one of the dimensions is negative...
- return false;
- }
- // Note: if any dimension is zero, tests below must return false...
- int x = this.x;
- int y = this.y;
- if (X < x || Y < y) {
- return false;
- }
- w += x;
- W += X;
- if (W <= X) {
- // X+W overflowed or W was zero, return false if...
- // either original w or W was zero or
- // x+w did not overflow or
- // the overflowed x+w is smaller than the overflowed X+W
- if (w >= x || W > w) return false;
- } else {
- // X+W did not overflow and W was not zero, return false if...
- // original w was zero or
- // x+w did not overflow and x+w is smaller than X+W
- if (w >= x && W > w) return false;
- }
- h += y;
- H += Y;
- if (H <= Y) {
- if (h >= y || H > h) return false;
- } else {
- if (h >= y && H > h) return false;
- }
- return true;
- }
-
- /**
- * Checks whether or not this <code>Rectangle</code> contains the
- * point at the specified location
- * (<i>X</i>, <i>Y</i>).
- * @param X the specified x coordinate
- * @param Y the specified y coordinate
- * @return <code>true</code> if the point
- * (<i>X</i>, <i>Y</i>) is inside this
- * <code>Rectangle</code>
- * <code>false</code> otherwise.
- * @deprecated As of JDK version 1.1,
- * replaced by <code>contains(int, int)</code>.
- */
- @Deprecated
- public boolean inside(int X, int Y) {
- int w = this.width;
- int h = this.height;
- if ((w | h) < 0) {
- // At least one of the dimensions is negative...
- return false;
- }
- // Note: if either dimension is zero, tests below must return false...
- int x = this.x;
- int y = this.y;
- if (X < x || Y < y) {
- return false;
- }
- w += x;
- h += y;
- // overflow || intersect
- return ((w < x || w > X) &&
- (h < y || h > Y));
- }
-
- /**
- * Determines whether or not this <code>Rectangle</code> and the specified
- * <code>Rectangle</code> intersect. Two rectangles intersect if
- * their intersection is nonempty.
- *
- * @param r the specified <code>Rectangle</code>
- * @return <code>true</code> if the specified <code>Rectangle</code>
- * and this <code>Rectangle</code> intersect;
- * <code>false</code> otherwise.
- */
- public boolean intersects(Rectangle r) {
- int tw = this.width;
- int th = this.height;
- int rw = r.width;
- int rh = r.height;
- if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
- return false;
- }
- int tx = this.x;
- int ty = this.y;
- int rx = r.x;
- int ry = r.y;
- rw += rx;
- rh += ry;
- tw += tx;
- th += ty;
- // overflow || intersect
- return ((rw < rx || rw > tx) &&
- (rh < ry || rh > ty) &&
- (tw < tx || tw > rx) &&
- (th < ty || th > ry));
- }
-
- /**
- * Computes the intersection of this <code>Rectangle</code> with the
- * specified <code>Rectangle</code>. Returns a new <code>Rectangle</code>
- * that represents the intersection of the two rectangles.
- * If the two rectangles do not intersect, the result will be
- * an empty rectangle.
- *
- * @param r the specified <code>Rectangle</code>
- * @return the largest <code>Rectangle</code> contained in both the
- * specified <code>Rectangle</code> and in
- * this <code>Rectangle</code> or if the rectangles
- * do not intersect, an empty rectangle.
- */
- public Rectangle intersection(Rectangle r) {
- int tx1 = this.x;
- int ty1 = this.y;
- int rx1 = r.x;
- int ry1 = r.y;
- long tx2 = tx1; tx2 += this.width;
- long ty2 = ty1; ty2 += this.height;
- long rx2 = rx1; rx2 += r.width;
- long ry2 = ry1; ry2 += r.height;
- if (tx1 < rx1) tx1 = rx1;
- if (ty1 < ry1) ty1 = ry1;
- if (tx2 > rx2) tx2 = rx2;
- if (ty2 > ry2) ty2 = ry2;
- tx2 -= tx1;
- ty2 -= ty1;
- // tx2,ty2 will never overflow (they will never be
- // larger than the smallest of the two source w,h)
- // they might underflow, though...
- if (tx2 < Integer.MIN_VALUE) tx2 = Integer.MIN_VALUE;
- if (ty2 < Integer.MIN_VALUE) ty2 = Integer.MIN_VALUE;
- return new Rectangle(tx1, ty1, (int) tx2, (int) ty2);
- }
-
- /**
- * Computes the union of this <code>Rectangle</code> with the
- * specified <code>Rectangle</code>. Returns a new
- * <code>Rectangle</code> that
- * represents the union of the two rectangles
- * @param r the specified <code>Rectangle</code>
- * @return the smallest <code>Rectangle</code> containing both
- * the specified <code>Rectangle</code> and this
- * <code>Rectangle</code>.
- */
- public Rectangle union(Rectangle r) {
- int x1 = Math.min(x, r.x);
- int x2 = Math.max(x + width, r.x + r.width);
- int y1 = Math.min(y, r.y);
- int y2 = Math.max(y + height, r.y + r.height);
- return new Rectangle(x1, y1, x2 - x1, y2 - y1);
- }
-
- /**
- * Adds a point, specified by the integer arguments <code>newx</code>
- * and <code>newy</code>, to this <code>Rectangle</code>. The
- * resulting <code>Rectangle</code> is
- * the smallest <code>Rectangle</code> that contains both the
- * original <code>Rectangle</code> and the specified point.
- * <p>
- * After adding a point, a call to <code>contains</code> with the
- * added point as an argument does not necessarily return
- * <code>true</code>. The <code>contains</code> method does not
- * return <code>true</code> for points on the right or bottom
- * edges of a <code>Rectangle</code>. Therefore, if the added point
- * falls on the right or bottom edge of the enlarged
- * <code>Rectangle</code>, <code>contains</code> returns
- * <code>false</code> for that point.
- * @param newx the x coordinate of the new point
- * @param newy the y coordinate of the new point
- */
- public void add(int newx, int newy) {
- int x1 = Math.min(x, newx);
- int x2 = Math.max(x + width, newx);
- int y1 = Math.min(y, newy);
- int y2 = Math.max(y + height, newy);
- x = x1;
- y = y1;
- width = x2 - x1;
- height = y2 - y1;
- }
-
- /**
- * Adds the specified <code>Point</code> to this
- * <code>Rectangle</code>. The resulting <code>Rectangle</code>
- * is the smallest <code>Rectangle</code> that contains both the
- * original <code>Rectangle</code> and the specified
- * <code>Point</code>.
- * <p>
- * After adding a <code>Point</code>, a call to <code>contains</code>
- * with the added <code>Point</code> as an argument does not
- * necessarily return <code>true</code>. The <code>contains</code>
- * method does not return <code>true</code> for points on the right
- * or bottom edges of a <code>Rectangle</code>. Therefore if the added
- * <code>Point</code> falls on the right or bottom edge of the
- * enlarged <code>Rectangle</code>, <code>contains</code> returns
- * <code>false</code> for that <code>Point</code>.
- * @param pt the new <code>Point</code> to add to this
- * <code>Rectangle</code>
- */
- public void add(Point pt) {
- add(pt.x, pt.y);
- }
-
- /**
- * Adds a <code>Rectangle</code> to this <code>Rectangle</code>.
- * The resulting <code>Rectangle</code> is the union of the two
- * rectangles.
- * @param r the specified <code>Rectangle</code>
- */
- public void add(Rectangle r) {
- int x1 = Math.min(x, r.x);
- int x2 = Math.max(x + width, r.x + r.width);
- int y1 = Math.min(y, r.y);
- int y2 = Math.max(y + height, r.y + r.height);
- x = x1;
- y = y1;
- width = x2 - x1;
- height = y2 - y1;
- }
-
- /**
- * Resizes the <code>Rectangle</code> both horizontally and vertically.
- * <p>
- * This method modifies the <code>Rectangle</code> so that it is
- * <code>h</code> units larger on both the left and right side,
- * and <code>v</code> units larger at both the top and bottom.
- * <p>
- * The new <code>Rectangle</code> has (<code>x - h</code>,
- * <code>y - v</code>) as its top-left corner, a
- * width of
- * <code>width</code> <code>+</code> <code>2h</code>,
- * and a height of
- * <code>height</code> <code>+</code> <code>2v</code>.
- * <p>
- * If negative values are supplied for <code>h</code> and
- * <code>v</code>, the size of the <code>Rectangle</code>
- * decreases accordingly.
- * The <code>grow</code> method does not check whether the resulting
- * values of <code>width</code> and <code>height</code> are
- * non-negative.
- * @param h the horizontal expansion
- * @param v the vertical expansion
- */
- public void grow(int h, int v) {
- x -= h;
- y -= v;
- width += h * 2;
- height += v * 2;
- }
-
- /**
- * Determines whether or not this <code>Rectangle</code> is empty. A
- * <code>Rectangle</code> is empty if its width or its height is less
- * than or equal to zero.
- * @return <code>true</code> if this <code>Rectangle</code> is empty;
- * <code>false</code> otherwise.
- */
- public boolean isEmpty() {
- return (width <= 0) || (height <= 0);
- }
-
- /**
- * Determines where the specified coordinates lie with respect
- * to this <code>Rectangle</code>.
- * This method computes a binary OR of the appropriate mask values
- * indicating, for each side of this <code>Rectangle</code>,
- * whether or not the specified coordinates are on the same side of the
- * edge as the rest of this <code>Rectangle</code>.
- * @param x the specified x coordinate
- * @param y the specified y coordinate
- * @return the logical OR of all appropriate out codes.
- * @see #OUT_LEFT
- * @see #OUT_TOP
- * @see #OUT_RIGHT
- * @see #OUT_BOTTOM
- * @since 1.2
- */
- public int outcode(double x, double y) {
- /*
- * Note on casts to double below. If the arithmetic of
- * x+w or y+h is done in int, then we may get integer
- * overflow. By converting to double before the addition
- * we force the addition to be carried out in double to
- * avoid overflow in the comparison.
- *
- * See bug 4320890 for problems that this can cause.
- */
- int out = 0;
- if (this.width <= 0) {
- out |= OUT_LEFT | OUT_RIGHT;
- } else if (x < this.x) {
- out |= OUT_LEFT;
- } else if (x > this.x + (double) this.width) {
- out |= OUT_RIGHT;
- }
- if (this.height <= 0) {
- out |= OUT_TOP | OUT_BOTTOM;
- } else if (y < this.y) {
- out |= OUT_TOP;
- } else if (y > this.y + (double) this.height) {
- out |= OUT_BOTTOM;
- }
- return out;
- }
-
- /**
- * Returns a new {@link Rectangle2D} object
- * representing the intersection of this <code>Rectangle</code> with the
- * specified <code>Rectangle2D</code>.
- * @param r the <code>Rectangle2D</code> to be intersected
- * with this <code>Rectangle</code>
- * @return the largest <code>Rectangle2D</code> contained in both the
- * specified <code>Rectangle2D</code> and in
- * this <code>Rectangle</code>.
- * @since 1.2
- */
- public Rectangle2D createIntersection(Rectangle2D r) {
- if (r instanceof Rectangle) {
- return intersection((Rectangle) r);
- }
- Rectangle2D dest = new Rectangle2D.Double();
- Rectangle2D.intersect(this, r, dest);
- return dest;
- }
-
- /**
- * Returns a new <code>Rectangle2D</code> object representing the
- * union of this <code>Rectangle</code> with the specified
- * <code>Rectangle2D</code>.
- * @param r the <code>Rectangle2D</code> to be combined with
- * this <code>Rectangle</code>
- * @return the smallest <code>Rectangle2D</code> containing
- * both the specified <code>Rectangle2D</code> and this
- * <code>Rectangle</code>.
- * @since 1.2
- */
- public Rectangle2D createUnion(Rectangle2D r) {
- if (r instanceof Rectangle) {
- return union((Rectangle) r);
- }
- Rectangle2D dest = new Rectangle2D.Double();
- Rectangle2D.union(this, r, dest);
- return dest;
- }
-
- /**
- * Checks whether two rectangles are equal.
- * <p>
- * The result is <code>true</code> if and only if the argument is not
- * <code>null</code> and is a <code>Rectangle</code> object that has the
- * same top-left corner, width, and height as this <code>Rectangle</code>.
- * @param obj the <code>Object</code> to compare with
- * this <code>Rectangle</code>
- * @return <code>true</code> if the objects are equal;
- * <code>false</code> otherwise.
- */
- public boolean equals(Object obj) {
- if (obj instanceof Rectangle) {
- Rectangle r = (Rectangle)obj;
- return ((x == r.x) &&
- (y == r.y) &&
- (width == r.width) &&
- (height == r.height));
- }
- return super.equals(obj);
- }
-
- /**
- * Returns a <code>String</code> representing this
- * <code>Rectangle</code> and its values.
- * @return a <code>String</code> representing this
- * <code>Rectangle</code> object's coordinate and size values.
- */
- public String toString() {
- return getClass().getName() + "[x=" + x + ",y=" + y + ",width=" + width + ",height=" + height + "]";
- }
- }