home *** CD-ROM | disk | FTP | other *** search
- package java.awt.geom;
-
- import java.awt.Rectangle;
- import java.awt.Shape;
- import sun.awt.geom.Crossings;
- import sun.awt.geom.Curve;
-
- public final class GeneralPath implements Shape, Cloneable {
- public static final int WIND_EVEN_ODD = 0;
- public static final int WIND_NON_ZERO = 1;
- private static final byte SEG_MOVETO = 0;
- private static final byte SEG_LINETO = 1;
- private static final byte SEG_QUADTO = 2;
- private static final byte SEG_CUBICTO = 3;
- private static final byte SEG_CLOSE = 4;
- byte[] pointTypes;
- float[] pointCoords;
- int numTypes;
- int numCoords;
- int windingRule;
- static final int INIT_SIZE = 20;
- static final int EXPAND_MAX = 500;
-
- public GeneralPath() {
- this(1, 20, 20);
- }
-
- public GeneralPath(int var1) {
- this(var1, 20, 20);
- }
-
- public GeneralPath(int var1, int var2) {
- this(var1, var2, var2);
- }
-
- GeneralPath(int var1, int var2, int var3) {
- this.setWindingRule(var1);
- this.pointTypes = new byte[var2];
- this.pointCoords = new float[var3 * 2];
- }
-
- public GeneralPath(Shape var1) {
- this(1, 20, 20);
- PathIterator var2 = var1.getPathIterator((AffineTransform)null);
- this.setWindingRule(var2.getWindingRule());
- this.append(var2, false);
- }
-
- private void needRoom(int var1, int var2, boolean var3) {
- if (var3 && this.numTypes == 0) {
- throw new IllegalPathStateException("missing initial moveto in path definition");
- } else {
- int var4 = this.pointCoords.length;
- if (this.numCoords + var2 > var4) {
- int var5 = var4;
- if (var4 > 1000) {
- var5 = 1000;
- }
-
- if (var5 < var2) {
- var5 = var2;
- }
-
- float[] var6 = new float[var4 + var5];
- System.arraycopy(this.pointCoords, 0, var6, 0, this.numCoords);
- this.pointCoords = var6;
- }
-
- var4 = this.pointTypes.length;
- if (this.numTypes + var1 > var4) {
- int var8 = var4;
- if (var4 > 500) {
- var8 = 500;
- }
-
- if (var8 < var1) {
- var8 = var1;
- }
-
- byte[] var9 = new byte[var4 + var8];
- System.arraycopy(this.pointTypes, 0, var9, 0, this.numTypes);
- this.pointTypes = var9;
- }
-
- }
- }
-
- public synchronized void moveTo(float var1, float var2) {
- if (this.numTypes > 0 && this.pointTypes[this.numTypes - 1] == 0) {
- this.pointCoords[this.numCoords - 2] = var1;
- this.pointCoords[this.numCoords - 1] = var2;
- } else {
- this.needRoom(1, 2, false);
- this.pointTypes[this.numTypes++] = 0;
- this.pointCoords[this.numCoords++] = var1;
- this.pointCoords[this.numCoords++] = var2;
- }
-
- }
-
- public synchronized void lineTo(float var1, float var2) {
- this.needRoom(1, 2, true);
- this.pointTypes[this.numTypes++] = 1;
- this.pointCoords[this.numCoords++] = var1;
- this.pointCoords[this.numCoords++] = var2;
- }
-
- public synchronized void quadTo(float var1, float var2, float var3, float var4) {
- this.needRoom(1, 4, true);
- this.pointTypes[this.numTypes++] = 2;
- this.pointCoords[this.numCoords++] = var1;
- this.pointCoords[this.numCoords++] = var2;
- this.pointCoords[this.numCoords++] = var3;
- this.pointCoords[this.numCoords++] = var4;
- }
-
- public synchronized void curveTo(float var1, float var2, float var3, float var4, float var5, float var6) {
- this.needRoom(1, 6, true);
- this.pointTypes[this.numTypes++] = 3;
- this.pointCoords[this.numCoords++] = var1;
- this.pointCoords[this.numCoords++] = var2;
- this.pointCoords[this.numCoords++] = var3;
- this.pointCoords[this.numCoords++] = var4;
- this.pointCoords[this.numCoords++] = var5;
- this.pointCoords[this.numCoords++] = var6;
- }
-
- public synchronized void closePath() {
- if (this.numTypes == 0 || this.pointTypes[this.numTypes - 1] != 4) {
- this.needRoom(1, 0, true);
- this.pointTypes[this.numTypes++] = 4;
- }
-
- }
-
- public void append(Shape var1, boolean var2) {
- PathIterator var3 = var1.getPathIterator((AffineTransform)null);
- this.append(var3, var2);
- }
-
- public void append(PathIterator var1, boolean var2) {
- for(float[] var3 = new float[6]; !var1.isDone(); var2 = false) {
- switch (var1.currentSegment(var3)) {
- case 0:
- if (!var2 || this.numTypes < 1 || this.numCoords < 2) {
- this.moveTo(var3[0], var3[1]);
- break;
- } else if (this.pointTypes[this.numTypes - 1] != 4 && this.pointCoords[this.numCoords - 2] == var3[0] && this.pointCoords[this.numCoords - 1] == var3[1]) {
- break;
- }
- case 1:
- this.lineTo(var3[0], var3[1]);
- break;
- case 2:
- this.quadTo(var3[0], var3[1], var3[2], var3[3]);
- break;
- case 3:
- this.curveTo(var3[0], var3[1], var3[2], var3[3], var3[4], var3[5]);
- break;
- case 4:
- this.closePath();
- }
-
- var1.next();
- }
-
- }
-
- public synchronized int getWindingRule() {
- return this.windingRule;
- }
-
- public void setWindingRule(int var1) {
- if (var1 != 0 && var1 != 1) {
- throw new IllegalArgumentException("winding rule must be WIND_EVEN_ODD or WIND_NON_ZERO");
- } else {
- this.windingRule = var1;
- }
- }
-
- public synchronized Point2D getCurrentPoint() {
- if (this.numTypes >= 1 && this.numCoords >= 2) {
- int var1 = this.numCoords;
- if (this.pointTypes[this.numTypes - 1] == 4) {
- for(int var2 = this.numTypes - 2; var2 > 0; --var2) {
- switch (this.pointTypes[var2]) {
- case 0:
- return new Point2D.Float(this.pointCoords[var1 - 2], this.pointCoords[var1 - 1]);
- case 1:
- var1 -= 2;
- break;
- case 2:
- var1 -= 4;
- break;
- case 3:
- var1 -= 6;
- case 4:
- }
- }
- }
-
- return new Point2D.Float(this.pointCoords[var1 - 2], this.pointCoords[var1 - 1]);
- } else {
- return null;
- }
- }
-
- public synchronized void reset() {
- this.numTypes = this.numCoords = 0;
- }
-
- public void transform(AffineTransform var1) {
- var1.transform(this.pointCoords, 0, this.pointCoords, 0, this.numCoords / 2);
- }
-
- public synchronized Shape createTransformedShape(AffineTransform var1) {
- GeneralPath var2 = (GeneralPath)this.clone();
- if (var1 != null) {
- var2.transform(var1);
- }
-
- return var2;
- }
-
- public Rectangle getBounds() {
- return this.getBounds2D().getBounds();
- }
-
- public synchronized Rectangle2D getBounds2D() {
- int var5 = this.numCoords;
- float var1;
- float var2;
- float var3;
- float var4;
- if (var5 > 0) {
- --var5;
- var2 = var4 = this.pointCoords[var5];
- --var5;
- var1 = var3 = this.pointCoords[var5];
-
- while(var5 > 0) {
- --var5;
- float var6 = this.pointCoords[var5];
- --var5;
- float var7 = this.pointCoords[var5];
- if (var7 < var1) {
- var1 = var7;
- }
-
- if (var6 < var2) {
- var2 = var6;
- }
-
- if (var7 > var3) {
- var3 = var7;
- }
-
- if (var6 > var4) {
- var4 = var6;
- }
- }
- } else {
- var4 = 0.0F;
- var3 = 0.0F;
- var2 = 0.0F;
- var1 = 0.0F;
- }
-
- return new Rectangle2D.Float(var1, var2, var3 - var1, var4 - var2);
- }
-
- public boolean contains(double var1, double var3) {
- if (this.numTypes < 2) {
- return false;
- } else {
- int var5 = Curve.crossingsForPath(this.getPathIterator((AffineTransform)null), var1, var3);
- if (this.windingRule == 1) {
- return var5 != 0;
- } else {
- return (var5 & 1) != 0;
- }
- }
- }
-
- public boolean contains(Point2D var1) {
- return this.contains(var1.getX(), var1.getY());
- }
-
- public boolean contains(double var1, double var3, double var5, double var7) {
- Crossings var9 = Crossings.findCrossings(this.getPathIterator((AffineTransform)null), var1, var3, var1 + var5, var3 + var7);
- return var9 != null && var9.covers(var3, var3 + var7);
- }
-
- public boolean contains(Rectangle2D var1) {
- return this.contains(((RectangularShape)var1).getX(), ((RectangularShape)var1).getY(), ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getHeight());
- }
-
- public boolean intersects(double var1, double var3, double var5, double var7) {
- Crossings var9 = Crossings.findCrossings(this.getPathIterator((AffineTransform)null), var1, var3, var1 + var5, var3 + var7);
- return var9 == null || !var9.isEmpty();
- }
-
- public boolean intersects(Rectangle2D var1) {
- return this.intersects(((RectangularShape)var1).getX(), ((RectangularShape)var1).getY(), ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getHeight());
- }
-
- public PathIterator getPathIterator(AffineTransform var1) {
- return new GeneralPathIterator(this, var1);
- }
-
- public PathIterator getPathIterator(AffineTransform var1, double var2) {
- return new FlatteningPathIterator(this.getPathIterator(var1), var2);
- }
-
- public Object clone() {
- try {
- GeneralPath var1 = (GeneralPath)super.clone();
- var1.pointTypes = (byte[])this.pointTypes.clone();
- var1.pointCoords = (float[])this.pointCoords.clone();
- return var1;
- } catch (CloneNotSupportedException var2) {
- throw new InternalError();
- }
- }
- }
-