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