diff options
Diffstat (limited to 'awt/java/awt/geom/Area.java')
-rw-r--r-- | awt/java/awt/geom/Area.java | 330 |
1 files changed, 330 insertions, 0 deletions
diff --git a/awt/java/awt/geom/Area.java b/awt/java/awt/geom/Area.java new file mode 100644 index 0000000..e6619e3 --- /dev/null +++ b/awt/java/awt/geom/Area.java @@ -0,0 +1,330 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Denis M. Kishenko + * @version $Revision$ + */ + +package java.awt.geom; + +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.PathIterator; +import java.awt.geom.Rectangle2D; +import java.util.NoSuchElementException; + +import org.apache.harmony.awt.internal.nls.Messages; +import org.apache.harmony.luni.util.NotImplementedException; + +/** + * The Class Area provides a minimal implementation for a generic shape. + * + * @since Android 1.0 + */ +public class Area implements Shape, Cloneable { + + /** + * The source Shape object. + */ + Shape s; + + /** + * The Class NullIterator. + */ + private static class NullIterator implements PathIterator { + + /** + * Instantiates a new null iterator. + */ + NullIterator() { + } + + public int getWindingRule() { + return WIND_NON_ZERO; + } + + public boolean isDone() { + return true; + } + + public void next() { + // nothing + } + + public int currentSegment(double[] coords) { + // awt.4B=Iterator out of bounds + throw new NoSuchElementException(Messages.getString("awt.4B")); //$NON-NLS-1$ + } + + public int currentSegment(float[] coords) { + // awt.4B=Iterator out of bounds + throw new NoSuchElementException(Messages.getString("awt.4B")); //$NON-NLS-1$ + } + + } + + /** + * Instantiates a new area with no data. + */ + public Area() { + } + + /** + * Instantiates a new area with data given by the specified shape. + * + * @param s + * the shape that gives the data for this Area. + */ + public Area(Shape s) { + if (s == null) { + throw new NullPointerException(); + } + this.s = s; + } + + public boolean contains(double x, double y) { + return s == null ? false : s.contains(x, y); + } + + public boolean contains(double x, double y, double width, double height) { + return s == null ? false : s.contains(x, y, width, height); + } + + public boolean contains(Point2D p) { + if (p == null) { + throw new NullPointerException(); + } + return s == null ? false : s.contains(p); + } + + public boolean contains(Rectangle2D r) { + if (r == null) { + throw new NullPointerException(); + } + return s == null ? false : s.contains(r); + } + + /** + * Tests whether the object is equal to this Area. + * + * @param obj + * the object to compare. + * @return true, if successful. + * @throws NotImplementedException + * if this method is not implemented. + */ + public boolean equals(Area obj) throws org.apache.harmony.luni.util.NotImplementedException { + throw new RuntimeException("Not implemented"); //$NON-NLS-1$ + } + + public boolean intersects(double x, double y, double width, double height) { + return s == null ? false : s.intersects(x, y, width, height); + } + + public boolean intersects(Rectangle2D r) { + if (r == null) { + throw new NullPointerException(); + } + return s == null ? false : s.intersects(r); + } + + public Rectangle getBounds() { + return s == null ? new Rectangle() : s.getBounds(); + } + + public Rectangle2D getBounds2D() { + return s == null ? new Rectangle2D.Double() : s.getBounds2D(); + } + + public PathIterator getPathIterator(AffineTransform t) { + return s == null ? new NullIterator() : s.getPathIterator(t); + } + + public PathIterator getPathIterator(AffineTransform t, double flatness) { + return s == null ? new NullIterator() : s.getPathIterator(t, flatness); + } + + /** + * Adds the specified area to this area. + * + * @param area + * the area to add to this area. + * @throws NotImplementedException + * if this method is not implemented. + */ + public void add(Area area) throws org.apache.harmony.luni.util.NotImplementedException { + throw new RuntimeException("Not implemented"); //$NON-NLS-1$ + } + + /** + * Performs an exclusive or operation between this shape and the specified + * shape. + * + * @param area + * the area to XOR against this area. + * @throws NotImplementedException + * if this method is not implemented. + */ + public void exclusiveOr(Area area) throws org.apache.harmony.luni.util.NotImplementedException { + throw new RuntimeException("Not implemented"); //$NON-NLS-1$ + } + + /** + * Extracts a Rectangle2D from the source shape if the underlying shape data + * describes a rectangle. + * + * @return a Rectangle2D object if the source shape is rectangle, or null if + * shape is empty or not rectangle. + */ + Rectangle2D extractRectangle() { + if (s == null) { + return null; + } + float[] points = new float[12]; + int count = 0; + PathIterator p = s.getPathIterator(null); + float[] coords = new float[6]; + while (!p.isDone()) { + int type = p.currentSegment(coords); + if (count > 12 || type == PathIterator.SEG_QUADTO || type == PathIterator.SEG_CUBICTO) { + return null; + } + points[count++] = coords[0]; + points[count++] = coords[1]; + p.next(); + } + if (points[0] == points[6] && points[6] == points[8] && points[2] == points[4] + && points[1] == points[3] && points[3] == points[9] && points[5] == points[7]) { + return new Rectangle2D.Float(points[0], points[1], points[2] - points[0], points[7] + - points[1]); + } + return null; + } + + /** + * Reduces the size of this Area by intersecting it with the specified Area + * if they are both rectangles. + * + * @see java.awt.geom.Rectangle2D#intersect(Rectangle2D, Rectangle2D, + * Rectangle2D) + * @param area + * the area. + */ + public void intersect(Area area) { + Rectangle2D src1 = extractRectangle(); + Rectangle2D src2 = area.extractRectangle(); + if (src1 != null && src2 != null) { + Rectangle2D.intersect(src1, src2, (Rectangle2D)s); + } + } + + /** + * Subtract the specified area from this area. + * + * @param area + * the area to subtract. + * @throws NotImplementedException + * if this method is not implemented. + */ + public void subtract(Area area) throws org.apache.harmony.luni.util.NotImplementedException { + throw new RuntimeException("Not implemented"); //$NON-NLS-1$ + } + + /** + * Checks if this Area is empty. + * + * @return true, if this Area is empty. + * @throws NotImplementedException + * if this method is not implemented. + */ + public boolean isEmpty() throws org.apache.harmony.luni.util.NotImplementedException { + throw new RuntimeException("Not implemented"); //$NON-NLS-1$ + } + + /** + * Checks if this Area is polygonal. + * + * @return true, if this Area is polygonal. + * @throws NotImplementedException + * if this method is not implemented. + */ + public boolean isPolygonal() throws org.apache.harmony.luni.util.NotImplementedException { + throw new RuntimeException("Not implemented"); //$NON-NLS-1$ + } + + /** + * Checks if this Area is rectangular. + * + * @return true, if this Area is rectangular. + * @throws NotImplementedException + * if this method is not implemented. + */ + public boolean isRectangular() throws org.apache.harmony.luni.util.NotImplementedException { + throw new RuntimeException("Not implemented"); //$NON-NLS-1$ + } + + /** + * Checks if this Area is singular. + * + * @return true, if this Area is singular. + * @throws NotImplementedException + * if this method is not implemented. + */ + public boolean isSingular() throws org.apache.harmony.luni.util.NotImplementedException { + throw new RuntimeException("Not implemented"); //$NON-NLS-1$ + } + + /** + * Resets the data of this Area. + * + * @throws NotImplementedException + * if this method is not implemented. + */ + public void reset() throws org.apache.harmony.luni.util.NotImplementedException { + throw new RuntimeException("Not implemented"); //$NON-NLS-1$ + } + + /** + * Transforms the data of this Area according to the specified + * AffineTransform. + * + * @param t + * the transform to use to transform the data. + */ + public void transform(AffineTransform t) { + s = t.createTransformedShape(s); + } + + /** + * Creates a new Area that is the result of transforming the data of this + * Area according to the specified AffineTransform. + * + * @param t + * the transform to use to transform the data. + * @return the new Area that is the result of transforming the data of this + * Area according to the specified AffineTransform. + */ + public Area createTransformedArea(AffineTransform t) { + return s == null ? new Area() : new Area(t.createTransformedShape(s)); + } + + @Override + public Object clone() { + return new Area(this); + } + +} |