diff options
Diffstat (limited to 'libjava/java/awt/geom/AffineTransform.java')
-rw-r--r-- | libjava/java/awt/geom/AffineTransform.java | 652 |
1 files changed, 0 insertions, 652 deletions
diff --git a/libjava/java/awt/geom/AffineTransform.java b/libjava/java/awt/geom/AffineTransform.java deleted file mode 100644 index 71208c08ecc..00000000000 --- a/libjava/java/awt/geom/AffineTransform.java +++ /dev/null @@ -1,652 +0,0 @@ -/* 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.io.Serializable; - -/** - * @author Tom Tromey <tromey@cygnus.com> - * @date April 16, 2000 - */ - -/* Status: mostly complete. Search for fixme to see problems. - Also, TYPE_ returns are not handled correctly. */ - -public class AffineTransform implements Cloneable, Serializable -{ - static final int TYPE_IDENTITY = 0; - static final int TYPE_FLIP = 64; - static final int TYPE_GENERAL_ROTATION = 16; - static final int TYPE_GENERAL_SCALE = 4; - static final int TYPE_GENERAL_TRANSFORM = 32; - static final int TYPE_MASK_ROTATION = 24; - static final int TYPE_MASK_SCALE = 6; - static final int TYPE_QUADRANT_ROTATION = 8; - static final int TYPE_TRANSLATION = 1; - static final int TYPE_UNIFORM_SCALE = 2; - - public AffineTransform () - { - setToIdentity (); - } - - public AffineTransform (AffineTransform tx) - { - setTransform (tx); - } - - public AffineTransform (float m00, float m10, - float m01, float m11, - float m02, float m12) - { - this.m00 = m00; - this.m10 = m10; - this.m01 = m01; - this.m11 = m11; - this.m02 = m02; - this.m12 = m12; - this.type = 0; // fixme; - } - - public AffineTransform (float[] flatmatrix) - { - m00 = flatmatrix[0]; - m10 = flatmatrix[1]; - m01 = flatmatrix[2]; - m11 = flatmatrix[3]; - if (flatmatrix.length >= 6) - { - m02 = flatmatrix[4]; - m12 = flatmatrix[5]; - } - } - - public AffineTransform (double m00, double m10, double m01, - double m11, double m02, double m12) - { - this.m00 = m00; - this.m10 = m10; - this.m01 = m01; - this.m11 = m11; - this.m02 = m02; - this.m12 = m12; - this.type = TYPE_GENERAL_TRANSFORM; - } - - public AffineTransform (double[] flatmatrix) - { - m00 = flatmatrix[0]; - m10 = flatmatrix[1]; - m01 = flatmatrix[2]; - m11 = flatmatrix[3]; - if (flatmatrix.length >= 6) - { - m02 = flatmatrix[4]; - m12 = flatmatrix[5]; - } - } - - public static AffineTransform getTranslateInstance (double tx, double ty) - { - AffineTransform t = new AffineTransform (); - t.setToTranslation (tx, ty); - return t; - } - - public static AffineTransform getRotateInstance (double theta) - { - AffineTransform t = new AffineTransform (); - t.setToRotation (theta); - return t; - } - - public static AffineTransform getRotateInstance (double theta, - double x, double y) - { - AffineTransform t = new AffineTransform (); - t.rotate (theta, x, y); - return t; - } - - public static AffineTransform getScaleInstance (double sx, double sy) - { - AffineTransform t = new AffineTransform (); - t.setToScale (sx, sy); - return t; - } - - public static AffineTransform getShearInstance (double shx, double shy) - { - AffineTransform t = new AffineTransform (); - t.setToShear (shx, shy); - return t; - } - - public int getType () - { - return type; - } - - public double getDeterminant () - { - return m00 * m11 - m01 * m10; - } - - public void getMatrix (double[] flatmatrix) - { - flatmatrix[0] = m00; - flatmatrix[1] = m10; - flatmatrix[2] = m01; - flatmatrix[3] = m11; - if (flatmatrix.length >= 6) - { - flatmatrix[4] = m02; - flatmatrix[5] = m12; - } - } - - public double getScaleX () - { - return m00; - } - - public double getScaleY () - { - return m11; - } - - public double getShearX () - { - return m01; - } - - public double getShearY () - { - return m10; - } - - public double getTranslateX () - { - return m02; - } - - public double getTranslateY () - { - return m12; - } - - public void translate (double tx, double ty) - { - m02 += tx * m00 + ty * m01; - m12 += tx * m10 + ty * m11; - } - - public void rotate (double theta) - { - double c = Math.cos (theta); - double s = Math.sin (theta); - double n00 = m00 * c + m01 * s; - double n01 = m00 * -s + m01 * c; - double n10 = m10 * c + m11 * s; - double n11 = m10 * -s + m11 * c; - - m00 = n00; - m01 = n01; - m10 = n10; - m11 = n11; - } - - public void rotate (double theta, double x, double y) - { - translate (x, y); - rotate (theta); - translate (-x, -y); - } - - public void scale (double sx, double sy) - { - m00 *= sx; - m01 *= sy; - m10 *= sx; - m11 *= sy; - } - - public void shear (double shx, double shy) - { - double n00 = m00 + shx * m01; - double n01 = shx * m00 + m01; - double n10 = m10 * shy + m11; - double n11 = shx * m10 + m11; - - m00 = n00; - m01 = n01; - m10 = n10; - m11 = n11; - } - - public void setToIdentity () - { - m00 = m11 = 1; - m01 = m02 = m10 = m12 = 0; - type = TYPE_IDENTITY; - } - - public void setToTranslation (double tx, double ty) - { - m00 = m11 = 1; - m01 = m10 = 0; - m02 = tx; - m12 = ty; - type = TYPE_TRANSLATION; - } - - public void setToRotation (double theta) - { - double c = Math.cos (theta); - double s = Math.sin (theta); - - m00 = c; - m01 = -s; - m02 = 0; - m10 = s; - m11 = c; - m12 = 0; - type = TYPE_GENERAL_ROTATION; - } - - public void setToScale (double sx, double sy) - { - m00 = sx; - m01 = m02 = m10 = m12 = 0; - m11 = sy; - type = (sx == sy) ? TYPE_UNIFORM_SCALE : TYPE_GENERAL_SCALE; - } - - public void setToShear (double shx, double shy) - { - m00 = m11 = 1; - m01 = shx; - m10 = shy; - m02 = m12 = 0; - type = 0; // FIXME - } - - public void setTransform (AffineTransform tx) - { - m00 = tx.m00; - m01 = tx.m01; - m02 = tx.m02; - m10 = tx.m10; - m11 = tx.m11; - m12 = tx.m12; - type = tx.type; - } - - public void setTransform (double m00, double m10, double m01, - double m11, double m02, double m12) - { - this.m00 = m00; - this.m10 = m10; - this.m01 = m01; - this.m11 = m11; - this.m02 = m02; - this.m12 = m12; - this.type = 0; // FIXME - } - - public void concatentate (AffineTransform tx) - { - double n00 = m00 * tx.m00 + m01 * tx.m10; - double n01 = m00 * tx.m01 + m01 * tx.m11; - double n02 = m00 * tx.m02 + m01 * tx.m12 + m02; - double n10 = m10 * tx.m00 + m11 * tx.m10; - double n11 = m10 * tx.m01 + m11 * tx.m11; - double n12 = m10 * tx.m02 + m11 * tx.m12 + m12; - - m00 = n00; - m01 = n01; - m02 = n02; - m10 = n10; - m11 = n11; - m12 = n12; - } - - public void preConcatenate (AffineTransform tx) - { - double n00 = tx.m00 * m00 + tx.m01 * m10; - double n01 = tx.m00 * m01 + tx.m01 * m11; - double n02 = tx.m00 * m02 + tx.m01 * m12 + tx.m02; - double n10 = tx.m10 * m00 + tx.m11 * m10; - double n11 = tx.m10 * m01 + tx.m11 * m11; - double n12 = tx.m10 * m02 + tx.m11 * m12 + tx.m12; - - m00 = n00; - m01 = n01; - m02 = n02; - m10 = n10; - m11 = n11; - m12 = n12; - } - - public AffineTransform createInverse () - throws NoninvertibleTransformException - { - double det = getDeterminant (); - if (det == 0) - throw new NoninvertibleTransformException ("can't invert transform"); - - double i00 = m11 / det; - double i01 = -m10 / det; - double i02 = 0; - double i10 = m01 / det; - double i11 = -m00 / det; - double i12 = 0; - - return new AffineTransform (i00, i01, i02, - i10, i11, i12); - } - - public Point2D transform (Point2D src, Point2D dst) - { - if (dst == null) - dst = new Point2D.Double (); - - // We compute and set separately to correctly overwrite if - // src==dst. - double x = src.getX (); - double y = src.getY (); - double nx = m00 * x + m01 * y + m02; - double ny = m10 * x + m11 * y + m12; - - dst.setLocation (nx, ny); - - return dst; - } - - public void transform (Point2D[] src, int srcOff, - Point2D[] dst, int dstOff, - int num) - { - while (num-- > 0) - { - dst[dstOff] = transform (src[srcOff], dst[dstOff]); - ++srcOff; - ++dstOff; - } - } - - public void transform (float[] srcPts, int srcOff, - float[] dstPts, int dstOff, - int num) - { - while (num-- > 0) - { - float x = srcPts[srcOff]; - float y = srcPts[srcOff + 1]; - srcOff += 2; - float nx = (float) (m00 * x + m01 * y + m02); - float ny = (float) (m10 * x + m10 * y + m12); - dstPts[dstOff] = nx; - dstPts[dstOff + 1] = ny; - dstOff += 2; - } - } - - public void transform (double[] srcPts, int srcOff, - double[] dstPts, int dstOff, - int num) - { - while (num-- > 0) - { - double x = srcPts[srcOff]; - double y = srcPts[srcOff + 1]; - srcOff += 2; - double nx = m00 * x + m01 * y + m02; - double ny = m10 * x + m10 * y + m12; - dstPts[dstOff] = nx; - dstPts[dstOff + 1] = ny; - dstOff += 2; - } - } - - public void transform (float[] srcPts, int srcOff, - double[] dstPts, int dstOff, - int num) - { - while (num-- > 0) - { - float x = srcPts[srcOff]; - float y = srcPts[srcOff + 1]; - srcOff += 2; - double nx = m00 * x + m01 * y + m02; - double ny = m10 * x + m10 * y + m12; - dstPts[dstOff] = nx; - dstPts[dstOff + 1] = ny; - dstOff += 2; - } - } - - public void transform (double[] srcPts, int srcOff, - float[] dstPts, int dstOff, - int num) - { - while (num-- > 0) - { - double x = srcPts[srcOff]; - double y = srcPts[srcOff + 1]; - srcOff += 2; - float nx = (float) (m00 * x + m01 * y + m02); - float ny = (float) (m10 * x + m10 * y + m12); - dstPts[dstOff] = nx; - dstPts[dstOff + 1] = ny; - dstOff += 2; - } - } - - public Point2D inverseTransform (Point2D src, Point2D dst) - throws NoninvertibleTransformException - { - double det = getDeterminant (); - if (det == 0) - throw new NoninvertibleTransformException ("couldn't invert transform"); - - if (dst == null) - dst = new Point2D.Double (); - double x = src.getX (); - double y = src.getY (); - double nx = (m11 * x + - m10 * y) / det; - double ny = (m01 * x + - m00 * y) / det; - dst.setLocation (nx, ny); - return dst; - } - - public void inverseTransform (double[] srcPts, int srcOff, - double[] dstPts, int dstOff, - int num) - throws NoninvertibleTransformException - { - double det = getDeterminant (); - if (det == 0) - throw new NoninvertibleTransformException ("couldn't invert transform"); - - while (num-- > 0) - { - double x = srcPts[srcOff]; - double y = srcPts[srcOff + 1]; - double nx = (m11 * x + - m10 * y) / det; - double ny = (m01 * x + - m00 * y) / det; - dstPts[dstOff] = nx; - dstPts[dstOff + 1] = ny; - dstOff += 2; - srcOff += 2; - } - } - - public Point2D deltaTransform (Point2D src, Point2D dst) - { - if (dst == null) - dst = new Point2D.Double (); - double x = src.getX (); - double y = src.getY (); - double nx = m00 * x + m01 * y; - double ny = m10 * x + m11 * y; - dst.setLocation (nx, ny); - return dst; - } - - public void deltaTransform (double[] srcPts, int srcOff, - double[] dstPts, int dstOff, - int num) - { - while (num-- > 0) - { - double x = srcPts[srcOff]; - double y = srcPts[srcOff + 1]; - double nx = m00 * x + m01 * y; - double ny = m10 * x + m11 * y; - dstPts[dstOff] = nx; - dstPts[dstOff + 1] = ny; - dstOff += 2; - srcOff += 2; - } - } - - public Shape createTransformedShape (Shape pSrc) - { - // FIXME - return null; - } - - public String toString () - { - // FIXME - return null; - } - - public boolean isIdentity () - { - return (m00 == 1 && m01 == 0 && m02 == 0 - && m10 == 0 && m11 == 1 && m12 == 0); - } - - public Object clone () - { - return new AffineTransform (this); - } - - public int hashCode () - { - // FIXME - return 23; - } - - public boolean equals (Object obj) - { - if (! (obj instanceof AffineTransform)) - return false; - AffineTransform t = (AffineTransform) obj; - return (m00 == t.m00 && m01 == t.m01 && m02 == t.m02 - && m10 == t.m10 && m11 == t.m11 && m12 == t.m12); - } - - // This iterator is used to apply an AffineTransform to some other - // iterator. It is not private because we want to be able to access - // it from the rest of this package. - class Iterator implements PathIterator - { - // The iterator we are applied to. - private PathIterator subIterator; - - public Iterator (PathIterator subIterator) - { - this.subIterator = subIterator; - } - - public int currentSegment (double[] coords) - { - int r = subIterator.currentSegment (coords); - int count = 0; - - switch (r) - { - case SEG_CUBICTO: - count = 3; - break; - - case SEG_QUADTO: - count = 2; - break; - - case SEG_LINETO: - case SEG_MOVETO: - count = 1; - break; - - default: - // Error. But how to report? - case SEG_CLOSE: - break; - } - - transform (coords, 0, coords, 0, count); - - return r; - } - - public int currentSegment (float[] coords) - { - int r = subIterator.currentSegment (coords); - int count = 0; - - switch (r) - { - case SEG_CUBICTO: - count = 3; - break; - - case SEG_QUADTO: - count = 2; - break; - - case SEG_LINETO: - case SEG_MOVETO: - count = 1; - break; - - default: - // Error. But how to report? - case SEG_CLOSE: - break; - } - - transform (coords, 0, coords, 0, count); - - return r; - } - - public int getWindingRule () - { - return subIterator.getWindingRule (); - } - - public boolean isDone () - { - return subIterator.isDone (); - } - - public void next () - { - subIterator.next (); - } - } - - private double m00, m01, m02; - private double m10, m11, m12; - private int type; -} |