19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  this work for additional information regarding copyright ownership.
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  the License.  You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @author Denis M. Kishenko
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @version $Revision$
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage java.awt.geom;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Shape;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.Serializable;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.internal.nls.Messages;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.misc.HashCode;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Class AffineTransform represents a linear transformation (rotation,
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scaling, or shear) followed by a translation that acts on a coordinate space.
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It preserves collinearity of points and ratios of distances between collinear
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * points: so if A, B, and C are on a line, then after the space has been
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * transformed via the affine transform, the images of the three points will
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * still be on a line, and the ratio of the distance from A to B with the
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distance from B to C will be the same as the corresponding ratio in the image
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * space.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @since Android 1.0
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AffineTransform implements Cloneable, Serializable {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant serialVersionUID.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final long serialVersionUID = 1330973210523860834L;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant TYPE_IDENTITY.
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TYPE_IDENTITY = 0;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant TYPE_TRANSLATION.
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TYPE_TRANSLATION = 1;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant TYPE_UNIFORM_SCALE.
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TYPE_UNIFORM_SCALE = 2;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant TYPE_GENERAL_SCALE.
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TYPE_GENERAL_SCALE = 4;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant TYPE_QUADRANT_ROTATION.
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TYPE_QUADRANT_ROTATION = 8;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant TYPE_GENERAL_ROTATION.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TYPE_GENERAL_ROTATION = 16;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant TYPE_GENERAL_TRANSFORM.
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TYPE_GENERAL_TRANSFORM = 32;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant TYPE_FLIP.
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TYPE_FLIP = 64;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant TYPE_MASK_SCALE.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TYPE_MASK_SCALE = TYPE_UNIFORM_SCALE | TYPE_GENERAL_SCALE;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant TYPE_MASK_ROTATION.
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TYPE_MASK_ROTATION = TYPE_QUADRANT_ROTATION | TYPE_GENERAL_ROTATION;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The <code>TYPE_UNKNOWN</code> is an initial type value.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int TYPE_UNKNOWN = -1;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The min value equivalent to zero. If absolute value less then ZERO it
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * considered as zero.
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final double ZERO = 1E-10;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The values of transformation matrix.
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    double m00;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The m10.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    double m10;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The m01.
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    double m01;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The m11.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    double m11;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The m02.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    double m02;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The m12.
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    double m12;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The transformation <code>type</code>.
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    transient int type;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instantiates a new affine transform of type <code>TYPE_IDENTITY</code>
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (which leaves coordinates unchanged).
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AffineTransform() {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type = TYPE_IDENTITY;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m00 = m11 = 1.0;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m10 = m01 = m02 = m12 = 0.0;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instantiates a new affine transform that has the same data as the given
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * AffineTransform.
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param t
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the transform to copy.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AffineTransform(AffineTransform t) {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.type = t.type;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m00 = t.m00;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m10 = t.m10;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m01 = t.m01;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m11 = t.m11;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m02 = t.m02;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m12 = t.m12;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instantiates a new affine transform by specifying the values of the 2x3
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transformation matrix as floats. The type is set to the default type:
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>TYPE_UNKNOWN</code>
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m00
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m00 entry in the transformation matrix.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m10
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m10 entry in the transformation matrix.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m01
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m01 entry in the transformation matrix.
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m11
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m11 entry in the transformation matrix.
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m02
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m02 entry in the transformation matrix.
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m12
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m12 entry in the transformation matrix.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AffineTransform(float m00, float m10, float m01, float m11, float m02, float m12) {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.type = TYPE_UNKNOWN;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m00 = m00;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m10 = m10;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m01 = m01;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m11 = m11;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m02 = m02;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m12 = m12;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instantiates a new affine transform by specifying the values of the 2x3
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transformation matrix as doubles. The type is set to the default type:
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>TYPE_UNKNOWN</code>
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m00
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m00 entry in the transformation matrix.
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m10
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m10 entry in the transformation matrix.
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m01
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m01 entry in the transformation matrix.
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m11
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m11 entry in the transformation matrix.
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m02
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m02 entry in the transformation matrix.
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m12
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m12 entry in the transformation matrix.
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12) {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.type = TYPE_UNKNOWN;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m00 = m00;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m10 = m10;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m01 = m01;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m11 = m11;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m02 = m02;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m12 = m12;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instantiates a new affine transform by reading the values of the
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transformation matrix from an array of floats. The mapping from the array
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the matrix starts with <code>matrix[0]</code> giving the top-left
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * entry of the matrix and proceeds with the usual left-to-right and
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top-down ordering.
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the array has only four entries, then the two entries of the last row
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the transformation matrix default to zero.
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param matrix
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of four or six floats giving the values of the
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            matrix.
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if the size of the array is 0, 1, 2, 3, or 5.
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AffineTransform(float[] matrix) {
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.type = TYPE_UNKNOWN;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m00 = matrix[0];
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m10 = matrix[1];
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m01 = matrix[2];
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m11 = matrix[3];
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (matrix.length > 4) {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m02 = matrix[4];
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m12 = matrix[5];
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instantiates a new affine transform by reading the values of the
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transformation matrix from an array of doubles. The mapping from the
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * array to the matrix starts with <code>matrix[0]</code> giving the
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top-left entry of the matrix and proceeds with the usual left-to-right
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and top-down ordering.
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the array has only four entries, then the two entries of the last row
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the transformation matrix default to zero.
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param matrix
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of four or six doubles giving the values of the
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            matrix.
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if the size of the array is 0, 1, 2, 3, or 5.
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AffineTransform(double[] matrix) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.type = TYPE_UNKNOWN;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m00 = matrix[0];
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m10 = matrix[1];
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m01 = matrix[2];
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m11 = matrix[3];
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (matrix.length > 4) {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m02 = matrix[4];
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m12 = matrix[5];
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns type of the affine transformation.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The type is computed as follows: Label the entries of the transformation
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * matrix as three rows (m00, m01), (m10, m11), and (m02, m12). Then if the
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * original basis vectors are (1, 0) and (0, 1), the new basis vectors after
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transformation are given by (m00, m01) and (m10, m11), and the
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * translation vector is (m02, m12).
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The types are classified as follows: <br/> TYPE_IDENTITY - no change<br/>
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TYPE_TRANSLATION - The translation vector isn't zero<br/>
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TYPE_UNIFORM_SCALE - The new basis vectors have equal length<br/>
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TYPE_GENERAL_SCALE - The new basis vectors dont' have equal length<br/>
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TYPE_FLIP - The new basis vector orientation differs from the original
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * one<br/> TYPE_QUADRANT_ROTATION - The new basis is a rotation of the
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * original by 90, 180, 270, or 360 degrees<br/> TYPE_GENERAL_ROTATION - The
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * new basis is a rotation of the original by an arbitrary angle<br/>
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TYPE_GENERAL_TRANSFORM - The transformation can't be inverted.<br/>
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that multiple types are possible, thus the types can be combined
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * using bitwise combinations.
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the type of the Affine Transform.
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getType() {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != TYPE_UNKNOWN) {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return type;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type = 0;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (m00 * m01 + m10 * m11 != 0.0) {
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type |= TYPE_GENERAL_TRANSFORM;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return type;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (m02 != 0.0 || m12 != 0.0) {
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type |= TYPE_TRANSLATION;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (m00 == 1.0 && m11 == 1.0 && m01 == 0.0 && m10 == 0.0) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type = TYPE_IDENTITY;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return type;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (m00 * m11 - m01 * m10 < 0.0) {
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type |= TYPE_FLIP;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double dx = m00 * m00 + m10 * m10;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double dy = m01 * m01 + m11 * m11;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dx != dy) {
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type |= TYPE_GENERAL_SCALE;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (dx != 1.0) {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type |= TYPE_UNIFORM_SCALE;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((m00 == 0.0 && m11 == 0.0) || (m10 == 0.0 && m01 == 0.0 && (m00 < 0.0 || m11 < 0.0))) {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type |= TYPE_QUADRANT_ROTATION;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (m01 != 0.0 || m10 != 0.0) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type |= TYPE_GENERAL_ROTATION;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return type;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the scale x entry of the transformation matrix (the upper left
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * matrix entry).
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the scale x value.
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double getScaleX() {
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m00;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the scale y entry of the transformation matrix (the lower right
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * entry of the linear transformation).
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the scale y value.
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double getScaleY() {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m11;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the shear x entry of the transformation matrix (the upper right
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * entry of the linear transformation).
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the shear x value.
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double getShearX() {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m01;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the shear y entry of the transformation matrix (the lower left entry
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the linear transformation).
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the shear y value.
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double getShearY() {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m10;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the x coordinate of the translation vector.
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the x coordinate of the translation vector.
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double getTranslateX() {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m02;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the y coordinate of the translation vector.
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the y coordinate of the translation vector.
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double getTranslateY() {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m12;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks if the AffineTransformation is the identity.
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true, if the AffineTransformation is the identity.
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isIdentity() {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getType() == TYPE_IDENTITY;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes the values of the transformation matrix into the given array of
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * doubles. If the array has length 4, only the linear transformation part
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be written into it. If it has length greater than 4, the translation
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * vector will be included as well.
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param matrix
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array to fill with the values of the matrix.
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if the size of the array is 0, 1, 2, 3, or 5.
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getMatrix(double[] matrix) {
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        matrix[0] = m00;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        matrix[1] = m10;
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        matrix[2] = m01;
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        matrix[3] = m11;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (matrix.length > 4) {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix[4] = m02;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix[5] = m12;
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the determinant of the linear transformation matrix.
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the determinant of the linear transformation matrix.
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double getDeterminant() {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m00 * m11 - m01 * m10;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the transform in terms of a list of double values.
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m00
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m00 coordinate of the transformation matrix.
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m10
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m10 coordinate of the transformation matrix.
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m01
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m01 coordinate of the transformation matrix.
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m11
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m11 coordinate of the transformation matrix.
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m02
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m02 coordinate of the transformation matrix.
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param m12
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the m12 coordinate of the transformation matrix.
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTransform(double m00, double m10, double m01, double m11, double m02, double m12) {
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.type = TYPE_UNKNOWN;
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m00 = m00;
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m10 = m10;
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m01 = m01;
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m11 = m11;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m02 = m02;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.m12 = m12;
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the transform's data to match the data of the transform sent as a
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * parameter.
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param t
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the transform that gives the new values.
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTransform(AffineTransform t) {
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type = t.type;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setTransform(t.m00, t.m10, t.m01, t.m11, t.m02, t.m12);
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the transform to the identity transform.
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setToIdentity() {
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type = TYPE_IDENTITY;
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m00 = m11 = 1.0;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m10 = m01 = m02 = m12 = 0.0;
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the transformation to a translation alone. Sets the linear part of
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the transformation to identity and the translation vector to the values
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * sent as parameters. Sets the type to <code>TYPE_IDENTITY</code> if the
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resulting AffineTransformation is the identity transformation, otherwise
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * sets it to <code>TYPE_TRANSLATION</code>.
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mx
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the distance to translate in the x direction.
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param my
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the distance to translate in the y direction.
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setToTranslation(double mx, double my) {
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m00 = m11 = 1.0;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m01 = m10 = 0.0;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m02 = mx;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m12 = my;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mx == 0.0 && my == 0.0) {
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type = TYPE_IDENTITY;
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type = TYPE_TRANSLATION;
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the transformation to being a scale alone, eliminating rotation,
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * shear, and translation elements. Sets the type to
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>TYPE_IDENTITY</code> if the resulting AffineTransformation is the
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * identity transformation, otherwise sets it to <code>TYPE_UNKNOWN</code>.
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scx
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the scaling factor in the x direction.
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scy
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the scaling factor in the y direction.
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setToScale(double scx, double scy) {
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m00 = scx;
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m11 = scy;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m10 = m01 = m02 = m12 = 0.0;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scx != 1.0 || scy != 1.0) {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type = TYPE_UNKNOWN;
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type = TYPE_IDENTITY;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the transformation to being a shear alone, eliminating rotation,
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scaling, and translation elements. Sets the type to
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>TYPE_IDENTITY</code> if the resulting AffineTransformation is the
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * identity transformation, otherwise sets it to <code>TYPE_UNKNOWN</code>.
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param shx
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the shearing factor in the x direction.
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param shy
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the shearing factor in the y direction.
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setToShear(double shx, double shy) {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m00 = m11 = 1.0;
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m02 = m12 = 0.0;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m01 = shx;
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m10 = shy;
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (shx != 0.0 || shy != 0.0) {
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type = TYPE_UNKNOWN;
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            type = TYPE_IDENTITY;
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the transformation to being a rotation alone, eliminating shearing,
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scaling, and translation elements. Sets the type to
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>TYPE_IDENTITY</code> if the resulting AffineTransformation is the
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * identity transformation, otherwise sets it to <code>TYPE_UNKNOWN</code>.
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param angle
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the angle of rotation in radians.
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setToRotation(double angle) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double sin = Math.sin(angle);
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cos = Math.cos(angle);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Math.abs(cos) < ZERO) {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cos = 0.0;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sin = sin > 0.0 ? 1.0 : -1.0;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (Math.abs(sin) < ZERO) {
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sin = 0.0;
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cos = cos > 0.0 ? 1.0 : -1.0;
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m00 = m11 = cos;
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m01 = -sin;
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m10 = sin;
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m02 = m12 = 0.0;
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type = TYPE_UNKNOWN;
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the transformation to being a rotation followed by a translation.
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the type to <code>TYPE_UNKNOWN</code>.
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param angle
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the angle of rotation in radians.
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param px
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the distance to translate in the x direction.
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param py
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the distance to translate in the y direction.
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setToRotation(double angle, double px, double py) {
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setToRotation(angle);
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m02 = px * (1.0 - m00) + py * m10;
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m12 = py * (1.0 - m00) - px * m10;
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type = TYPE_UNKNOWN;
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new AffineTransformation that is a translation alone with the
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * translation vector given by the values sent as parameters. The new
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transformation's type is <code>TYPE_IDENTITY</code> if the
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * AffineTransformation is the identity transformation, otherwise it's
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>TYPE_TRANSLATION</code>.
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mx
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the distance to translate in the x direction.
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param my
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the distance to translate in the y direction.
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the new AffineTransformation.
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static AffineTransform getTranslateInstance(double mx, double my) {
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AffineTransform t = new AffineTransform();
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        t.setToTranslation(mx, my);
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return t;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new AffineTransformation that is a scale alone. The new
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transformation's type is <code>TYPE_IDENTITY</code> if the
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * AffineTransformation is the identity transformation, otherwise it's
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>TYPE_UNKNOWN</code>.
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scx
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the scaling factor in the x direction.
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scY
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the scaling factor in the y direction.
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the new AffineTransformation.
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static AffineTransform getScaleInstance(double scx, double scY) {
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AffineTransform t = new AffineTransform();
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        t.setToScale(scx, scY);
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return t;
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new AffineTransformation that is a shear alone. The new
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transformation's type is <code>TYPE_IDENTITY</code> if the
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * AffineTransformation is the identity transformation, otherwise it's
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>TYPE_UNKNOWN</code>.
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param shx
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the shearing factor in the x direction.
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param shy
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the shearing factor in the y direction.
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the new AffineTransformation.
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static AffineTransform getShearInstance(double shx, double shy) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AffineTransform m = new AffineTransform();
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m.setToShear(shx, shy);
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new AffineTransformation that is a rotation alone. The new
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transformation's type is <code>TYPE_IDENTITY</code> if the
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * AffineTransformation is the identity transformation, otherwise it's
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>TYPE_UNKNOWN</code>.
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param angle
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the angle of rotation in radians.
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the new AffineTransformation.
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static AffineTransform getRotateInstance(double angle) {
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AffineTransform t = new AffineTransform();
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        t.setToRotation(angle);
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return t;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new AffineTransformation that is a rotation followed by a
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * translation. Sets the type to <code>TYPE_UNKNOWN</code>.
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param angle
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the angle of rotation in radians.
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the distance to translate in the x direction.
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the distance to translate in the y direction.
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the new AffineTransformation.
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static AffineTransform getRotateInstance(double angle, double x, double y) {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AffineTransform t = new AffineTransform();
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        t.setToRotation(angle, x, y);
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return t;
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies a translation to this AffineTransformation.
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mx
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the distance to translate in the x direction.
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param my
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the distance to translate in the y direction.
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void translate(double mx, double my) {
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        concatenate(AffineTransform.getTranslateInstance(mx, my));
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies a scaling transformation to this AffineTransformation.
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scx
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the scaling factor in the x direction.
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scy
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the scaling factor in the y direction.
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void scale(double scx, double scy) {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        concatenate(AffineTransform.getScaleInstance(scx, scy));
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies a shearing transformation to this AffineTransformation.
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param shx
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the shearing factor in the x direction.
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param shy
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the shearing factor in the y direction.
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void shear(double shx, double shy) {
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        concatenate(AffineTransform.getShearInstance(shx, shy));
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies a rotation transformation to this AffineTransformation.
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param angle
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the angle of rotation in radians.
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void rotate(double angle) {
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        concatenate(AffineTransform.getRotateInstance(angle));
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies a rotation and translation transformation to this
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * AffineTransformation.
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param angle
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the angle of rotation in radians.
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param px
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the distance to translate in the x direction.
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param py
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the distance to translate in the y direction.
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void rotate(double angle, double px, double py) {
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        concatenate(AffineTransform.getRotateInstance(angle, px, py));
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Multiplies the matrix representations of two AffineTransform objects.
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param t1
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            - the AffineTransform object is a multiplicand
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param t2
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            - the AffineTransform object is a multiplier
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return an AffineTransform object that is the result of t1 multiplied by
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         the matrix t2.
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AffineTransform multiply(AffineTransform t1, AffineTransform t2) {
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new AffineTransform(t1.m00 * t2.m00 + t1.m10 * t2.m01, // m00
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t1.m00 * t2.m10 + t1.m10 * t2.m11, // m01
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t1.m01 * t2.m00 + t1.m11 * t2.m01, // m10
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t1.m01 * t2.m10 + t1.m11 * t2.m11, // m11
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t1.m02 * t2.m00 + t1.m12 * t2.m01 + t2.m02, // m02
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t1.m02 * t2.m10 + t1.m12 * t2.m11 + t2.m12);// m12
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies the given AffineTransform to this AffineTransform via matrix
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * multiplication.
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param t
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the AffineTransform to apply to this AffineTransform.
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void concatenate(AffineTransform t) {
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setTransform(multiply(t, this));
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Changes the current AffineTransform the one obtained by taking the
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transform t and applying this AffineTransform to it.
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param t
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the AffineTransform that this AffineTransform is multiplied
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            by.
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void preConcatenate(AffineTransform t) {
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setTransform(multiply(this, t));
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates an AffineTransform that is the inverse of this transform.
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the affine transform that is the inverse of this AffineTransform.
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NoninvertibleTransformException
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if this AffineTransform cannot be inverted (the determinant
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             of the linear transformation part is zero).
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AffineTransform createInverse() throws NoninvertibleTransformException {
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double det = getDeterminant();
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Math.abs(det) < ZERO) {
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.204=Determinant is zero
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NoninvertibleTransformException(Messages.getString("awt.204")); //$NON-NLS-1$
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new AffineTransform(m11 / det, // m00
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                -m10 / det, // m10
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                -m01 / det, // m01
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m00 / det, // m11
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (m01 * m12 - m11 * m02) / det, // m02
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (m10 * m02 - m00 * m12) / det // m12
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        );
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Apply the current AffineTransform to the point.
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the original point.
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            Point2D object to be filled with the destination coordinates
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            (where the original point is sent by this AffineTransform).
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            May be null.
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the point in the AffineTransform's image space where the original
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         point is sent.
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Point2D transform(Point2D src, Point2D dst) {
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dst == null) {
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (src instanceof Point2D.Double) {
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dst = new Point2D.Double();
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dst = new Point2D.Float();
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double x = src.getX();
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double y = src.getY();
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dst.setLocation(x * m00 + y * m01 + m02, x * m10 + y * m11 + m12);
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return dst;
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies this AffineTransform to an array of points.
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of points to be transformed.
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param srcOff
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the source point array of the first point to be
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            transformed.
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the point array where the images of the points (after applying
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the AffineTransformation) should be placed.
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dstOff
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the destination array where the new values
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should be written.
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param length
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the number of points to transform.
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if <code>srcOff + length > src.length</code> or
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             <code>dstOff + length > dst.length</code>.
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void transform(Point2D[] src, int srcOff, Point2D[] dst, int dstOff, int length) {
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (--length >= 0) {
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Point2D srcPoint = src[srcOff++];
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double x = srcPoint.getX();
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double y = srcPoint.getY();
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Point2D dstPoint = dst[dstOff];
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dstPoint == null) {
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (srcPoint instanceof Point2D.Double) {
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dstPoint = new Point2D.Double();
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dstPoint = new Point2D.Float();
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dstPoint.setLocation(x * m00 + y * m01 + m02, x * m10 + y * m11 + m12);
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff++] = dstPoint;
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies this AffineTransform to a set of points given as an array of
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * double values where every two values in the array give the coordinates of
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a point; the even-indexed values giving the x coordinates and the
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * odd-indexed values giving the y coordinates.
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of points to be transformed.
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param srcOff
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the source point array of the first point to be
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            transformed.
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the point array where the images of the points (after applying
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the AffineTransformation) should be placed.
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dstOff
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the destination array where the new values
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should be written.
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param length
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the number of points to transform.
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if <code>srcOff + length*2 > src.length</code> or
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             <code>dstOff + length*2 > dst.length</code>.
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void transform(double[] src, int srcOff, double[] dst, int dstOff, int length) {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int step = 2;
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (src == dst && srcOff < dstOff && dstOff < srcOff + length * 2) {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            srcOff = srcOff + length * 2 - 2;
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dstOff = dstOff + length * 2 - 2;
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            step = -2;
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (--length >= 0) {
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double x = src[srcOff + 0];
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double y = src[srcOff + 1];
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff + 0] = x * m00 + y * m01 + m02;
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff + 1] = x * m10 + y * m11 + m12;
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            srcOff += step;
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dstOff += step;
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies this AffineTransform to a set of points given as an array of
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * float values where every two values in the array give the coordinates of
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a point; the even-indexed values giving the x coordinates and the
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * odd-indexed values giving the y coordinates.
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of points to be transformed.
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param srcOff
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the source point array of the first point to be
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            transformed.
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the point array where the images of the points (after applying
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the AffineTransformation) should be placed.
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dstOff
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the destination array where the new values
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should be written.
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param length
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the number of points to transform.
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if <code>srcOff + length*2 > src.length</code> or
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             <code>dstOff + length*2 > dst.length</code>.
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void transform(float[] src, int srcOff, float[] dst, int dstOff, int length) {
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int step = 2;
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (src == dst && srcOff < dstOff && dstOff < srcOff + length * 2) {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            srcOff = srcOff + length * 2 - 2;
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dstOff = dstOff + length * 2 - 2;
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            step = -2;
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (--length >= 0) {
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float x = src[srcOff + 0];
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float y = src[srcOff + 1];
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff + 0] = (float)(x * m00 + y * m01 + m02);
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff + 1] = (float)(x * m10 + y * m11 + m12);
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            srcOff += step;
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dstOff += step;
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies this AffineTransform to a set of points given as an array of
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * float values where every two values in the array give the coordinates of
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a point; the even-indexed values giving the x coordinates and the
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * odd-indexed values giving the y coordinates. The destination coordinates
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are given as values of type <code>double</code>.
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of points to be transformed.
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param srcOff
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the source point array of the first point to be
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            transformed.
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the point array where the images of the points (after applying
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the AffineTransformation) should be placed.
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dstOff
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the destination array where the new values
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should be written.
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param length
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the number of points to transform.
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if <code>srcOff + length*2 > src.length</code> or
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             <code>dstOff + length*2 > dst.length</code>.
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void transform(float[] src, int srcOff, double[] dst, int dstOff, int length) {
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (--length >= 0) {
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float x = src[srcOff++];
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float y = src[srcOff++];
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff++] = x * m00 + y * m01 + m02;
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff++] = x * m10 + y * m11 + m12;
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies this AffineTransform to a set of points given as an array of
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * double values where every two values in the array give the coordinates of
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a point; the even-indexed values giving the x coordinates and the
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * odd-indexed values giving the y coordinates. The destination coordinates
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are given as values of type <code>float</code>.
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of points to be transformed.
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param srcOff
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the source point array of the first point to be
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            transformed.
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the point array where the images of the points (after applying
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the AffineTransformation) should be placed.
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dstOff
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the destination array where the new values
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should be written.
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param length
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the number of points to transform.
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if <code>srcOff + length*2 > src.length</code> or
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             <code>dstOff + length*2 > dst.length</code>.
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void transform(double[] src, int srcOff, float[] dst, int dstOff, int length) {
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (--length >= 0) {
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double x = src[srcOff++];
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double y = src[srcOff++];
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff++] = (float)(x * m00 + y * m01 + m02);
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff++] = (float)(x * m10 + y * m11 + m12);
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Transforms the point according to the linear transformation part of this
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * AffineTransformation (without applying the translation).
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the original point.
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the point object where the result of the delta transform is
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            written.
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the result of applying the delta transform (linear part only) to
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         the original point.
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: is this right? if dst is null, we check what it's an
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // instance of? Shouldn't it be src instanceof Point2D.Double?
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Point2D deltaTransform(Point2D src, Point2D dst) {
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dst == null) {
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dst instanceof Point2D.Double) {
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dst = new Point2D.Double();
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dst = new Point2D.Float();
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double x = src.getX();
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double y = src.getY();
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dst.setLocation(x * m00 + y * m01, x * m10 + y * m11);
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return dst;
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies the linear transformation part of this AffineTransform (ignoring
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the translation part) to a set of points given as an array of double
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values where every two values in the array give the coordinates of a
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * point; the even-indexed values giving the x coordinates and the
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * odd-indexed values giving the y coordinates.
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of points to be transformed.
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param srcOff
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the source point array of the first point to be
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            transformed.
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the point array where the images of the points (after applying
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the delta transformation) should be placed.
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dstOff
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the destination array where the new values
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should be written.
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param length
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the number of points to transform.
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if <code>srcOff + length*2 > src.length</code> or
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             <code>dstOff + length*2 > dst.length</code>.
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void deltaTransform(double[] src, int srcOff, double[] dst, int dstOff, int length) {
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (--length >= 0) {
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double x = src[srcOff++];
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double y = src[srcOff++];
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff++] = x * m00 + y * m01;
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff++] = x * m10 + y * m11;
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Transforms the point according to the inverse of this
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * AffineTransformation.
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the original point.
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the point object where the result of the inverse transform is
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            written (may be null).
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the result of applying the inverse transform. Inverse transform.
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NoninvertibleTransformException
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if this AffineTransform cannot be inverted (the determinant
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             of the linear transformation part is zero).
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Point2D inverseTransform(Point2D src, Point2D dst)
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NoninvertibleTransformException {
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double det = getDeterminant();
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Math.abs(det) < ZERO) {
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.204=Determinant is zero
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NoninvertibleTransformException(Messages.getString("awt.204")); //$NON-NLS-1$
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dst == null) {
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (src instanceof Point2D.Double) {
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dst = new Point2D.Double();
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dst = new Point2D.Float();
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double x = src.getX() - m02;
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double y = src.getY() - m12;
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dst.setLocation((x * m11 - y * m01) / det, (y * m00 - x * m10) / det);
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return dst;
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applies the inverse of this AffineTransform to a set of points given as
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an array of double values where every two values in the array give the
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * coordinates of a point; the even-indexed values giving the x coordinates
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the odd-indexed values giving the y coordinates.
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of points to be transformed.
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param srcOff
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the source point array of the first point to be
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            transformed.
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the point array where the images of the points (after applying
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the inverse of the AffineTransformation) should be placed.
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dstOff
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the destination array where the new values
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should be written.
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param length
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the number of points to transform.
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if <code>srcOff + length*2 > src.length</code> or
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             <code>dstOff + length*2 > dst.length</code>.
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NoninvertibleTransformException
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if this AffineTransform cannot be inverted (the determinant
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             of the linear transformation part is zero).
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void inverseTransform(double[] src, int srcOff, double[] dst, int dstOff, int length)
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NoninvertibleTransformException {
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double det = getDeterminant();
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Math.abs(det) < ZERO) {
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.204=Determinant is zero
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NoninvertibleTransformException(Messages.getString("awt.204")); //$NON-NLS-1$
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (--length >= 0) {
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double x = src[srcOff++] - m02;
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double y = src[srcOff++] - m12;
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff++] = (x * m11 - y * m01) / det;
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dst[dstOff++] = (y * m00 - x * m10) / det;
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new shape whose data is given by applying this AffineTransform
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the specified shape.
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the original shape whose data is to be transformed.
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the new shape found by applying this AffineTransform to the
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         original shape.
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Shape createTransformedShape(Shape src) {
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (src == null) {
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (src instanceof GeneralPath) {
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ((GeneralPath)src).createTransformedShape(this);
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PathIterator path = src.getPathIterator(this);
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GeneralPath dst = new GeneralPath(path.getWindingRule());
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dst.append(path, false);
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return dst;
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getClass().getName() + "[[" + m00 + ", " + m01 + ", " + m02 + "], [" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + m10 + ", " + m11 + ", " + m12 + "]]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object clone() {
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return super.clone();
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CloneNotSupportedException e) {
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new InternalError();
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int hashCode() {
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        HashCode hash = new HashCode();
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        hash.append(m00);
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        hash.append(m01);
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        hash.append(m02);
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        hash.append(m10);
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        hash.append(m11);
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        hash.append(m12);
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return hash.hashCode();
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean equals(Object obj) {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (obj == this) {
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (obj instanceof AffineTransform) {
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AffineTransform t = (AffineTransform)obj;
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return m00 == t.m00 && m01 == t.m01 && m02 == t.m02 && m10 == t.m10 && m11 == t.m11
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && m12 == t.m12;
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes the AffineTrassform object to the output steam.
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param stream
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            - the output stream.
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IOException
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             - if there are I/O errors while writing to the output stream.
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void writeObject(java.io.ObjectOutputStream stream) throws IOException {
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stream.defaultWriteObject();
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Read the AffineTransform object from the input stream.
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param stream
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            - the input stream.
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IOException
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             - if there are I/O errors while reading from the input
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             stream.
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ClassNotFoundException
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             - if class could not be found.
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readObject(java.io.ObjectInputStream stream) throws IOException,
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ClassNotFoundException {
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stream.defaultReadObject();
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        type = TYPE_UNKNOWN;
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1268