blob: d573aa8cda3e73d07e7bcda3548556ecb9f4fb1a [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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-01-20 20:08:01 +000046 return reinterpret_cast<jlong>(obj);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080047 }
Ashok Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 }
Leon Scrogginscc11f152014-03-31 16:52:13 -0400126 static void setConcat(JNIEnv* env, jobject clazz, jlong objHandle, jlong aHandle, jlong bHandle) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000127 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
128 SkMatrix* a = reinterpret_cast<SkMatrix*>(aHandle);
129 SkMatrix* b = reinterpret_cast<SkMatrix*>(bHandle);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400130 obj->setConcat(*a, *b);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800131 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000132
Leon Scrogginscc11f152014-03-31 16:52:13 -0400133 static void preTranslate(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx, jfloat dy) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000134 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);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400137 obj->preTranslate(dx_, dy_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800138 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000139
Leon Scrogginscc11f152014-03-31 16:52:13 -0400140 static void preScale__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy, jfloat px, jfloat py) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000141 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);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400146 obj->preScale(sx_, sy_, px_, py_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800147 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000148
Leon Scrogginscc11f152014-03-31 16:52:13 -0400149 static void preScale__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000150 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);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400153 obj->preScale(sx_, sy_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800154 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000155
Leon Scrogginscc11f152014-03-31 16:52:13 -0400156 static void preRotate__FFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees, jfloat px, jfloat py) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000157 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);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400161 obj->preRotate(degrees_, px_, py_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800162 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000163
Leon Scrogginscc11f152014-03-31 16:52:13 -0400164 static void preRotate__F(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000165 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800166 SkScalar degrees_ = SkFloatToScalar(degrees);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400167 obj->preRotate(degrees_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800168 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000169
Leon Scrogginscc11f152014-03-31 16:52:13 -0400170 static void preSkew__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky, jfloat px, jfloat py) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000171 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);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400176 obj->preSkew(kx_, ky_, px_, py_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800177 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000178
Leon Scrogginscc11f152014-03-31 16:52:13 -0400179 static void preSkew__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000180 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);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400183 obj->preSkew(kx_, ky_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800184 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000185
Leon Scrogginscc11f152014-03-31 16:52:13 -0400186 static void preConcat(JNIEnv* env, jobject clazz, jlong objHandle, jlong otherHandle) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000187 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
188 SkMatrix* other = reinterpret_cast<SkMatrix*>(otherHandle);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400189 obj->preConcat(*other);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800190 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000191
Leon Scrogginscc11f152014-03-31 16:52:13 -0400192 static void postTranslate(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx, jfloat dy) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000193 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);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400196 obj->postTranslate(dx_, dy_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800197 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000198
Leon Scrogginscc11f152014-03-31 16:52:13 -0400199 static void postScale__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy, jfloat px, jfloat py) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000200 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);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400205 obj->postScale(sx_, sy_, px_, py_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800206 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000207
Leon Scrogginscc11f152014-03-31 16:52:13 -0400208 static void postScale__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000209 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);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400212 obj->postScale(sx_, sy_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800213 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000214
Leon Scrogginscc11f152014-03-31 16:52:13 -0400215 static void postRotate__FFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees, jfloat px, jfloat py) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000216 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);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400220 obj->postRotate(degrees_, px_, py_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800221 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000222
Leon Scrogginscc11f152014-03-31 16:52:13 -0400223 static void postRotate__F(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000224 SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800225 SkScalar degrees_ = SkFloatToScalar(degrees);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400226 obj->postRotate(degrees_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800227 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000228
Leon Scrogginscc11f152014-03-31 16:52:13 -0400229 static void postSkew__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky, jfloat px, jfloat py) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000230 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);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400235 obj->postSkew(kx_, ky_, px_, py_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800236 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000237
Leon Scrogginscc11f152014-03-31 16:52:13 -0400238 static void postSkew__FF(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloat kx, jfloat ky) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000239 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);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400242 matrix->postSkew(kx_, ky_);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800243 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000244
Leon Scrogginscc11f152014-03-31 16:52:13 -0400245 static void postConcat(JNIEnv* env, jobject clazz, jlong matrixHandle, jlong otherHandle) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000246 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
247 SkMatrix* other = reinterpret_cast<SkMatrix*>(otherHandle);
Leon Scrogginscc11f152014-03-31 16:52:13 -0400248 matrix->postConcat(*other);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800249 }
Ashok Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-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 Bhat36bef0b2014-01-20 20:08:01 +0000273 bool result;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800274
Leon Scroggins46cb9bd2014-03-06 15:36:39 -0500275#ifdef SK_SCALAR_IS_FLOAT
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000276 result = matrix->setPolyToPoly((const SkPoint*)src, (const SkPoint*)dst,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800277 ptCount);
Leon Scroggins46cb9bd2014-03-06 15:36:39 -0500278#else
279 SkASSERT(false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800280#endif
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000281 return result ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800282 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000283
284 static jboolean invert(JNIEnv* env, jobject clazz, jlong matrixHandle, jlong inverseHandle) {
285 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
286 SkMatrix* inverse = reinterpret_cast<SkMatrix*>(inverseHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800287 return matrix->invert(inverse);
288 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000289
290 static void mapPoints(JNIEnv* env, jobject clazz, jlong matrixHandle,
291 jfloatArray dst, jint dstIndex,
292 jfloatArray src, jint srcIndex,
293 jint ptCount, jboolean isPts) {
294 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800295 SkASSERT(ptCount >= 0);
Mathieu Chartier768480c2014-01-25 17:54:22 -0800296 AutoJavaFloatArray autoSrc(env, src, srcIndex + (ptCount << 1), kRO_JNIAccess);
297 AutoJavaFloatArray autoDst(env, dst, dstIndex + (ptCount << 1), kRW_JNIAccess);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800298 float* srcArray = autoSrc.ptr() + srcIndex;
299 float* dstArray = autoDst.ptr() + dstIndex;
Leon Scroggins46cb9bd2014-03-06 15:36:39 -0500300#ifdef SK_SCALAR_IS_FLOAT
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800301 if (isPts)
302 matrix->mapPoints((SkPoint*)dstArray, (const SkPoint*)srcArray,
303 ptCount);
304 else
305 matrix->mapVectors((SkVector*)dstArray, (const SkVector*)srcArray,
306 ptCount);
Leon Scroggins46cb9bd2014-03-06 15:36:39 -0500307#else
308 SkASSERT(false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800309#endif
310 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000311
312 static jboolean mapRect__RectFRectF(JNIEnv* env, jobject clazz, jlong matrixHandle, jobjectArray dst, jobject src) {
313 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800314 SkRect dst_, src_;
315 GraphicsJNI::jrectf_to_rect(env, src, &src_);
316 jboolean rectStaysRect = matrix->mapRect(&dst_, src_);
317 GraphicsJNI::rect_to_jrectf(dst_, env, dst);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000318 return rectStaysRect ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800319 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000320
321 static jfloat mapRadius(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloat radius) {
322 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
323 float result;
324 result = SkScalarToFloat(matrix->mapRadius(SkFloatToScalar(radius)));
325 return static_cast<jfloat>(result);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800326 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000327 static void getValues(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloatArray values) {
328 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
Mathieu Chartier768480c2014-01-25 17:54:22 -0800329 AutoJavaFloatArray autoValues(env, values, 9, kRW_JNIAccess);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800330 float* dst = autoValues.ptr();
Leon Scroggins46cb9bd2014-03-06 15:36:39 -0500331#ifdef SK_SCALAR_IS_FLOAT
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800332 for (int i = 0; i < 9; i++) {
333 dst[i] = matrix->get(i);
334 }
Leon Scroggins46cb9bd2014-03-06 15:36:39 -0500335#else
336 SkASSERT(false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800337#endif
338 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000339
340 static void setValues(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloatArray values) {
341 SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
Mathieu Chartier768480c2014-01-25 17:54:22 -0800342 AutoJavaFloatArray autoValues(env, values, 9, kRO_JNIAccess);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800343 const float* src = autoValues.ptr();
344
Leon Scroggins46cb9bd2014-03-06 15:36:39 -0500345#ifdef SK_SCALAR_IS_FLOAT
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800346 for (int i = 0; i < 9; i++) {
347 matrix->set(i, src[i]);
348 }
Leon Scroggins46cb9bd2014-03-06 15:36:39 -0500349#else
350 SkASSERT(false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800351#endif
352 }
353
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000354 static jboolean equals(JNIEnv* env, jobject clazz, jlong aHandle, jlong bHandle) {
355 const SkMatrix* a = reinterpret_cast<SkMatrix*>(aHandle);
356 const SkMatrix* b = reinterpret_cast<SkMatrix*>(bHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800357 return *a == *b;
358 }
359 };
360
361static JNINativeMethod methods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000362 {"finalizer", "(J)V", (void*) SkMatrixGlue::finalizer},
363 {"native_create","(J)J", (void*) SkMatrixGlue::create},
364 {"native_isIdentity","(J)Z", (void*) SkMatrixGlue::isIdentity},
365 {"native_rectStaysRect","(J)Z", (void*) SkMatrixGlue::rectStaysRect},
366 {"native_reset","(J)V", (void*) SkMatrixGlue::reset},
367 {"native_set","(JJ)V", (void*) SkMatrixGlue::set},
368 {"native_setTranslate","(JFF)V", (void*) SkMatrixGlue::setTranslate},
369 {"native_setScale","(JFFFF)V", (void*) SkMatrixGlue::setScale__FFFF},
370 {"native_setScale","(JFF)V", (void*) SkMatrixGlue::setScale__FF},
371 {"native_setRotate","(JFFF)V", (void*) SkMatrixGlue::setRotate__FFF},
372 {"native_setRotate","(JF)V", (void*) SkMatrixGlue::setRotate__F},
373 {"native_setSinCos","(JFFFF)V", (void*) SkMatrixGlue::setSinCos__FFFF},
374 {"native_setSinCos","(JFF)V", (void*) SkMatrixGlue::setSinCos__FF},
375 {"native_setSkew","(JFFFF)V", (void*) SkMatrixGlue::setSkew__FFFF},
376 {"native_setSkew","(JFF)V", (void*) SkMatrixGlue::setSkew__FF},
Leon Scrogginscc11f152014-03-31 16:52:13 -0400377 {"native_setConcat","(JJJ)V", (void*) SkMatrixGlue::setConcat},
378 {"native_preTranslate","(JFF)V", (void*) SkMatrixGlue::preTranslate},
379 {"native_preScale","(JFFFF)V", (void*) SkMatrixGlue::preScale__FFFF},
380 {"native_preScale","(JFF)V", (void*) SkMatrixGlue::preScale__FF},
381 {"native_preRotate","(JFFF)V", (void*) SkMatrixGlue::preRotate__FFF},
382 {"native_preRotate","(JF)V", (void*) SkMatrixGlue::preRotate__F},
383 {"native_preSkew","(JFFFF)V", (void*) SkMatrixGlue::preSkew__FFFF},
384 {"native_preSkew","(JFF)V", (void*) SkMatrixGlue::preSkew__FF},
385 {"native_preConcat","(JJ)V", (void*) SkMatrixGlue::preConcat},
386 {"native_postTranslate","(JFF)V", (void*) SkMatrixGlue::postTranslate},
387 {"native_postScale","(JFFFF)V", (void*) SkMatrixGlue::postScale__FFFF},
388 {"native_postScale","(JFF)V", (void*) SkMatrixGlue::postScale__FF},
389 {"native_postRotate","(JFFF)V", (void*) SkMatrixGlue::postRotate__FFF},
390 {"native_postRotate","(JF)V", (void*) SkMatrixGlue::postRotate__F},
391 {"native_postSkew","(JFFFF)V", (void*) SkMatrixGlue::postSkew__FFFF},
392 {"native_postSkew","(JFF)V", (void*) SkMatrixGlue::postSkew__FF},
393 {"native_postConcat","(JJ)V", (void*) SkMatrixGlue::postConcat},
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000394 {"native_setRectToRect","(JLandroid/graphics/RectF;Landroid/graphics/RectF;I)Z", (void*) SkMatrixGlue::setRectToRect},
395 {"native_setPolyToPoly","(J[FI[FII)Z", (void*) SkMatrixGlue::setPolyToPoly},
396 {"native_invert","(JJ)Z", (void*) SkMatrixGlue::invert},
397 {"native_mapPoints","(J[FI[FIIZ)V", (void*) SkMatrixGlue::mapPoints},
398 {"native_mapRect","(JLandroid/graphics/RectF;Landroid/graphics/RectF;)Z", (void*) SkMatrixGlue::mapRect__RectFRectF},
399 {"native_mapRadius","(JF)F", (void*) SkMatrixGlue::mapRadius},
400 {"native_getValues","(J[F)V", (void*) SkMatrixGlue::getValues},
401 {"native_setValues","(J[F)V", (void*) SkMatrixGlue::setValues},
402 {"native_equals", "(JJ)Z", (void*) SkMatrixGlue::equals}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800403};
404
Jeff Brown20e987b2010-08-23 12:01:02 -0700405static jfieldID sNativeInstanceField;
406
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800407int register_android_graphics_Matrix(JNIEnv* env) {
408 int result = AndroidRuntime::registerNativeMethods(env, "android/graphics/Matrix", methods,
409 sizeof(methods) / sizeof(methods[0]));
Jeff Brown20e987b2010-08-23 12:01:02 -0700410
411 jclass clazz = env->FindClass("android/graphics/Matrix");
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000412 sNativeInstanceField = env->GetFieldID(clazz, "native_instance", "J");
Jeff Brown20e987b2010-08-23 12:01:02 -0700413
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800414 return result;
415}
416
Jeff Brown20e987b2010-08-23 12:01:02 -0700417SkMatrix* android_graphics_Matrix_getSkMatrix(JNIEnv* env, jobject matrixObj) {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000418 return reinterpret_cast<SkMatrix*>(env->GetLongField(matrixObj, sNativeInstanceField));
Jeff Brown20e987b2010-08-23 12:01:02 -0700419}
420
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800421}