aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/jogamp/graph
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2011-03-25 03:45:53 +0100
committerSven Gothel <[email protected]>2011-03-25 03:45:53 +0100
commit524a7d61a4fc4a4d38aeb543b9887e787555bb71 (patch)
treeae96d72b84a3a9d618ffd45bf550562527bbdcea /src/com/jogamp/graph
parent89d1a2d2ecb414d62f44cbb2e3b9bd75746943cf (diff)
Fitting of jogamp.graph.geom.plane: double -> float, package location, use PointFactory, GeneralPath -> Path2D, ..
Diffstat (limited to 'src/com/jogamp/graph')
-rw-r--r--src/com/jogamp/graph/geom/plane/AffineTransform.java330
-rw-r--r--src/com/jogamp/graph/geom/plane/IllegalPathStateException.java2
-rw-r--r--src/com/jogamp/graph/geom/plane/NoninvertibleTransformException.java2
-rw-r--r--src/com/jogamp/graph/geom/plane/Path2D.java (renamed from src/com/jogamp/graph/geom/plane/GeneralPath.java)121
-rw-r--r--src/com/jogamp/graph/geom/plane/PathIterator.java4
5 files changed, 195 insertions, 264 deletions
diff --git a/src/com/jogamp/graph/geom/plane/AffineTransform.java b/src/com/jogamp/graph/geom/plane/AffineTransform.java
index 065ad94b2..321551edc 100644
--- a/src/com/jogamp/graph/geom/plane/AffineTransform.java
+++ b/src/com/jogamp/graph/geom/plane/AffineTransform.java
@@ -17,19 +17,23 @@
/**
* @author Denis M. Kishenko
*/
-package java.awt.geom;
+package com.jogamp.graph.geom.plane;
-import java.awt.Shape;
import java.io.IOException;
import java.io.Serializable;
-import org.apache.harmony.awt.internal.nls.Messages;
+import jogamp.graph.math.MathFloat;
import org.apache.harmony.misc.HashCode;
+import com.jogamp.graph.geom.Point;
+import com.jogamp.graph.geom.Point.Factory;
+
public class AffineTransform implements Cloneable, Serializable {
private static final long serialVersionUID = 1330973210523860834L;
+ static final String determinantIsZero = "Determinant is zero";
+
public static final int TYPE_IDENTITY = 0;
public static final int TYPE_TRANSLATION = 1;
public static final int TYPE_UNIFORM_SCALE = 2;
@@ -49,30 +53,34 @@ public class AffineTransform implements Cloneable, Serializable {
/**
* The min value equivalent to zero. If absolute value less then ZERO it considered as zero.
*/
- static final double ZERO = 1E-10;
+ static final float ZERO = (float) 1E-10;
+ private final Point.Factory<? extends Point> pointFactory;
+
/**
* The values of transformation matrix
*/
- double m00;
- double m10;
- double m01;
- double m11;
- double m02;
- double m12;
+ float m00;
+ float m10;
+ float m01;
+ float m11;
+ float m02;
+ float m12;
/**
* The transformation <code>type</code>
*/
transient int type;
- public AffineTransform() {
+ public AffineTransform(Factory<? extends Point> factory) {
+ pointFactory = factory;
type = TYPE_IDENTITY;
- m00 = m11 = 1.0;
- m10 = m01 = m02 = m12 = 0.0;
+ m00 = m11 = 1.0f;
+ m10 = m01 = m02 = m12 = 0.0f;
}
public AffineTransform(AffineTransform t) {
+ this.pointFactory = t.pointFactory;
this.type = t.type;
this.m00 = t.m00;
this.m10 = t.m10;
@@ -82,7 +90,8 @@ public class AffineTransform implements Cloneable, Serializable {
this.m12 = t.m12;
}
- public AffineTransform(float m00, float m10, float m01, float m11, float m02, float m12) {
+ public AffineTransform(Point.Factory<? extends Point> factory, float m00, float m10, float m01, float m11, float m02, float m12) {
+ pointFactory = factory;
this.type = TYPE_UNKNOWN;
this.m00 = m00;
this.m10 = m10;
@@ -92,29 +101,8 @@ public class AffineTransform implements Cloneable, Serializable {
this.m12 = m12;
}
- public AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12) {
- this.type = TYPE_UNKNOWN;
- this.m00 = m00;
- this.m10 = m10;
- this.m01 = m01;
- this.m11 = m11;
- this.m02 = m02;
- this.m12 = m12;
- }
-
- public AffineTransform(float[] matrix) {
- this.type = TYPE_UNKNOWN;
- m00 = matrix[0];
- m10 = matrix[1];
- m01 = matrix[2];
- m11 = matrix[3];
- if (matrix.length > 4) {
- m02 = matrix[4];
- m12 = matrix[5];
- }
- }
-
- public AffineTransform(double[] matrix) {
+ public AffineTransform(Point.Factory<? extends Point> factory, float[] matrix) {
+ pointFactory = factory;
this.type = TYPE_UNKNOWN;
m00 = matrix[0];
m10 = matrix[1];
@@ -169,8 +157,8 @@ public class AffineTransform implements Cloneable, Serializable {
type |= TYPE_FLIP;
}
- double dx = m00 * m00 + m10 * m10;
- double dy = m01 * m01 + m11 * m11;
+ float dx = m00 * m00 + m10 * m10;
+ float dy = m01 * m01 + m11 * m11;
if (dx != dy) {
type |= TYPE_GENERAL_SCALE;
} else
@@ -190,27 +178,27 @@ public class AffineTransform implements Cloneable, Serializable {
return type;
}
- public double getScaleX() {
+ public float getScaleX() {
return m00;
}
- public double getScaleY() {
+ public float getScaleY() {
return m11;
}
- public double getShearX() {
+ public float getShearX() {
return m01;
}
- public double getShearY() {
+ public float getShearY() {
return m10;
}
- public double getTranslateX() {
+ public float getTranslateX() {
return m02;
}
- public double getTranslateY() {
+ public float getTranslateY() {
return m12;
}
@@ -218,7 +206,7 @@ public class AffineTransform implements Cloneable, Serializable {
return getType() == TYPE_IDENTITY;
}
- public void getMatrix(double[] matrix) {
+ public void getMatrix(float[] matrix) {
matrix[0] = m00;
matrix[1] = m10;
matrix[2] = m01;
@@ -229,11 +217,11 @@ public class AffineTransform implements Cloneable, Serializable {
}
}
- public double getDeterminant() {
+ public float getDeterminant() {
return m00 * m11 - m01 * m10;
}
- public void setTransform(double m00, double m10, double m01, double m11, double m02, double m12) {
+ public void setTransform(float m00, float m10, float m01, float m11, float m02, float m12) {
this.type = TYPE_UNKNOWN;
this.m00 = m00;
this.m10 = m10;
@@ -250,128 +238,130 @@ public class AffineTransform implements Cloneable, Serializable {
public void setToIdentity() {
type = TYPE_IDENTITY;
- m00 = m11 = 1.0;
- m10 = m01 = m02 = m12 = 0.0;
+ m00 = m11 = 1.0f;
+ m10 = m01 = m02 = m12 = 0.0f;
}
- public void setToTranslation(double mx, double my) {
- m00 = m11 = 1.0;
- m01 = m10 = 0.0;
+ public void setToTranslation(float mx, float my) {
+ m00 = m11 = 1.0f;
+ m01 = m10 = 0.0f;
m02 = mx;
m12 = my;
- if (mx == 0.0 && my == 0.0) {
+ if (mx == 0.0f && my == 0.0f) {
type = TYPE_IDENTITY;
} else {
type = TYPE_TRANSLATION;
}
}
- public void setToScale(double scx, double scy) {
+ public void setToScale(float scx, float scy) {
m00 = scx;
m11 = scy;
- m10 = m01 = m02 = m12 = 0.0;
- if (scx != 1.0 || scy != 1.0) {
+ m10 = m01 = m02 = m12 = 0.0f;
+ if (scx != 1.0f || scy != 1.0f) {
type = TYPE_UNKNOWN;
} else {
type = TYPE_IDENTITY;
}
}
- public void setToShear(double shx, double shy) {
- m00 = m11 = 1.0;
- m02 = m12 = 0.0;
+ public void setToShear(float shx, float shy) {
+ m00 = m11 = 1.0f;
+ m02 = m12 = 0.0f;
m01 = shx;
m10 = shy;
- if (shx != 0.0 || shy != 0.0) {
+ if (shx != 0.0f || shy != 0.0f) {
type = TYPE_UNKNOWN;
} else {
type = TYPE_IDENTITY;
}
}
- public void setToRotation(double angle) {
- double sin = Math.sin(angle);
- double cos = Math.cos(angle);
- if (Math.abs(cos) < ZERO) {
- cos = 0.0;
- sin = sin > 0.0 ? 1.0 : -1.0;
+ public void setToRotation(float angle) {
+ float sin = MathFloat.sin(angle);
+ float cos = MathFloat.cos(angle);
+ if (MathFloat.abs(cos) < ZERO) {
+ cos = 0.0f;
+ sin = sin > 0.0f ? 1.0f : -1.0f;
} else
- if (Math.abs(sin) < ZERO) {
- sin = 0.0;
- cos = cos > 0.0 ? 1.0 : -1.0;
+ if (MathFloat.abs(sin) < ZERO) {
+ sin = 0.0f;
+ cos = cos > 0.0f ? 1.0f : -1.0f;
}
m00 = m11 = cos;
m01 = -sin;
m10 = sin;
- m02 = m12 = 0.0;
+ m02 = m12 = 0.0f;
type = TYPE_UNKNOWN;
}
- public void setToRotation(double angle, double px, double py) {
+ public void setToRotation(float angle, float px, float py) {
setToRotation(angle);
- m02 = px * (1.0 - m00) + py * m10;
- m12 = py * (1.0 - m00) - px * m10;
+ m02 = px * (1.0f - m00) + py * m10;
+ m12 = py * (1.0f - m00) - px * m10;
type = TYPE_UNKNOWN;
}
- public static AffineTransform getTranslateInstance(double mx, double my) {
- AffineTransform t = new AffineTransform();
+ public static <T extends Point> AffineTransform getTranslateInstance(Point.Factory<? extends Point> factory, float mx, float my) {
+ AffineTransform t = new AffineTransform(factory);
t.setToTranslation(mx, my);
return t;
}
- public static AffineTransform getScaleInstance(double scx, double scY) {
- AffineTransform t = new AffineTransform();
+ public static <T extends Point> AffineTransform getScaleInstance(Point.Factory<? extends Point> factory, float scx, float scY) {
+ AffineTransform t = new AffineTransform(factory);
t.setToScale(scx, scY);
return t;
}
- public static AffineTransform getShearInstance(double shx, double shy) {
- AffineTransform m = new AffineTransform();
- m.setToShear(shx, shy);
- return m;
+ public static <T extends Point> AffineTransform getShearInstance(Point.Factory<? extends Point> factory, float shx, float shy) {
+ AffineTransform t = new AffineTransform(factory);
+ t.setToShear(shx, shy);
+ return t;
}
- public static AffineTransform getRotateInstance(double angle) {
- AffineTransform t = new AffineTransform();
+ public static <T extends Point> AffineTransform getRotateInstance(Point.Factory<? extends Point> factory, float angle) {
+ AffineTransform t = new AffineTransform(factory);
t.setToRotation(angle);
return t;
}
- public static AffineTransform getRotateInstance(double angle, double x, double y) {
- AffineTransform t = new AffineTransform();
+ public static <T extends Point> AffineTransform getRotateInstance(Point.Factory<? extends Point> factory, float angle, float x, float y) {
+ AffineTransform t = new AffineTransform(factory);
t.setToRotation(angle, x, y);
return t;
}
- public void translate(double mx, double my) {
- concatenate(AffineTransform.getTranslateInstance(mx, my));
+ public void translate(float mx, float my) {
+ concatenate(AffineTransform.getTranslateInstance(pointFactory, mx, my));
}
- public void scale(double scx, double scy) {
- concatenate(AffineTransform.getScaleInstance(scx, scy));
+ public void scale(float scx, float scy) {
+ concatenate(AffineTransform.getScaleInstance(pointFactory, scx, scy));
}
- public void shear(double shx, double shy) {
- concatenate(AffineTransform.getShearInstance(shx, shy));
+ public void shear(float shx, float shy) {
+ concatenate(AffineTransform.getShearInstance(pointFactory, shx, shy));
}
- public void rotate(double angle) {
- concatenate(AffineTransform.getRotateInstance(angle));
+ public void rotate(float angle) {
+ concatenate(AffineTransform.getRotateInstance(pointFactory, angle));
}
- public void rotate(double angle, double px, double py) {
- concatenate(AffineTransform.getRotateInstance(angle, px, py));
+ public void rotate(float angle, float px, float py) {
+ concatenate(AffineTransform.getRotateInstance(pointFactory, angle, px, py));
}
/**
- * Multiply matrix of two AffineTransform objects
+ * Multiply matrix of two AffineTransform objects.
+ * The first argument's {@link Point.Factory} is being used.
+ *
* @param t1 - the AffineTransform object is a multiplicand
* @param t2 - the AffineTransform object is a multiplier
* @return an AffineTransform object that is a result of t1 multiplied by matrix t2.
*/
AffineTransform multiply(AffineTransform t1, AffineTransform t2) {
- return new AffineTransform(
+ return new AffineTransform(t1.pointFactory,
t1.m00 * t2.m00 + t1.m10 * t2.m01, // m00
t1.m00 * t2.m10 + t1.m10 * t2.m11, // m01
t1.m01 * t2.m00 + t1.m11 * t2.m01, // m10
@@ -389,12 +379,12 @@ public class AffineTransform implements Cloneable, Serializable {
}
public AffineTransform createInverse() throws NoninvertibleTransformException {
- double det = getDeterminant();
- if (Math.abs(det) < ZERO) {
- // awt.204=Determinant is zero
- throw new NoninvertibleTransformException(Messages.getString("awt.204")); //$NON-NLS-1$
+ float det = getDeterminant();
+ if (MathFloat.abs(det) < ZERO) {
+ throw new NoninvertibleTransformException(determinantIsZero);
}
return new AffineTransform(
+ this.pointFactory,
m11 / det, // m00
-m10 / det, // m10
-m01 / det, // m01
@@ -404,57 +394,32 @@ public class AffineTransform implements Cloneable, Serializable {
);
}
- public Point2D transform(Point2D src, Point2D dst) {
+ public Point transform(Point src, Point dst) {
if (dst == null) {
- if (src instanceof Point2D.Double) {
- dst = new Point2D.Double();
- } else {
- dst = new Point2D.Float();
- }
+ dst = pointFactory.create();
}
- double x = src.getX();
- double y = src.getY();
+ float x = src.getX();
+ float y = src.getY();
- dst.setLocation(x * m00 + y * m01 + m02, x * m10 + y * m11 + m12);
+ dst.setCoord(x * m00 + y * m01 + m02, x * m10 + y * m11 + m12);
return dst;
}
- public void transform(Point2D[] src, int srcOff, Point2D[] dst, int dstOff, int length) {
+ public void transform(Point[] src, int srcOff, Point[] dst, int dstOff, int length) {
while (--length >= 0) {
- Point2D srcPoint = src[srcOff++];
- double x = srcPoint.getX();
- double y = srcPoint.getY();
- Point2D dstPoint = dst[dstOff];
+ Point srcPoint = src[srcOff++];
+ float x = srcPoint.getX();
+ float y = srcPoint.getY();
+ Point dstPoint = dst[dstOff];
if (dstPoint == null) {
- if (srcPoint instanceof Point2D.Double) {
- dstPoint = new Point2D.Double();
- } else {
- dstPoint = new Point2D.Float();
- }
+ throw new IllegalArgumentException("dst["+dstOff+"] is null");
}
- dstPoint.setLocation(x * m00 + y * m01 + m02, x * m10 + y * m11 + m12);
+ dstPoint.setCoord(x * m00 + y * m01 + m02, x * m10 + y * m11 + m12);
dst[dstOff++] = dstPoint;
}
}
- public void transform(double[] src, int srcOff, double[] dst, int dstOff, int length) {
- int step = 2;
- if (src == dst && srcOff < dstOff && dstOff < srcOff + length * 2) {
- srcOff = srcOff + length * 2 - 2;
- dstOff = dstOff + length * 2 - 2;
- step = -2;
- }
- while (--length >= 0) {
- double x = src[srcOff + 0];
- double y = src[srcOff + 1];
- dst[dstOff + 0] = x * m00 + y * m01 + m02;
- dst[dstOff + 1] = x * m10 + y * m11 + m12;
- srcOff += step;
- dstOff += step;
- }
- }
-
public void transform(float[] src, int srcOff, float[] dst, int dstOff, int length) {
int step = 2;
if (src == dst && srcOff < dstOff && dstOff < srcOff + length * 2) {
@@ -465,104 +430,75 @@ public class AffineTransform implements Cloneable, Serializable {
while (--length >= 0) {
float x = src[srcOff + 0];
float y = src[srcOff + 1];
- dst[dstOff + 0] = (float)(x * m00 + y * m01 + m02);
- dst[dstOff + 1] = (float)(x * m10 + y * m11 + m12);
+ dst[dstOff + 0] = x * m00 + y * m01 + m02;
+ dst[dstOff + 1] = x * m10 + y * m11 + m12;
srcOff += step;
dstOff += step;
}
}
- public void transform(float[] src, int srcOff, double[] dst, int dstOff, int length) {
- while (--length >= 0) {
- float x = src[srcOff++];
- float y = src[srcOff++];
- dst[dstOff++] = x * m00 + y * m01 + m02;
- dst[dstOff++] = x * m10 + y * m11 + m12;
- }
- }
-
- public void transform(double[] src, int srcOff, float[] dst, int dstOff, int length) {
- while (--length >= 0) {
- double x = src[srcOff++];
- double y = src[srcOff++];
- dst[dstOff++] = (float)(x * m00 + y * m01 + m02);
- dst[dstOff++] = (float)(x * m10 + y * m11 + m12);
- }
- }
-
- public Point2D deltaTransform(Point2D src, Point2D dst) {
+ public Point deltaTransform(Point src, Point dst) {
if (dst == null) {
- if (src instanceof Point2D.Double) {
- dst = new Point2D.Double();
- } else {
- dst = new Point2D.Float();
- }
+ dst = pointFactory.create();
}
- double x = src.getX();
- double y = src.getY();
+ float x = src.getX();
+ float y = src.getY();
- dst.setLocation(x * m00 + y * m01, x * m10 + y * m11);
+ dst.setCoord(x * m00 + y * m01, x * m10 + y * m11);
return dst;
}
- public void deltaTransform(double[] src, int srcOff, double[] dst, int dstOff, int length) {
+ public void deltaTransform(float[] src, int srcOff, float[] dst, int dstOff, int length) {
while (--length >= 0) {
- double x = src[srcOff++];
- double y = src[srcOff++];
+ float x = src[srcOff++];
+ float y = src[srcOff++];
dst[dstOff++] = x * m00 + y * m01;
dst[dstOff++] = x * m10 + y * m11;
}
}
- public Point2D inverseTransform(Point2D src, Point2D dst) throws NoninvertibleTransformException {
- double det = getDeterminant();
- if (Math.abs(det) < ZERO) {
- // awt.204=Determinant is zero
- throw new NoninvertibleTransformException(Messages.getString("awt.204")); //$NON-NLS-1$
+ public Point inverseTransform(Point src, Point dst) throws NoninvertibleTransformException {
+ float det = getDeterminant();
+ if (MathFloat.abs(det) < ZERO) {
+ throw new NoninvertibleTransformException(determinantIsZero);
}
-
if (dst == null) {
- if (src instanceof Point2D.Double) {
- dst = new Point2D.Double();
- } else {
- dst = new Point2D.Float();
- }
+ dst = pointFactory.create();
}
- double x = src.getX() - m02;
- double y = src.getY() - m12;
+ float x = src.getX() - m02;
+ float y = src.getY() - m12;
- dst.setLocation((x * m11 - y * m01) / det, (y * m00 - x * m10) / det);
+ dst.setCoord((x * m11 - y * m01) / det, (y * m00 - x * m10) / det);
return dst;
}
- public void inverseTransform(double[] src, int srcOff, double[] dst, int dstOff, int length)
+ public void inverseTransform(float[] src, int srcOff, float[] dst, int dstOff, int length)
throws NoninvertibleTransformException
{
- double det = getDeterminant();
- if (Math.abs(det) < ZERO) {
- // awt.204=Determinant is zero
- throw new NoninvertibleTransformException(Messages.getString("awt.204")); //$NON-NLS-1$
+ float det = getDeterminant();
+ if (MathFloat.abs(det) < ZERO) {
+ throw new NoninvertibleTransformException(determinantIsZero);
}
while (--length >= 0) {
- double x = src[srcOff++] - m02;
- double y = src[srcOff++] - m12;
+ float x = src[srcOff++] - m02;
+ float y = src[srcOff++] - m12;
dst[dstOff++] = (x * m11 - y * m01) / det;
dst[dstOff++] = (y * m00 - x * m10) / det;
}
}
- public Shape createTransformedShape(Shape src) {
+ public Path2D createTransformedShape(Path2D src) {
if (src == null) {
return null;
}
- if (src instanceof GeneralPath) {
- return ((GeneralPath)src).createTransformedShape(this);
+ if (src instanceof Path2D) {
+ return ((Path2D)src).createTransformedShape(this);
}
- PathIterator path = src.getPathIterator(this);
- GeneralPath dst = new GeneralPath(path.getWindingRule());
+ PathIterator path = src.iterator(this);
+ Path2D dst = new Path2D(path.getWindingRule());
dst.append(path, false);
return dst;
}
diff --git a/src/com/jogamp/graph/geom/plane/IllegalPathStateException.java b/src/com/jogamp/graph/geom/plane/IllegalPathStateException.java
index 9d667e510..15f629b88 100644
--- a/src/com/jogamp/graph/geom/plane/IllegalPathStateException.java
+++ b/src/com/jogamp/graph/geom/plane/IllegalPathStateException.java
@@ -17,7 +17,7 @@
/**
* @author Denis M. Kishenko
*/
-package java.awt.geom;
+package com.jogamp.graph.geom.plane;
public class IllegalPathStateException extends RuntimeException {
diff --git a/src/com/jogamp/graph/geom/plane/NoninvertibleTransformException.java b/src/com/jogamp/graph/geom/plane/NoninvertibleTransformException.java
index eee170ec1..cd1ec8d16 100644
--- a/src/com/jogamp/graph/geom/plane/NoninvertibleTransformException.java
+++ b/src/com/jogamp/graph/geom/plane/NoninvertibleTransformException.java
@@ -17,7 +17,7 @@
/**
* @author Denis M. Kishenko
*/
-package java.awt.geom;
+package com.jogamp.graph.geom.plane;
public class NoninvertibleTransformException extends java.lang.Exception {
diff --git a/src/com/jogamp/graph/geom/plane/GeneralPath.java b/src/com/jogamp/graph/geom/plane/Path2D.java
index 6d6282ef1..031450c8e 100644
--- a/src/com/jogamp/graph/geom/plane/GeneralPath.java
+++ b/src/com/jogamp/graph/geom/plane/Path2D.java
@@ -17,20 +17,24 @@
/**
* @author Denis M. Kishenko
*/
-package java.awt.geom;
+package com.jogamp.graph.geom.plane;
-import java.awt.Rectangle;
-import java.awt.Shape;
import java.util.NoSuchElementException;
-import org.apache.harmony.awt.gl.Crossing;
-import org.apache.harmony.awt.internal.nls.Messages;
+import com.jogamp.graph.geom.AABBox;
+import com.jogamp.graph.geom.Point;
+import com.jogamp.graph.geom.opengl.Vertex;
-public final class GeneralPath implements Shape, Cloneable {
+import jogamp.graph.math.plane.Crossing;
+
+public final class Path2D implements Cloneable {
public static final int WIND_EVEN_ODD = PathIterator.WIND_EVEN_ODD;
public static final int WIND_NON_ZERO = PathIterator.WIND_NON_ZERO;
+ static final String invalidWindingRuleValue = "Invalid winding rule value";
+ static final String iteratorOutOfBounds = "Iterator out of bounds";
+
/**
* The buffers size
*/
@@ -94,7 +98,7 @@ public final class GeneralPath implements Shape, Cloneable {
/**
* The source GeneralPath object
*/
- GeneralPath p;
+ Path2D p;
/**
* The path iterator transformation
@@ -105,7 +109,7 @@ public final class GeneralPath implements Shape, Cloneable {
* Constructs a new GeneralPath.Iterator for given general path
* @param path - the source GeneralPath object
*/
- Iterator(GeneralPath path) {
+ Iterator(Path2D path) {
this(path, null);
}
@@ -114,7 +118,7 @@ public final class GeneralPath implements Shape, Cloneable {
* @param path - the source GeneralPath object
* @param at - the AffineTransform object to apply rectangle path
*/
- Iterator(GeneralPath path, AffineTransform at) {
+ Iterator(Path2D path, AffineTransform at) {
this.p = path;
this.t = at;
}
@@ -131,30 +135,12 @@ public final class GeneralPath implements Shape, Cloneable {
typeIndex++;
}
- public int currentSegment(double[] coords) {
- if (isDone()) {
- // awt.4B=Iterator out of bounds
- throw new NoSuchElementException(Messages.getString("awt.4B")); //$NON-NLS-1$
- }
- int type = p.types[typeIndex];
- int count = GeneralPath.pointShift[type];
- for (int i = 0; i < count; i++) {
- coords[i] = p.points[pointIndex + i];
- }
- if (t != null) {
- t.transform(coords, 0, coords, 0, count / 2);
- }
- pointIndex += count;
- return type;
- }
-
public int currentSegment(float[] coords) {
if (isDone()) {
- // awt.4B=Iterator out of bounds
- throw new NoSuchElementException(Messages.getString("awt.4B")); //$NON-NLS-1$
+ throw new NoSuchElementException(iteratorOutOfBounds);
}
int type = p.types[typeIndex];
- int count = GeneralPath.pointShift[type];
+ int count = Path2D.pointShift[type];
System.arraycopy(p.points, pointIndex, coords, 0, count);
if (t != null) {
t.transform(coords, 0, coords, 0, count / 2);
@@ -165,31 +151,30 @@ public final class GeneralPath implements Shape, Cloneable {
}
- public GeneralPath() {
+ public Path2D() {
this(WIND_NON_ZERO, BUFFER_SIZE);
}
- public GeneralPath(int rule) {
+ public Path2D(int rule) {
this(rule, BUFFER_SIZE);
}
- public GeneralPath(int rule, int initialCapacity) {
+ public Path2D(int rule, int initialCapacity) {
setWindingRule(rule);
types = new byte[initialCapacity];
points = new float[initialCapacity * 2];
}
- public GeneralPath(Shape shape) {
+ public Path2D(Path2D path) {
this(WIND_NON_ZERO, BUFFER_SIZE);
- PathIterator p = shape.getPathIterator(null);
+ PathIterator p = path.iterator(null);
setWindingRule(p.getWindingRule());
append(p, false);
}
public void setWindingRule(int rule) {
if (rule != WIND_EVEN_ODD && rule != WIND_NON_ZERO) {
- // awt.209=Invalid winding rule value
- throw new java.lang.IllegalArgumentException(Messages.getString("awt.209")); //$NON-NLS-1$
+ throw new NoSuchElementException(invalidWindingRuleValue);
}
this.rule = rule;
}
@@ -204,8 +189,7 @@ public final class GeneralPath implements Shape, Cloneable {
*/
void checkBuf(int pointCount, boolean checkMove) {
if (checkMove && typeSize == 0) {
- // awt.20A=First segment should be SEG_MOVETO type
- throw new IllegalPathStateException(Messages.getString("awt.20A")); //$NON-NLS-1$
+ throw new IllegalPathStateException("First segment should be SEG_MOVETO type");
}
if (typeSize == types.length) {
byte tmp[] = new byte[typeSize + BUFFER_CAPACITY];
@@ -258,15 +242,27 @@ public final class GeneralPath implements Shape, Cloneable {
points[pointSize++] = y3;
}
+ final public int size() {
+ return typeSize;
+ }
+
+ final public boolean isClosed() {
+ return typeSize > 0 && types[typeSize - 1] == PathIterator.SEG_CLOSE ;
+ }
+
public void closePath() {
- if (typeSize == 0 || types[typeSize - 1] != PathIterator.SEG_CLOSE) {
+ if (!isClosed()) {
checkBuf(0, true);
types[typeSize++] = PathIterator.SEG_CLOSE;
}
}
+
+ public String toString() {
+ return "[size "+size()+", closed "+isClosed()+"]";
+ }
- public void append(Shape shape, boolean connect) {
- PathIterator p = shape.getPathIterator(null);
+ public void append(Path2D path, boolean connect) {
+ PathIterator p = path.iterator(null);
append(p, connect);
}
@@ -304,7 +300,7 @@ public final class GeneralPath implements Shape, Cloneable {
}
}
- public Point2D getCurrentPoint() {
+ public Vertex getCurrentPoint() {
if (typeSize == 0) {
return null;
}
@@ -319,7 +315,7 @@ public final class GeneralPath implements Shape, Cloneable {
j -= pointShift[type];
}
}
- return new Point2D.Float(points[j], points[j + 1]);
+ return new Vertex(points[j], points[j + 1]);
}
public void reset() {
@@ -331,15 +327,15 @@ public final class GeneralPath implements Shape, Cloneable {
t.transform(points, 0, points, 0, pointSize / 2);
}
- public Shape createTransformedShape(AffineTransform t) {
- GeneralPath p = (GeneralPath)clone();
+ public Path2D createTransformedShape(AffineTransform t) {
+ Path2D p = (Path2D)clone();
if (t != null) {
p.transform(t);
}
return p;
}
- public Rectangle2D getBounds2D() {
+ public final synchronized AABBox getBounds2D() {
float rx1, ry1, rx2, ry2;
if (pointSize == 0) {
rx1 = ry1 = rx2 = ry2 = 0.0f;
@@ -364,11 +360,9 @@ public final class GeneralPath implements Shape, Cloneable {
}
}
}
- return new Rectangle2D.Float(rx1, ry1, rx2 - rx1, ry2 - ry1);
- }
-
- public Rectangle getBounds() {
- return getBounds2D().getBounds();
+ // FIXME: Rami's code had this in, but AABBox uses upper left - lower right - right ?
+ // return new AABBox(rx1, ry1, 0f, rx2 - rx1, ry2 - ry1, 0f);
+ return new AABBox(rx1, ry1, 0f, rx2, ry2, 0f);
}
/**
@@ -383,44 +377,48 @@ public final class GeneralPath implements Shape, Cloneable {
return Crossing.isInsideEvenOdd(cross);
}
- public boolean contains(double px, double py) {
+ public boolean contains(float px, float py) {
return isInside(Crossing.crossShape(this, px, py));
}
- public boolean contains(double rx, double ry, double rw, double rh) {
+ public boolean contains(float rx, float ry, float rw, float rh) {
int cross = Crossing.intersectShape(this, rx, ry, rw, rh);
return cross != Crossing.CROSSING && isInside(cross);
}
- public boolean intersects(double rx, double ry, double rw, double rh) {
+ public boolean intersects(float rx, float ry, float rw, float rh) {
int cross = Crossing.intersectShape(this, rx, ry, rw, rh);
return cross == Crossing.CROSSING || isInside(cross);
}
- public boolean contains(Point2D p) {
+ public boolean contains(Point p) {
return contains(p.getX(), p.getY());
}
- public boolean contains(Rectangle2D r) {
+ public boolean contains(AABBox r) {
return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight());
}
- public boolean intersects(Rectangle2D r) {
+ public boolean intersects(AABBox r) {
return intersects(r.getX(), r.getY(), r.getWidth(), r.getHeight());
}
- public PathIterator getPathIterator(AffineTransform t) {
+ public PathIterator iterator() {
+ return new Iterator(this);
+ }
+
+ public PathIterator iterator(AffineTransform t) {
return new Iterator(this, t);
}
- public PathIterator getPathIterator(AffineTransform t, double flatness) {
+ /* public PathIterator getPathIterator(AffineTransform t, float flatness) {
return new FlatteningPathIterator(getPathIterator(t), flatness);
- }
+ } */
@Override
public Object clone() {
try {
- GeneralPath p = (GeneralPath) super.clone();
+ Path2D p = (Path2D) super.clone();
p.types = types.clone();
p.points = points.clone();
return p;
@@ -428,6 +426,5 @@ public final class GeneralPath implements Shape, Cloneable {
throw new InternalError();
}
}
-
}
diff --git a/src/com/jogamp/graph/geom/plane/PathIterator.java b/src/com/jogamp/graph/geom/plane/PathIterator.java
index 22b897841..b4681df0a 100644
--- a/src/com/jogamp/graph/geom/plane/PathIterator.java
+++ b/src/com/jogamp/graph/geom/plane/PathIterator.java
@@ -17,7 +17,7 @@
/**
* @author Denis M. Kishenko
*/
-package java.awt.geom;
+package com.jogamp.graph.geom.plane;
public interface PathIterator {
@@ -38,7 +38,5 @@ public interface PathIterator {
public int currentSegment(float[] coords);
- public int currentSegment(double[] coords);
-
}