19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter;
201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Matrix class holds a 3x3 matrix for transforming coordinates.
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Matrix does not have a constructor, so it must be explicitly initialized
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using either reset() - to construct an identity matrix, or one of the set..()
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * functions (e.g. setTranslate, setRotate, etc.).
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Matrix {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MSCALE_X = 0;   //!< use with getValues/setValues
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MSKEW_X  = 1;   //!< use with getValues/setValues
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MTRANS_X = 2;   //!< use with getValues/setValues
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MSKEW_Y  = 3;   //!< use with getValues/setValues
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MSCALE_Y = 4;   //!< use with getValues/setValues
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MTRANS_Y = 5;   //!< use with getValues/setValues
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MPERSP_0 = 6;   //!< use with getValues/setValues
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MPERSP_1 = 7;   //!< use with getValues/setValues
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MPERSP_2 = 8;   //!< use with getValues/setValues
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn    /** @hide */
41ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn    public static Matrix IDENTITY_MATRIX = new Matrix() {
42ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        void oops() {
43ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            throw new IllegalStateException("Matrix can not be modified");
44ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
45ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
46ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
47ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public void set(Matrix src) {
48ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
49ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
50ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
51ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
52ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public void reset() {
53ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
54ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
55ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
56ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
57ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public void setTranslate(float dx, float dy) {
58ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
59ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
60ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
61ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
62ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public void setScale(float sx, float sy, float px, float py) {
63ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
64ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
65ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
66ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
67ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public void setScale(float sx, float sy) {
68ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
69ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
70ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
71ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
72ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public void setRotate(float degrees, float px, float py) {
73ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
74ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
75ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
76ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
77ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public void setRotate(float degrees) {
78ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
79ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
80ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
81ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
82ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public void setSinCos(float sinValue, float cosValue, float px, float py) {
83ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
84ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
85ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
86ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
87ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public void setSinCos(float sinValue, float cosValue) {
88ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
89ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
90ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
91ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
92ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public void setSkew(float kx, float ky, float px, float py) {
93ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
94ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
95ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
96ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
97ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public void setSkew(float kx, float ky) {
98ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
99ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
100ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
101ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
102ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean setConcat(Matrix a, Matrix b) {
103ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
104ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
105ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
106ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
107ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
108ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean preTranslate(float dx, float dy) {
109ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
110ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
111ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
112ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
113ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
114ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean preScale(float sx, float sy, float px, float py) {
115ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
116ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
117ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
118ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
119ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
120ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean preScale(float sx, float sy) {
121ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
122ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
123ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
124ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
125ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
126ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean preRotate(float degrees, float px, float py) {
127ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
128ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
129ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
130ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
131ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
132ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean preRotate(float degrees) {
133ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
134ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
135ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
136ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
137ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
138ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean preSkew(float kx, float ky, float px, float py) {
139ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
140ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
141ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
142ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
143ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
144ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean preSkew(float kx, float ky) {
145ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
146ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
147ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
148ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
149ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
150ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean preConcat(Matrix other) {
151ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
152ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
153ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
154ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
155ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
156ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean postTranslate(float dx, float dy) {
157ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
158ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
159ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
160ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
161ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
162ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean postScale(float sx, float sy, float px, float py) {
163ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
164ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
165ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
166ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
167ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
168ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean postScale(float sx, float sy) {
169ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
170ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
171ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
172ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
173ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
174ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean postRotate(float degrees, float px, float py) {
175ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
176ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
177ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
178ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
179ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
180ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean postRotate(float degrees) {
181ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
182ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
183ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
184ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
185ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
186ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean postSkew(float kx, float ky, float px, float py) {
187ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
188ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
189ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
190ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
191ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
192ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean postSkew(float kx, float ky) {
193ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
194ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
195ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
196ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
197ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
198ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean postConcat(Matrix other) {
199ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
200ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
201ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
202ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
203ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
204ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean setRectToRect(RectF src, RectF dst, ScaleToFit stf) {
205ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
206ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
207ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
208ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
209ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
210ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public boolean setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex,
211ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn                int pointCount) {
212ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
213ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            return false;
214ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
215ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
216ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        @Override
217ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        public void setValues(float[] values) {
218ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn            oops();
219ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn        }
220ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn    };
221ddb715b238c098d8b561a44b9687f0bc67a4c141Dianne Hackborn
222f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    /**
223f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy     * @hide
224f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy     */
225f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    public int native_instance;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create an identity matrix
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Matrix() {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_instance = native_create(0);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a matrix that is a (deep) copy of src
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src The matrix to copy into this matrix
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Matrix(Matrix src) {
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_instance = native_create(src != null ? src.native_instance : 0);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if the matrix is identity.
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This maybe faster than testing if (getType() == 0)
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isIdentity() {
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_isIdentity(native_instance);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if will map a rectangle to another rectangle. This can be
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * true if the matrix is identity, scale-only, or rotates a multiple of 90
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * degrees.
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean rectStaysRect() {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_rectStaysRect(native_instance);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (deep) copy the src matrix into this matrix. If src is null, reset this
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * matrix to the identity matrix.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void set(Matrix src) {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (src == null) {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reset();
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            native_set(native_instance, src.native_instance);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Returns true iff obj is a Matrix and its values equal our values.
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    */
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean equals(Object obj) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return obj != null &&
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               obj instanceof Matrix &&
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               native_equals(native_instance, ((Matrix)obj).native_instance);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Set the matrix to identity */
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void reset() {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_reset(native_instance);
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Set the matrix to translate by (dx, dy). */
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTranslate(float dx, float dy) {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setTranslate(native_instance, dx, dy);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the matrix to scale by sx and sy, with a pivot point at (px, py).
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The pivot point is the coordinate that should remain unchanged by the
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specified transformation.
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setScale(float sx, float sy, float px, float py) {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setScale(native_instance, sx, sy, px, py);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Set the matrix to scale by sx and sy. */
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setScale(float sx, float sy) {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setScale(native_instance, sx, sy);
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the matrix to rotate by the specified number of degrees, with a pivot
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * point at (px, py). The pivot point is the coordinate that should remain
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unchanged by the specified transformation.
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRotate(float degrees, float px, float py) {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setRotate(native_instance, degrees, px, py);
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the matrix to rotate about (0,0) by the specified number of degrees.
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRotate(float degrees) {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setRotate(native_instance, degrees);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the matrix to rotate by the specified sine and cosine values, with a
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pivot point at (px, py). The pivot point is the coordinate that should
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * remain unchanged by the specified transformation.
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSinCos(float sinValue, float cosValue, float px, float py) {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setSinCos(native_instance, sinValue, cosValue, px, py);
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Set the matrix to rotate by the specified sine and cosine values. */
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSinCos(float sinValue, float cosValue) {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setSinCos(native_instance, sinValue, cosValue);
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the matrix to skew by sx and sy, with a pivot point at (px, py).
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The pivot point is the coordinate that should remain unchanged by the
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specified transformation.
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSkew(float kx, float ky, float px, float py) {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setSkew(native_instance, kx, ky, px, py);
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Set the matrix to skew by sx and sy. */
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSkew(float kx, float ky) {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setSkew(native_instance, kx, ky);
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the matrix to the concatenation of the two specified matrices,
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returning true if the the result can be represented. Either of the two
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * matrices may also be the target matrix. this = a * b
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean setConcat(Matrix a, Matrix b) {
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_setConcat(native_instance, a.native_instance,
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                b.native_instance);
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preconcats the matrix with the specified translation.
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = M * T(dx, dy)
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean preTranslate(float dx, float dy) {
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_preTranslate(native_instance, dx, dy);
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preconcats the matrix with the specified scale.
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = M * S(sx, sy, px, py)
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean preScale(float sx, float sy, float px, float py) {
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_preScale(native_instance, sx, sy, px, py);
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preconcats the matrix with the specified scale.
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = M * S(sx, sy)
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean preScale(float sx, float sy) {
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_preScale(native_instance, sx, sy);
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preconcats the matrix with the specified rotation.
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = M * R(degrees, px, py)
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean preRotate(float degrees, float px, float py) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_preRotate(native_instance, degrees, px, py);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preconcats the matrix with the specified rotation.
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = M * R(degrees)
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean preRotate(float degrees) {
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_preRotate(native_instance, degrees);
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preconcats the matrix with the specified skew.
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = M * K(kx, ky, px, py)
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean preSkew(float kx, float ky, float px, float py) {
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_preSkew(native_instance, kx, ky, px, py);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preconcats the matrix with the specified skew.
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = M * K(kx, ky)
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean preSkew(float kx, float ky) {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_preSkew(native_instance, kx, ky);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Preconcats the matrix with the specified matrix.
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = M * other
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean preConcat(Matrix other) {
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_preConcat(native_instance, other.native_instance);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Postconcats the matrix with the specified translation.
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = T(dx, dy) * M
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean postTranslate(float dx, float dy) {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_postTranslate(native_instance, dx, dy);
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Postconcats the matrix with the specified scale.
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = S(sx, sy, px, py) * M
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean postScale(float sx, float sy, float px, float py) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_postScale(native_instance, sx, sy, px, py);
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Postconcats the matrix with the specified scale.
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = S(sx, sy) * M
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean postScale(float sx, float sy) {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_postScale(native_instance, sx, sy);
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Postconcats the matrix with the specified rotation.
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = R(degrees, px, py) * M
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean postRotate(float degrees, float px, float py) {
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_postRotate(native_instance, degrees, px, py);
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Postconcats the matrix with the specified rotation.
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = R(degrees) * M
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean postRotate(float degrees) {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_postRotate(native_instance, degrees);
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Postconcats the matrix with the specified skew.
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = K(kx, ky, px, py) * M
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean postSkew(float kx, float ky, float px, float py) {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_postSkew(native_instance, kx, ky, px, py);
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Postconcats the matrix with the specified skew.
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = K(kx, ky) * M
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean postSkew(float kx, float ky) {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_postSkew(native_instance, kx, ky);
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Postconcats the matrix with the specified matrix.
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * M' = other * M
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean postConcat(Matrix other) {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_postConcat(native_instance, other.native_instance);
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Controlls how the src rect should align into the dst rect for
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setRectToRect().
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    */
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public enum ScaleToFit {
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Scale in X and Y independently, so that src matches dst exactly.
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This may change the aspect ratio of the src.
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FILL    (0),
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Compute a scale that will maintain the original src aspect ratio,
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * but will also ensure that src fits entirely inside dst. At least one
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * axis (X or Y) will fit exactly. START aligns the result to the
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * left and top edges of dst.
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        START   (1),
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Compute a scale that will maintain the original src aspect ratio,
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * but will also ensure that src fits entirely inside dst. At least one
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * axis (X or Y) will fit exactly. The result is centered inside dst.
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CENTER  (2),
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Compute a scale that will maintain the original src aspect ratio,
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * but will also ensure that src fits entirely inside dst. At least one
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * axis (X or Y) will fit exactly. END aligns the result to the
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * right and bottom edges of dst.
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        END     (3);
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the native values must match those in SkMatrix.h
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ScaleToFit(int nativeInt) {
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.nativeInt = nativeInt;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int nativeInt;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the matrix to the scale and translate values that map the source
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * rectangle to the destination rectangle, returning true if the the result
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can be represented.
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src the source rectangle to map from.
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst the destination rectangle to map to.
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param stf the ScaleToFit option
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the matrix can be represented by the rectangle mapping.
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean setRectToRect(RectF src, RectF dst, ScaleToFit stf) {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dst == null || src == null) {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NullPointerException();
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_setRectToRect(native_instance, src, dst, stf.nativeInt);
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // private helper to perform range checks on arrays of "points"
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void checkPointArrays(float[] src, int srcIndex,
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                         float[] dst, int dstIndex,
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                         int pointCount) {
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // check for too-small and too-big indices
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int srcStop = srcIndex + (pointCount << 1);
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int dstStop = dstIndex + (pointCount << 1);
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((pointCount | srcIndex | dstIndex | srcStop | dstStop) < 0 ||
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                srcStop > src.length || dstStop > dst.length) {
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the matrix such that the specified src points would map to the
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specified dst points. The "points" are represented as an array of floats,
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * order [x0, y0, x1, y1, ...], where each "point" is 2 float values.
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src   The array of src [x,y] pairs (points)
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param srcIndex Index of the first pair of src values
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst   The array of dst [x,y] pairs (points)
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dstIndex Index of the first pair of dst values
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pointCount The number of pairs/points to be used. Must be [0..4]
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the matrix was set to the specified transformation
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean setPolyToPoly(float[] src, int srcIndex,
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                 float[] dst, int dstIndex,
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                 int pointCount) {
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pointCount > 4) {
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException();
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkPointArrays(src, srcIndex, dst, dstIndex, pointCount);
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_setPolyToPoly(native_instance, src, srcIndex,
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    dst, dstIndex, pointCount);
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If this matrix can be inverted, return true and if inverse is not null,
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set inverse to be the inverse of this matrix. If this matrix cannot be
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inverted, ignore inverse and return false.
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean invert(Matrix inverse) {
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_invert(native_instance, inverse.native_instance);
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    * Apply this matrix to the array of 2D points specified by src, and write
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the transformed points into the array of points specified by dst. The
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * two arrays represent their "points" as pairs of floats [x, y].
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst   The array of dst points (x,y pairs)
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dstIndex The index of the first [x,y] pair of dst floats
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src   The array of src points (x,y pairs)
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param srcIndex The index of the first [x,y] pair of src floats
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pointCount The number of points (x,y pairs) to transform
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void mapPoints(float[] dst, int dstIndex, float[] src, int srcIndex,
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          int pointCount) {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkPointArrays(src, srcIndex, dst, dstIndex, pointCount);
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_mapPoints(native_instance, dst, dstIndex, src, srcIndex,
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         pointCount, true);
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    * Apply this matrix to the array of 2D vectors specified by src, and write
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the transformed vectors into the array of vectors specified by dst. The
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * two arrays represent their "vectors" as pairs of floats [x, y].
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6073a58ec108bb430b81a328adb2062035f860159b4Adam Cohen     * Note: this method does not apply the translation associated with the matrix. Use
6083a58ec108bb430b81a328adb2062035f860159b4Adam Cohen     * {@link Matrix#mapPoints(float[], int, float[], int, int)} if you want the translation
6093a58ec108bb430b81a328adb2062035f860159b4Adam Cohen     * to be applied.
6103a58ec108bb430b81a328adb2062035f860159b4Adam Cohen     *
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst   The array of dst vectors (x,y pairs)
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dstIndex The index of the first [x,y] pair of dst floats
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src   The array of src vectors (x,y pairs)
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param srcIndex The index of the first [x,y] pair of src floats
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param vectorCount The number of vectors (x,y pairs) to transform
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void mapVectors(float[] dst, int dstIndex, float[] src, int srcIndex,
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          int vectorCount) {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkPointArrays(src, srcIndex, dst, dstIndex, vectorCount);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_mapPoints(native_instance, dst, dstIndex, src, srcIndex,
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         vectorCount, false);
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Apply this matrix to the array of 2D points specified by src, and write
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the transformed points into the array of points specified by dst. The
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * two arrays represent their "points" as pairs of floats [x, y].
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst   The array of dst points (x,y pairs)
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src   The array of src points (x,y pairs)
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void mapPoints(float[] dst, float[] src) {
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dst.length != src.length) {
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mapPoints(dst, 0, src, 0, dst.length >> 1);
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Apply this matrix to the array of 2D vectors specified by src, and write
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the transformed vectors into the array of vectors specified by dst. The
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * two arrays represent their "vectors" as pairs of floats [x, y].
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6443a58ec108bb430b81a328adb2062035f860159b4Adam Cohen     * Note: this method does not apply the translation associated with the matrix. Use
6453a58ec108bb430b81a328adb2062035f860159b4Adam Cohen     * {@link Matrix#mapPoints(float[], float[])} if you want the translation to be applied.
6463a58ec108bb430b81a328adb2062035f860159b4Adam Cohen     *
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst   The array of dst vectors (x,y pairs)
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src   The array of src vectors (x,y pairs)
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void mapVectors(float[] dst, float[] src) {
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dst.length != src.length) {
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mapVectors(dst, 0, src, 0, dst.length >> 1);
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Apply this matrix to the array of 2D points, and write the transformed
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * points back into the array
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pts The array [x0, y0, x1, y1, ...] of points to transform.
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void mapPoints(float[] pts) {
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mapPoints(pts, 0, pts, 0, pts.length >> 1);
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Apply this matrix to the array of 2D vectors, and write the transformed
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * vectors back into the array.
6703a58ec108bb430b81a328adb2062035f860159b4Adam Cohen     *
6713a58ec108bb430b81a328adb2062035f860159b4Adam Cohen     * Note: this method does not apply the translation associated with the matrix. Use
6723a58ec108bb430b81a328adb2062035f860159b4Adam Cohen     * {@link Matrix#mapPoints(float[])} if you want the translation to be applied.
6733a58ec108bb430b81a328adb2062035f860159b4Adam Cohen     *
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param vecs The array [x0, y0, x1, y1, ...] of vectors to transform.
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void mapVectors(float[] vecs) {
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mapVectors(vecs, 0, vecs, 0, vecs.length >> 1);
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Apply this matrix to the src rectangle, and write the transformed
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * rectangle into dst. This is accomplished by transforming the 4 corners of
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * src, and then setting dst to the bounds of those points.
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dst Where the transformed rectangle is written.
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src The original rectangle to be transformed.
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the result of calling rectStaysRect()
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean mapRect(RectF dst, RectF src) {
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dst == null || src == null) {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NullPointerException();
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_mapRect(native_instance, dst, src);
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Apply this matrix to the rectangle, and write the transformed rectangle
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * back into it. This is accomplished by transforming the 4 corners of rect,
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and then setting it to the bounds of those points
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rect The rectangle to transform.
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the result of calling rectStaysRect()
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean mapRect(RectF rect) {
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mapRect(rect, rect);
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the mean radius of a circle after it has been mapped by
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this matrix. NOTE: in perspective this value assumes the circle
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has its center at the origin.
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float mapRadius(float radius) {
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_mapRadius(native_instance, radius);
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Copy 9 values from the matrix into the array.
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    */
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getValues(float[] values) {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (values.length < 9) {
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_getValues(native_instance, values);
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Copy 9 values from the array into the matrix.
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Depending on the implementation of Matrix, these may be
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        transformed into 16.16 integers in the Matrix, such that
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a subsequent call to getValues() will not yield exactly
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        the same values.
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    */
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setValues(float[] values) {
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (values.length < 9) {
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        native_setValues(native_instance, values);
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
7401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        StringBuilder sb = new StringBuilder(64);
7411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append("Matrix{");
7421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        toShortString(sb);
7431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append('}');
7441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        return sb.toString();
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toShortString() {
7491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        StringBuilder sb = new StringBuilder(64);
7501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        toShortString(sb);
7511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        return sb.toString();
7521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
7531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
7541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    /**
7551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn     * @hide
7561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn     */
7571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void toShortString(StringBuilder sb) {
7581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        float[] values = new float[9];
7591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        getValues(values);
7601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append('[');
7611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(values[0]); sb.append(", "); sb.append(values[1]); sb.append(", ");
7621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(values[2]); sb.append("][");
7631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(values[3]); sb.append(", "); sb.append(values[4]); sb.append(", ");
7641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(values[5]); sb.append("][");
7651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(values[6]); sb.append(", "); sb.append(values[7]); sb.append(", ");
7661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(values[8]); sb.append(']');
7671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
7681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
7691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    /**
7701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn     * Print short string, to optimize dumping.
7711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn     * @hide
7721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn     */
7731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void printShortString(PrintWriter pw) {
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float[] values = new float[9];
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getValues(values);
7761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.print('[');
7771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.print(values[0]); pw.print(", "); pw.print(values[1]); pw.print(", ");
7781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(values[2]); pw.print("][");
7791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.print(values[3]); pw.print(", "); pw.print(values[4]); pw.print(", ");
7801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(values[5]); pw.print("][");
7811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.print(values[6]); pw.print(", "); pw.print(values[7]); pw.print(", ");
7821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(values[8]); pw.print(']');
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        finalizer(native_instance);
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ final int ni() {
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return native_instance;
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native int native_create(int native_src_or_zero);
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_isIdentity(int native_object);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_rectStaysRect(int native_object);
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_reset(int native_object);
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_set(int native_object, int other);
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setTranslate(int native_object,
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   float dx, float dy);
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setScale(int native_object,
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        float sx, float sy, float px, float py);
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setScale(int native_object,
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                               float sx, float sy);
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setRotate(int native_object,
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            float degrees, float px, float py);
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setRotate(int native_object,
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                float degrees);
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setSinCos(int native_object,
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            float sinValue, float cosValue, float px, float py);
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setSinCos(int native_object,
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                float sinValue, float cosValue);
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setSkew(int native_object,
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        float kx, float ky, float px, float py);
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setSkew(int native_object,
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                              float kx, float ky);
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_setConcat(int native_object,
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   int a, int b);
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_preTranslate(int native_object,
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                      float dx, float dy);
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_preScale(int native_object,
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        float sx, float sy, float px, float py);
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_preScale(int native_object,
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                  float sx, float sy);
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_preRotate(int native_object,
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            float degrees, float px, float py);
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_preRotate(int native_object,
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   float degrees);
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_preSkew(int native_object,
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        float kx, float ky, float px, float py);
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_preSkew(int native_object,
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                 float kx, float ky);
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_preConcat(int native_object,
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   int other_matrix);
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_postTranslate(int native_object,
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                       float dx, float dy);
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_postScale(int native_object,
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        float sx, float sy, float px, float py);
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_postScale(int native_object,
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   float sx, float sy);
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_postRotate(int native_object,
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            float degrees, float px, float py);
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_postRotate(int native_object,
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    float degrees);
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_postSkew(int native_object,
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        float kx, float ky, float px, float py);
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_postSkew(int native_object,
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                  float kx, float ky);
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_postConcat(int native_object,
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    int other_matrix);
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_setRectToRect(int native_object,
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                RectF src, RectF dst, int stf);
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_setPolyToPoly(int native_object,
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount);
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_invert(int native_object, int inverse);
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_mapPoints(int native_object,
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        float[] dst, int dstIndex, float[] src, int srcIndex,
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int ptCount, boolean isPts);
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_mapRect(int native_object,
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                 RectF dst, RectF src);
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native float native_mapRadius(int native_object,
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                 float radius);
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_getValues(int native_object,
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                float[] values);
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void native_setValues(int native_object,
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                float[] values);
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native boolean native_equals(int native_a, int native_b);
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void finalizer(int native_instance);
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
870