blob: a667499887c2561371882ba09479da0c98066120 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/* libs/android_runtime/android/graphics/Matrix.cpp
2**
3** Copyright 2006, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080018#include "jni.h"
19#include "GraphicsJNI.h"
20#include <android_runtime/AndroidRuntime.h>
21
22#include "SkMatrix.h"
23#include "SkTemplates.h"
24
Jeff Brown20e987b2010-08-23 12:01:02 -070025#include "Matrix.h"
26
Chet Haase5c13d892010-10-08 08:37:55 -070027#include <Caches.h>
28
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080029namespace android {
30
31class SkMatrixGlue {
32public:
33
Ashok Bhata0398432014-01-20 20:08:01 +000034 static void finalizer(JNIEnv* env, jobject clazz, jlong objHandle) {
35 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036 delete obj;
37 }
38
Ashok Bhata0398432014-01-20 20:08:01 +000039 static jlong create(JNIEnv* env, jobject clazz, jlong srcHandle) {
40 const SkMatrix* src = reinterpret_cast<SkMatrix*>(srcHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080041 SkMatrix* obj = new SkMatrix();
42 if (src)
43 *obj = *src;
44 else
45 obj->reset();
Ashok Bhata0398432014-01-20 20:08:01 +000046 return reinterpret_cast<jlong>(obj);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080047 }
Ashok Bhata0398432014-01-20 20:08:01 +000048
49 static jboolean isIdentity(JNIEnv* env, jobject clazz, jlong objHandle) {
50 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
51 return obj->isIdentity() ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080052 }
Ashok Bhata0398432014-01-20 20:08:01 +000053 static jboolean rectStaysRect(JNIEnv* env, jobject clazz, jlong objHandle) {
54 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
55 return obj->rectStaysRect() ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080056 }
Ashok Bhata0398432014-01-20 20:08:01 +000057 static void reset(JNIEnv* env, jobject clazz, jlong objHandle) {
58 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080059 obj->reset();
60 }
Ashok Bhata0398432014-01-20 20:08:01 +000061 static void set(JNIEnv* env, jobject clazz, jlong objHandle, jlong otherHandle) {
62 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
63 SkMatrix* other = reinterpret_cast<SkMatrix*>(otherHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080064 *obj = *other;
65 }
Ashok Bhata0398432014-01-20 20:08:01 +000066 static void setTranslate(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx, jfloat dy) {
67 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080068 SkScalar dx_ = SkFloatToScalar(dx);
69 SkScalar dy_ = SkFloatToScalar(dy);
70 obj->setTranslate(dx_, dy_);
71 }
Ashok Bhata0398432014-01-20 20:08:01 +000072 static void setScale__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy, jfloat px, jfloat py) {
73 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080074 SkScalar sx_ = SkFloatToScalar(sx);
75 SkScalar sy_ = SkFloatToScalar(sy);
76 SkScalar px_ = SkFloatToScalar(px);
77 SkScalar py_ = SkFloatToScalar(py);
78 obj->setScale(sx_, sy_, px_, py_);
79 }
Ashok Bhata0398432014-01-20 20:08:01 +000080 static void setScale__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy) {
81 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080082 SkScalar sx_ = SkFloatToScalar(sx);
83 SkScalar sy_ = SkFloatToScalar(sy);
84 obj->setScale(sx_, sy_);
85 }
Ashok Bhata0398432014-01-20 20:08:01 +000086 static void setRotate__FFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees, jfloat px, jfloat py) {
87 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080088 SkScalar degrees_ = SkFloatToScalar(degrees);
89 SkScalar px_ = SkFloatToScalar(px);
90 SkScalar py_ = SkFloatToScalar(py);
91 obj->setRotate(degrees_, px_, py_);
92 }
Ashok Bhata0398432014-01-20 20:08:01 +000093 static void setRotate__F(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees) {
94 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080095 SkScalar degrees_ = SkFloatToScalar(degrees);
96 obj->setRotate(degrees_);
97 }
Ashok Bhata0398432014-01-20 20:08:01 +000098 static void setSinCos__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sinValue, jfloat cosValue, jfloat px, jfloat py) {
99 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800100 SkScalar sinValue_ = SkFloatToScalar(sinValue);
101 SkScalar cosValue_ = SkFloatToScalar(cosValue);
102 SkScalar px_ = SkFloatToScalar(px);
103 SkScalar py_ = SkFloatToScalar(py);
104 obj->setSinCos(sinValue_, cosValue_, px_, py_);
105 }
Ashok Bhata0398432014-01-20 20:08:01 +0000106 static void setSinCos__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sinValue, jfloat cosValue) {
107 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800108 SkScalar sinValue_ = SkFloatToScalar(sinValue);
109 SkScalar cosValue_ = SkFloatToScalar(cosValue);
110 obj->setSinCos(sinValue_, cosValue_);
111 }
Ashok Bhata0398432014-01-20 20:08:01 +0000112 static void setSkew__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky, jfloat px, jfloat py) {
113 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800114 SkScalar kx_ = SkFloatToScalar(kx);
115 SkScalar ky_ = SkFloatToScalar(ky);
116 SkScalar px_ = SkFloatToScalar(px);
117 SkScalar py_ = SkFloatToScalar(py);
118 obj->setSkew(kx_, ky_, px_, py_);
119 }
Ashok Bhata0398432014-01-20 20:08:01 +0000120 static void setSkew__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky) {
121 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800122 SkScalar kx_ = SkFloatToScalar(kx);
123 SkScalar ky_ = SkFloatToScalar(ky);
124 obj->setSkew(kx_, ky_);
125 }
Ashok Bhata0398432014-01-20 20:08:01 +0000126 static jboolean setConcat(JNIEnv* env, jobject clazz, jlong objHandle, jlong aHandle, jlong bHandle) {
127 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
128 SkMatrix* a = reinterpret_cast<SkMatrix*>(aHandle);
129 SkMatrix* b = reinterpret_cast<SkMatrix*>(bHandle);
130 return obj->setConcat(*a, *b) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800131 }
Ashok Bhata0398432014-01-20 20:08:01 +0000132
133 static jboolean preTranslate(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx, jfloat dy) {
134 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800135 SkScalar dx_ = SkFloatToScalar(dx);
136 SkScalar dy_ = SkFloatToScalar(dy);
Ashok Bhata0398432014-01-20 20:08:01 +0000137 return obj->preTranslate(dx_, dy_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800138 }
Ashok Bhata0398432014-01-20 20:08:01 +0000139
140 static jboolean preScale__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy, jfloat px, jfloat py) {
141 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800142 SkScalar sx_ = SkFloatToScalar(sx);
143 SkScalar sy_ = SkFloatToScalar(sy);
144 SkScalar px_ = SkFloatToScalar(px);
145 SkScalar py_ = SkFloatToScalar(py);
Ashok Bhata0398432014-01-20 20:08:01 +0000146 return obj->preScale(sx_, sy_, px_, py_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800147 }
Ashok Bhata0398432014-01-20 20:08:01 +0000148
149 static jboolean preScale__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy) {
150 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800151 SkScalar sx_ = SkFloatToScalar(sx);
152 SkScalar sy_ = SkFloatToScalar(sy);
Ashok Bhata0398432014-01-20 20:08:01 +0000153 return obj->preScale(sx_, sy_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800154 }
Ashok Bhata0398432014-01-20 20:08:01 +0000155
156 static jboolean preRotate__FFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees, jfloat px, jfloat py) {
157 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800158 SkScalar degrees_ = SkFloatToScalar(degrees);
159 SkScalar px_ = SkFloatToScalar(px);
160 SkScalar py_ = SkFloatToScalar(py);
Ashok Bhata0398432014-01-20 20:08:01 +0000161 return obj->preRotate(degrees_, px_, py_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800162 }
Ashok Bhata0398432014-01-20 20:08:01 +0000163
164 static jboolean preRotate__F(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees) {
165 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800166 SkScalar degrees_ = SkFloatToScalar(degrees);
Ashok Bhata0398432014-01-20 20:08:01 +0000167 return obj->preRotate(degrees_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800168 }
Ashok Bhata0398432014-01-20 20:08:01 +0000169
170 static jboolean preSkew__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky, jfloat px, jfloat py) {
171 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800172 SkScalar kx_ = SkFloatToScalar(kx);
173 SkScalar ky_ = SkFloatToScalar(ky);
174 SkScalar px_ = SkFloatToScalar(px);
175 SkScalar py_ = SkFloatToScalar(py);
Ashok Bhata0398432014-01-20 20:08:01 +0000176 return obj->preSkew(kx_, ky_, px_, py_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800177 }
Ashok Bhata0398432014-01-20 20:08:01 +0000178
179 static jboolean preSkew__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky) {
180 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800181 SkScalar kx_ = SkFloatToScalar(kx);
182 SkScalar ky_ = SkFloatToScalar(ky);
Ashok Bhata0398432014-01-20 20:08:01 +0000183 return obj->preSkew(kx_, ky_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800184 }
Ashok Bhata0398432014-01-20 20:08:01 +0000185
186 static jboolean preConcat(JNIEnv* env, jobject clazz, jlong objHandle, jlong otherHandle) {
187 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
188 SkMatrix* other = reinterpret_cast<SkMatrix*>(otherHandle);
189 return obj->preConcat(*other) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800190 }
Ashok Bhata0398432014-01-20 20:08:01 +0000191
192 static jboolean postTranslate(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx, jfloat dy) {
193 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800194 SkScalar dx_ = SkFloatToScalar(dx);
195 SkScalar dy_ = SkFloatToScalar(dy);
Ashok Bhata0398432014-01-20 20:08:01 +0000196 return obj->postTranslate(dx_, dy_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800197 }
Ashok Bhata0398432014-01-20 20:08:01 +0000198
199 static jboolean postScale__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy, jfloat px, jfloat py) {
200 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800201 SkScalar sx_ = SkFloatToScalar(sx);
202 SkScalar sy_ = SkFloatToScalar(sy);
203 SkScalar px_ = SkFloatToScalar(px);
204 SkScalar py_ = SkFloatToScalar(py);
Ashok Bhata0398432014-01-20 20:08:01 +0000205 return obj->postScale(sx_, sy_, px_, py_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800206 }
Ashok Bhata0398432014-01-20 20:08:01 +0000207
208 static jboolean postScale__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy) {
209 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800210 SkScalar sx_ = SkFloatToScalar(sx);
211 SkScalar sy_ = SkFloatToScalar(sy);
Ashok Bhata0398432014-01-20 20:08:01 +0000212 return obj->postScale(sx_, sy_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800213 }
Ashok Bhata0398432014-01-20 20:08:01 +0000214
215 static jboolean postRotate__FFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees, jfloat px, jfloat py) {
216 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800217 SkScalar degrees_ = SkFloatToScalar(degrees);
218 SkScalar px_ = SkFloatToScalar(px);
219 SkScalar py_ = SkFloatToScalar(py);
Ashok Bhata0398432014-01-20 20:08:01 +0000220 return obj->postRotate(degrees_, px_, py_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800221 }
Ashok Bhata0398432014-01-20 20:08:01 +0000222
223 static jboolean postRotate__F(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees) {
224 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800225 SkScalar degrees_ = SkFloatToScalar(degrees);
Ashok Bhata0398432014-01-20 20:08:01 +0000226 return obj->postRotate(degrees_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800227 }
Ashok Bhata0398432014-01-20 20:08:01 +0000228
229 static jboolean postSkew__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky, jfloat px, jfloat py) {
230 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800231 SkScalar kx_ = SkFloatToScalar(kx);
232 SkScalar ky_ = SkFloatToScalar(ky);
233 SkScalar px_ = SkFloatToScalar(px);
234 SkScalar py_ = SkFloatToScalar(py);
Ashok Bhata0398432014-01-20 20:08:01 +0000235 return obj->postSkew(kx_, ky_, px_, py_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800236 }
Ashok Bhata0398432014-01-20 20:08:01 +0000237
238 static jboolean postSkew__FF(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloat kx, jfloat ky) {
239 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800240 SkScalar kx_ = SkFloatToScalar(kx);
241 SkScalar ky_ = SkFloatToScalar(ky);
Ashok Bhata0398432014-01-20 20:08:01 +0000242 return matrix->postSkew(kx_, ky_) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800243 }
Ashok Bhata0398432014-01-20 20:08:01 +0000244
245 static jboolean postConcat(JNIEnv* env, jobject clazz, jlong matrixHandle, jlong otherHandle) {
246 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
247 SkMatrix* other = reinterpret_cast<SkMatrix*>(otherHandle);
248 return matrix->postConcat(*other) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800249 }
Ashok Bhata0398432014-01-20 20:08:01 +0000250
251 static jboolean setRectToRect(JNIEnv* env, jobject clazz, jlong matrixHandle, jobject src, jobject dst, jint stfHandle) {
252 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
253 SkMatrix::ScaleToFit stf = static_cast<SkMatrix::ScaleToFit>(stfHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800254 SkRect src_;
255 GraphicsJNI::jrectf_to_rect(env, src, &src_);
256 SkRect dst_;
257 GraphicsJNI::jrectf_to_rect(env, dst, &dst_);
Ashok Bhata0398432014-01-20 20:08:01 +0000258 return matrix->setRectToRect(src_, dst_, stf) ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800259 }
Ashok Bhata0398432014-01-20 20:08:01 +0000260
261 static jboolean setPolyToPoly(JNIEnv* env, jobject clazz, jlong matrixHandle,
262 jfloatArray jsrc, jint srcIndex,
263 jfloatArray jdst, jint dstIndex, jint ptCount) {
264 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800265 SkASSERT(srcIndex >= 0);
266 SkASSERT(dstIndex >= 0);
267 SkASSERT((unsigned)ptCount <= 4);
268
Mathieu Chartier768480c2014-01-25 17:54:22 -0800269 AutoJavaFloatArray autoSrc(env, jsrc, srcIndex + (ptCount << 1), kRO_JNIAccess);
270 AutoJavaFloatArray autoDst(env, jdst, dstIndex + (ptCount << 1), kRW_JNIAccess);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800271 float* src = autoSrc.ptr() + srcIndex;
272 float* dst = autoDst.ptr() + dstIndex;
Ashok Bhata0398432014-01-20 20:08:01 +0000273 bool result;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800274
275#ifdef SK_SCALAR_IS_FIXED
276 SkPoint srcPt[4], dstPt[4];
277 for (int i = 0; i < ptCount; i++) {
278 int x = i << 1;
279 int y = x + 1;
280 srcPt[i].set(SkFloatToScalar(src[x]), SkFloatToScalar(src[y]));
281 dstPt[i].set(SkFloatToScalar(dst[x]), SkFloatToScalar(dst[y]));
282 }
Ashok Bhata0398432014-01-20 20:08:01 +0000283 result = matrix->setPolyToPoly(srcPt, dstPt, ptCount);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800284#else
Ashok Bhata0398432014-01-20 20:08:01 +0000285 result = matrix->setPolyToPoly((const SkPoint*)src, (const SkPoint*)dst,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800286 ptCount);
287#endif
Ashok Bhata0398432014-01-20 20:08:01 +0000288 return result ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800289 }
Ashok Bhata0398432014-01-20 20:08:01 +0000290
291 static jboolean invert(JNIEnv* env, jobject clazz, jlong matrixHandle, jlong inverseHandle) {
292 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
293 SkMatrix* inverse = reinterpret_cast<SkMatrix*>(inverseHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800294 return matrix->invert(inverse);
295 }
Ashok Bhata0398432014-01-20 20:08:01 +0000296
297 static void mapPoints(JNIEnv* env, jobject clazz, jlong matrixHandle,
298 jfloatArray dst, jint dstIndex,
299 jfloatArray src, jint srcIndex,
300 jint ptCount, jboolean isPts) {
301 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800302 SkASSERT(ptCount >= 0);
Mathieu Chartier768480c2014-01-25 17:54:22 -0800303 AutoJavaFloatArray autoSrc(env, src, srcIndex + (ptCount << 1), kRO_JNIAccess);
304 AutoJavaFloatArray autoDst(env, dst, dstIndex + (ptCount << 1), kRW_JNIAccess);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800305 float* srcArray = autoSrc.ptr() + srcIndex;
306 float* dstArray = autoDst.ptr() + dstIndex;
307
308#ifdef SK_SCALAR_IS_FIXED
309 // we allocate twice the count, 1 set for src, 1 for dst
310 SkAutoSTMalloc<32, SkPoint> storage(ptCount * 2);
311 SkPoint* pts = storage.get();
312 SkPoint* srcPt = pts;
313 SkPoint* dstPt = pts + ptCount;
314
315 int i;
316 for (i = 0; i < ptCount; i++) {
317 srcPt[i].set(SkFloatToScalar(srcArray[i << 1]),
318 SkFloatToScalar(srcArray[(i << 1) + 1]));
319 }
320
321 if (isPts)
322 matrix->mapPoints(dstPt, srcPt, ptCount);
323 else
324 matrix->mapVectors(dstPt, srcPt, ptCount);
325
326 for (i = 0; i < ptCount; i++) {
327 dstArray[i << 1] = SkScalarToFloat(dstPt[i].fX);
328 dstArray[(i << 1) + 1] = SkScalarToFloat(dstPt[i].fY);
329 }
330#else
331 if (isPts)
332 matrix->mapPoints((SkPoint*)dstArray, (const SkPoint*)srcArray,
333 ptCount);
334 else
335 matrix->mapVectors((SkVector*)dstArray, (const SkVector*)srcArray,
336 ptCount);
337#endif
338 }
Ashok Bhata0398432014-01-20 20:08:01 +0000339
340 static jboolean mapRect__RectFRectF(JNIEnv* env, jobject clazz, jlong matrixHandle, jobjectArray dst, jobject src) {
341 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800342 SkRect dst_, src_;
343 GraphicsJNI::jrectf_to_rect(env, src, &src_);
344 jboolean rectStaysRect = matrix->mapRect(&dst_, src_);
345 GraphicsJNI::rect_to_jrectf(dst_, env, dst);
Ashok Bhata0398432014-01-20 20:08:01 +0000346 return rectStaysRect ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800347 }
Ashok Bhata0398432014-01-20 20:08:01 +0000348
349 static jfloat mapRadius(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloat radius) {
350 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
351 float result;
352 result = SkScalarToFloat(matrix->mapRadius(SkFloatToScalar(radius)));
353 return static_cast<jfloat>(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800354 }
Ashok Bhata0398432014-01-20 20:08:01 +0000355
356 static void getValues(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloatArray values) {
357 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
Mathieu Chartier768480c2014-01-25 17:54:22 -0800358 AutoJavaFloatArray autoValues(env, values, 9, kRW_JNIAccess);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800359 float* dst = autoValues.ptr();
360
361#ifdef SK_SCALAR_IS_FIXED
362 for (int i = 0; i < 6; i++) {
363 dst[i] = SkFixedToFloat(matrix->get(i));
364 }
365 for (int j = 6; j < 9; j++) {
366 dst[j] = SkFractToFloat(matrix->get(j));
367 }
368#else
369 for (int i = 0; i < 9; i++) {
370 dst[i] = matrix->get(i);
371 }
372#endif
373 }
Ashok Bhata0398432014-01-20 20:08:01 +0000374
375 static void setValues(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloatArray values) {
376 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
Mathieu Chartier768480c2014-01-25 17:54:22 -0800377 AutoJavaFloatArray autoValues(env, values, 9, kRO_JNIAccess);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800378 const float* src = autoValues.ptr();
379
380#ifdef SK_SCALAR_IS_FIXED
381 for (int i = 0; i < 6; i++) {
382 matrix->set(i, SkFloatToFixed(src[i]));
383 }
384 for (int j = 6; j < 9; j++) {
385 matrix->set(j, SkFloatToFract(src[j]));
386 }
387#else
388 for (int i = 0; i < 9; i++) {
389 matrix->set(i, src[i]);
390 }
391#endif
392 }
393
Ashok Bhata0398432014-01-20 20:08:01 +0000394 static jboolean equals(JNIEnv* env, jobject clazz, jlong aHandle, jlong bHandle) {
395 const SkMatrix* a = reinterpret_cast<SkMatrix*>(aHandle);
396 const SkMatrix* b = reinterpret_cast<SkMatrix*>(bHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800397 return *a == *b;
398 }
399 };
400
401static JNINativeMethod methods[] = {
Ashok Bhata0398432014-01-20 20:08:01 +0000402 {"finalizer", "(J)V", (void*) SkMatrixGlue::finalizer},
403 {"native_create","(J)J", (void*) SkMatrixGlue::create},
404 {"native_isIdentity","(J)Z", (void*) SkMatrixGlue::isIdentity},
405 {"native_rectStaysRect","(J)Z", (void*) SkMatrixGlue::rectStaysRect},
406 {"native_reset","(J)V", (void*) SkMatrixGlue::reset},
407 {"native_set","(JJ)V", (void*) SkMatrixGlue::set},
408 {"native_setTranslate","(JFF)V", (void*) SkMatrixGlue::setTranslate},
409 {"native_setScale","(JFFFF)V", (void*) SkMatrixGlue::setScale__FFFF},
410 {"native_setScale","(JFF)V", (void*) SkMatrixGlue::setScale__FF},
411 {"native_setRotate","(JFFF)V", (void*) SkMatrixGlue::setRotate__FFF},
412 {"native_setRotate","(JF)V", (void*) SkMatrixGlue::setRotate__F},
413 {"native_setSinCos","(JFFFF)V", (void*) SkMatrixGlue::setSinCos__FFFF},
414 {"native_setSinCos","(JFF)V", (void*) SkMatrixGlue::setSinCos__FF},
415 {"native_setSkew","(JFFFF)V", (void*) SkMatrixGlue::setSkew__FFFF},
416 {"native_setSkew","(JFF)V", (void*) SkMatrixGlue::setSkew__FF},
417 {"native_setConcat","(JJJ)Z", (void*) SkMatrixGlue::setConcat},
418 {"native_preTranslate","(JFF)Z", (void*) SkMatrixGlue::preTranslate},
419 {"native_preScale","(JFFFF)Z", (void*) SkMatrixGlue::preScale__FFFF},
420 {"native_preScale","(JFF)Z", (void*) SkMatrixGlue::preScale__FF},
421 {"native_preRotate","(JFFF)Z", (void*) SkMatrixGlue::preRotate__FFF},
422 {"native_preRotate","(JF)Z", (void*) SkMatrixGlue::preRotate__F},
423 {"native_preSkew","(JFFFF)Z", (void*) SkMatrixGlue::preSkew__FFFF},
424 {"native_preSkew","(JFF)Z", (void*) SkMatrixGlue::preSkew__FF},
425 {"native_preConcat","(JJ)Z", (void*) SkMatrixGlue::preConcat},
426 {"native_postTranslate","(JFF)Z", (void*) SkMatrixGlue::postTranslate},
427 {"native_postScale","(JFFFF)Z", (void*) SkMatrixGlue::postScale__FFFF},
428 {"native_postScale","(JFF)Z", (void*) SkMatrixGlue::postScale__FF},
429 {"native_postRotate","(JFFF)Z", (void*) SkMatrixGlue::postRotate__FFF},
430 {"native_postRotate","(JF)Z", (void*) SkMatrixGlue::postRotate__F},
431 {"native_postSkew","(JFFFF)Z", (void*) SkMatrixGlue::postSkew__FFFF},
432 {"native_postSkew","(JFF)Z", (void*) SkMatrixGlue::postSkew__FF},
433 {"native_postConcat","(JJ)Z", (void*) SkMatrixGlue::postConcat},
434 {"native_setRectToRect","(JLandroid/graphics/RectF;Landroid/graphics/RectF;I)Z", (void*) SkMatrixGlue::setRectToRect},
435 {"native_setPolyToPoly","(J[FI[FII)Z", (void*) SkMatrixGlue::setPolyToPoly},
436 {"native_invert","(JJ)Z", (void*) SkMatrixGlue::invert},
437 {"native_mapPoints","(J[FI[FIIZ)V", (void*) SkMatrixGlue::mapPoints},
438 {"native_mapRect","(JLandroid/graphics/RectF;Landroid/graphics/RectF;)Z", (void*) SkMatrixGlue::mapRect__RectFRectF},
439 {"native_mapRadius","(JF)F", (void*) SkMatrixGlue::mapRadius},
440 {"native_getValues","(J[F)V", (void*) SkMatrixGlue::getValues},
441 {"native_setValues","(J[F)V", (void*) SkMatrixGlue::setValues},
442 {"native_equals", "(JJ)Z", (void*) SkMatrixGlue::equals}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800443};
444
Jeff Brown20e987b2010-08-23 12:01:02 -0700445static jfieldID sNativeInstanceField;
446
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800447int register_android_graphics_Matrix(JNIEnv* env) {
448 int result = AndroidRuntime::registerNativeMethods(env, "android/graphics/Matrix", methods,
449 sizeof(methods) / sizeof(methods[0]));
Jeff Brown20e987b2010-08-23 12:01:02 -0700450
451 jclass clazz = env->FindClass("android/graphics/Matrix");
Ashok Bhata0398432014-01-20 20:08:01 +0000452 sNativeInstanceField = env->GetFieldID(clazz, "native_instance", "J");
Jeff Brown20e987b2010-08-23 12:01:02 -0700453
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800454 return result;
455}
456
Jeff Brown20e987b2010-08-23 12:01:02 -0700457SkMatrix* android_graphics_Matrix_getSkMatrix(JNIEnv* env, jobject matrixObj) {
Ashok Bhata0398432014-01-20 20:08:01 +0000458 return reinterpret_cast<SkMatrix*>(env->GetLongField(matrixObj, sNativeInstanceField));
Jeff Brown20e987b2010-08-23 12:01:02 -0700459}
460
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800461}