The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | /* 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 Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 18 | #include "jni.h" |
| 19 | #include "GraphicsJNI.h" |
Andreas Gampe | ed6b9df | 2014-11-20 22:02:20 -0800 | [diff] [blame] | 20 | #include <core_jni_helpers.h> |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 21 | |
| 22 | #include "SkMatrix.h" |
| 23 | #include "SkTemplates.h" |
| 24 | |
Jeff Brown | 20e987b | 2010-08-23 12:01:02 -0700 | [diff] [blame] | 25 | #include "Matrix.h" |
| 26 | |
Chet Haase | 5c13d89 | 2010-10-08 08:37:55 -0700 | [diff] [blame] | 27 | #include <Caches.h> |
| 28 | |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 29 | namespace android { |
| 30 | |
| 31 | class SkMatrixGlue { |
| 32 | public: |
| 33 | |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 34 | static void finalizer(JNIEnv* env, jobject clazz, jlong objHandle) { |
| 35 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 36 | delete obj; |
| 37 | } |
| 38 | |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 39 | static jlong create(JNIEnv* env, jobject clazz, jlong srcHandle) { |
| 40 | const SkMatrix* src = reinterpret_cast<SkMatrix*>(srcHandle); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 41 | SkMatrix* obj = new SkMatrix(); |
| 42 | if (src) |
| 43 | *obj = *src; |
| 44 | else |
| 45 | obj->reset(); |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 46 | return reinterpret_cast<jlong>(obj); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 47 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 48 | |
| 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 Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 52 | } |
Svetoslav | 2961769 | 2014-04-24 18:40:42 -0700 | [diff] [blame] | 53 | |
| 54 | static jboolean isAffine(JNIEnv* env, jobject clazz, jlong objHandle) { |
| 55 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
| 56 | return obj->asAffine(NULL) ? JNI_TRUE : JNI_FALSE; |
| 57 | } |
| 58 | |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 59 | static jboolean rectStaysRect(JNIEnv* env, jobject clazz, jlong objHandle) { |
| 60 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
| 61 | return obj->rectStaysRect() ? JNI_TRUE : JNI_FALSE; |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 62 | } |
Svetoslav | 2961769 | 2014-04-24 18:40:42 -0700 | [diff] [blame] | 63 | |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 64 | static void reset(JNIEnv* env, jobject clazz, jlong objHandle) { |
| 65 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 66 | obj->reset(); |
| 67 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 68 | static void set(JNIEnv* env, jobject clazz, jlong objHandle, jlong otherHandle) { |
| 69 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
| 70 | SkMatrix* other = reinterpret_cast<SkMatrix*>(otherHandle); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 71 | *obj = *other; |
| 72 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 73 | static void setTranslate(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx, jfloat dy) { |
| 74 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 75 | obj->setTranslate(dx, dy); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 76 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 77 | static void setScale__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy, jfloat px, jfloat py) { |
| 78 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 79 | obj->setScale(sx, sy, px, py); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 80 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 81 | static void setScale__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy) { |
| 82 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 83 | obj->setScale(sx, sy); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 84 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 85 | static void setRotate__FFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees, jfloat px, jfloat py) { |
| 86 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 87 | obj->setRotate(degrees, px, py); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 88 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 89 | static void setRotate__F(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees) { |
| 90 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 91 | obj->setRotate(degrees); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 92 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 93 | static void setSinCos__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sinValue, jfloat cosValue, jfloat px, jfloat py) { |
| 94 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 95 | obj->setSinCos(sinValue, cosValue, px, py); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 96 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 97 | static void setSinCos__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sinValue, jfloat cosValue) { |
| 98 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 99 | obj->setSinCos(sinValue, cosValue); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 100 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 101 | static void setSkew__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky, jfloat px, jfloat py) { |
| 102 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 103 | obj->setSkew(kx, ky, px, py); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 104 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 105 | static void setSkew__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky) { |
| 106 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 107 | obj->setSkew(kx, ky); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 108 | } |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 109 | static void setConcat(JNIEnv* env, jobject clazz, jlong objHandle, jlong aHandle, jlong bHandle) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 110 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
| 111 | SkMatrix* a = reinterpret_cast<SkMatrix*>(aHandle); |
| 112 | SkMatrix* b = reinterpret_cast<SkMatrix*>(bHandle); |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 113 | obj->setConcat(*a, *b); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 114 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 115 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 116 | static void preTranslate(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx, jfloat dy) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 117 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 118 | obj->preTranslate(dx, dy); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 119 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 120 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 121 | static void preScale__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy, jfloat px, jfloat py) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 122 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 123 | obj->preScale(sx, sy, px, py); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 124 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 125 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 126 | static void preScale__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 127 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 128 | obj->preScale(sx, sy); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 129 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 130 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 131 | static void preRotate__FFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees, jfloat px, jfloat py) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 132 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 133 | obj->preRotate(degrees, px, py); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 134 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 135 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 136 | static void preRotate__F(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 137 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 138 | obj->preRotate(degrees); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 139 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 140 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 141 | static void preSkew__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky, jfloat px, jfloat py) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 142 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 143 | obj->preSkew(kx, ky, px, py); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 144 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 145 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 146 | static void preSkew__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 147 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 148 | obj->preSkew(kx, ky); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 149 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 150 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 151 | static void preConcat(JNIEnv* env, jobject clazz, jlong objHandle, jlong otherHandle) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 152 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
| 153 | SkMatrix* other = reinterpret_cast<SkMatrix*>(otherHandle); |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 154 | obj->preConcat(*other); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 155 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 156 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 157 | static void postTranslate(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx, jfloat dy) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 158 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 159 | obj->postTranslate(dx, dy); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 160 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 161 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 162 | static void postScale__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy, jfloat px, jfloat py) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 163 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 164 | obj->postScale(sx, sy, px, py); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 165 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 166 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 167 | static void postScale__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat sx, jfloat sy) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 168 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 169 | obj->postScale(sx, sy); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 170 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 171 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 172 | static void postRotate__FFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees, jfloat px, jfloat py) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 173 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 174 | obj->postRotate(degrees, px, py); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 175 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 176 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 177 | static void postRotate__F(JNIEnv* env, jobject clazz, jlong objHandle, jfloat degrees) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 178 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 179 | obj->postRotate(degrees); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 180 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 181 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 182 | static void postSkew__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat kx, jfloat ky, jfloat px, jfloat py) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 183 | SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 184 | obj->postSkew(kx, ky, px, py); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 185 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 186 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 187 | static void postSkew__FF(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloat kx, jfloat ky) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 188 | SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 189 | matrix->postSkew(kx, ky); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 190 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 191 | |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 192 | static void postConcat(JNIEnv* env, jobject clazz, jlong matrixHandle, jlong otherHandle) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 193 | SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); |
| 194 | SkMatrix* other = reinterpret_cast<SkMatrix*>(otherHandle); |
Leon Scroggins | cc11f15 | 2014-03-31 16:52:13 -0400 | [diff] [blame] | 195 | matrix->postConcat(*other); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 196 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 197 | |
| 198 | static jboolean setRectToRect(JNIEnv* env, jobject clazz, jlong matrixHandle, jobject src, jobject dst, jint stfHandle) { |
| 199 | SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); |
| 200 | SkMatrix::ScaleToFit stf = static_cast<SkMatrix::ScaleToFit>(stfHandle); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 201 | SkRect src_; |
| 202 | GraphicsJNI::jrectf_to_rect(env, src, &src_); |
| 203 | SkRect dst_; |
| 204 | GraphicsJNI::jrectf_to_rect(env, dst, &dst_); |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 205 | return matrix->setRectToRect(src_, dst_, stf) ? JNI_TRUE : JNI_FALSE; |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 206 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 207 | |
| 208 | static jboolean setPolyToPoly(JNIEnv* env, jobject clazz, jlong matrixHandle, |
| 209 | jfloatArray jsrc, jint srcIndex, |
| 210 | jfloatArray jdst, jint dstIndex, jint ptCount) { |
| 211 | SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 212 | SkASSERT(srcIndex >= 0); |
| 213 | SkASSERT(dstIndex >= 0); |
| 214 | SkASSERT((unsigned)ptCount <= 4); |
| 215 | |
Mathieu Chartier | 768480c | 2014-01-25 17:54:22 -0800 | [diff] [blame] | 216 | AutoJavaFloatArray autoSrc(env, jsrc, srcIndex + (ptCount << 1), kRO_JNIAccess); |
| 217 | AutoJavaFloatArray autoDst(env, jdst, dstIndex + (ptCount << 1), kRW_JNIAccess); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 218 | float* src = autoSrc.ptr() + srcIndex; |
| 219 | float* dst = autoDst.ptr() + dstIndex; |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 220 | bool result; |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 221 | |
Leon Scroggins | 46cb9bd | 2014-03-06 15:36:39 -0500 | [diff] [blame] | 222 | #ifdef SK_SCALAR_IS_FLOAT |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 223 | result = matrix->setPolyToPoly((const SkPoint*)src, (const SkPoint*)dst, |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 224 | ptCount); |
Leon Scroggins | 46cb9bd | 2014-03-06 15:36:39 -0500 | [diff] [blame] | 225 | #else |
| 226 | SkASSERT(false); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 227 | #endif |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 228 | return result ? JNI_TRUE : JNI_FALSE; |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 229 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 230 | |
| 231 | static jboolean invert(JNIEnv* env, jobject clazz, jlong matrixHandle, jlong inverseHandle) { |
| 232 | SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); |
| 233 | SkMatrix* inverse = reinterpret_cast<SkMatrix*>(inverseHandle); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 234 | return matrix->invert(inverse); |
| 235 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 236 | |
| 237 | static void mapPoints(JNIEnv* env, jobject clazz, jlong matrixHandle, |
| 238 | jfloatArray dst, jint dstIndex, |
| 239 | jfloatArray src, jint srcIndex, |
| 240 | jint ptCount, jboolean isPts) { |
| 241 | SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 242 | SkASSERT(ptCount >= 0); |
Mathieu Chartier | 768480c | 2014-01-25 17:54:22 -0800 | [diff] [blame] | 243 | AutoJavaFloatArray autoSrc(env, src, srcIndex + (ptCount << 1), kRO_JNIAccess); |
| 244 | AutoJavaFloatArray autoDst(env, dst, dstIndex + (ptCount << 1), kRW_JNIAccess); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 245 | float* srcArray = autoSrc.ptr() + srcIndex; |
| 246 | float* dstArray = autoDst.ptr() + dstIndex; |
Leon Scroggins | 46cb9bd | 2014-03-06 15:36:39 -0500 | [diff] [blame] | 247 | #ifdef SK_SCALAR_IS_FLOAT |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 248 | if (isPts) |
| 249 | matrix->mapPoints((SkPoint*)dstArray, (const SkPoint*)srcArray, |
| 250 | ptCount); |
| 251 | else |
| 252 | matrix->mapVectors((SkVector*)dstArray, (const SkVector*)srcArray, |
| 253 | ptCount); |
Leon Scroggins | 46cb9bd | 2014-03-06 15:36:39 -0500 | [diff] [blame] | 254 | #else |
| 255 | SkASSERT(false); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 256 | #endif |
| 257 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 258 | |
| 259 | static jboolean mapRect__RectFRectF(JNIEnv* env, jobject clazz, jlong matrixHandle, jobjectArray dst, jobject src) { |
| 260 | SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 261 | SkRect dst_, src_; |
| 262 | GraphicsJNI::jrectf_to_rect(env, src, &src_); |
| 263 | jboolean rectStaysRect = matrix->mapRect(&dst_, src_); |
| 264 | GraphicsJNI::rect_to_jrectf(dst_, env, dst); |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 265 | return rectStaysRect ? JNI_TRUE : JNI_FALSE; |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 266 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 267 | |
| 268 | static jfloat mapRadius(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloat radius) { |
| 269 | SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); |
| 270 | float result; |
Leon Scroggins III | 2e0103e | 2014-04-04 17:05:24 -0400 | [diff] [blame] | 271 | result = SkScalarToFloat(matrix->mapRadius(radius)); |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 272 | return static_cast<jfloat>(result); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 273 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 274 | static void getValues(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloatArray values) { |
| 275 | SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); |
Mathieu Chartier | 768480c | 2014-01-25 17:54:22 -0800 | [diff] [blame] | 276 | AutoJavaFloatArray autoValues(env, values, 9, kRW_JNIAccess); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 277 | float* dst = autoValues.ptr(); |
Leon Scroggins | 46cb9bd | 2014-03-06 15:36:39 -0500 | [diff] [blame] | 278 | #ifdef SK_SCALAR_IS_FLOAT |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 279 | for (int i = 0; i < 9; i++) { |
| 280 | dst[i] = matrix->get(i); |
| 281 | } |
Leon Scroggins | 46cb9bd | 2014-03-06 15:36:39 -0500 | [diff] [blame] | 282 | #else |
| 283 | SkASSERT(false); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 284 | #endif |
| 285 | } |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 286 | |
| 287 | static void setValues(JNIEnv* env, jobject clazz, jlong matrixHandle, jfloatArray values) { |
| 288 | SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); |
Mathieu Chartier | 768480c | 2014-01-25 17:54:22 -0800 | [diff] [blame] | 289 | AutoJavaFloatArray autoValues(env, values, 9, kRO_JNIAccess); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 290 | const float* src = autoValues.ptr(); |
| 291 | |
Leon Scroggins | 46cb9bd | 2014-03-06 15:36:39 -0500 | [diff] [blame] | 292 | #ifdef SK_SCALAR_IS_FLOAT |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 293 | for (int i = 0; i < 9; i++) { |
| 294 | matrix->set(i, src[i]); |
| 295 | } |
Leon Scroggins | 46cb9bd | 2014-03-06 15:36:39 -0500 | [diff] [blame] | 296 | #else |
| 297 | SkASSERT(false); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 298 | #endif |
| 299 | } |
| 300 | |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 301 | static jboolean equals(JNIEnv* env, jobject clazz, jlong aHandle, jlong bHandle) { |
| 302 | const SkMatrix* a = reinterpret_cast<SkMatrix*>(aHandle); |
| 303 | const SkMatrix* b = reinterpret_cast<SkMatrix*>(bHandle); |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 304 | return *a == *b; |
| 305 | } |
| 306 | }; |
| 307 | |
| 308 | static JNINativeMethod methods[] = { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 309 | {"finalizer", "(J)V", (void*) SkMatrixGlue::finalizer}, |
| 310 | {"native_create","(J)J", (void*) SkMatrixGlue::create}, |
Chris Craik | 4136a0a | 2014-10-07 15:09:46 -0700 | [diff] [blame] | 311 | |
| 312 | {"native_isIdentity","!(J)Z", (void*) SkMatrixGlue::isIdentity}, |
| 313 | {"native_isAffine","!(J)Z", (void*) SkMatrixGlue::isAffine}, |
| 314 | {"native_rectStaysRect","!(J)Z", (void*) SkMatrixGlue::rectStaysRect}, |
| 315 | {"native_reset","!(J)V", (void*) SkMatrixGlue::reset}, |
| 316 | {"native_set","!(JJ)V", (void*) SkMatrixGlue::set}, |
| 317 | {"native_setTranslate","!(JFF)V", (void*) SkMatrixGlue::setTranslate}, |
| 318 | {"native_setScale","!(JFFFF)V", (void*) SkMatrixGlue::setScale__FFFF}, |
| 319 | {"native_setScale","!(JFF)V", (void*) SkMatrixGlue::setScale__FF}, |
| 320 | {"native_setRotate","!(JFFF)V", (void*) SkMatrixGlue::setRotate__FFF}, |
| 321 | {"native_setRotate","!(JF)V", (void*) SkMatrixGlue::setRotate__F}, |
| 322 | {"native_setSinCos","!(JFFFF)V", (void*) SkMatrixGlue::setSinCos__FFFF}, |
| 323 | {"native_setSinCos","!(JFF)V", (void*) SkMatrixGlue::setSinCos__FF}, |
| 324 | {"native_setSkew","!(JFFFF)V", (void*) SkMatrixGlue::setSkew__FFFF}, |
| 325 | {"native_setSkew","!(JFF)V", (void*) SkMatrixGlue::setSkew__FF}, |
| 326 | {"native_setConcat","!(JJJ)V", (void*) SkMatrixGlue::setConcat}, |
| 327 | {"native_preTranslate","!(JFF)V", (void*) SkMatrixGlue::preTranslate}, |
| 328 | {"native_preScale","!(JFFFF)V", (void*) SkMatrixGlue::preScale__FFFF}, |
| 329 | {"native_preScale","!(JFF)V", (void*) SkMatrixGlue::preScale__FF}, |
| 330 | {"native_preRotate","!(JFFF)V", (void*) SkMatrixGlue::preRotate__FFF}, |
| 331 | {"native_preRotate","!(JF)V", (void*) SkMatrixGlue::preRotate__F}, |
| 332 | {"native_preSkew","!(JFFFF)V", (void*) SkMatrixGlue::preSkew__FFFF}, |
| 333 | {"native_preSkew","!(JFF)V", (void*) SkMatrixGlue::preSkew__FF}, |
| 334 | {"native_preConcat","!(JJ)V", (void*) SkMatrixGlue::preConcat}, |
| 335 | {"native_postTranslate","!(JFF)V", (void*) SkMatrixGlue::postTranslate}, |
| 336 | {"native_postScale","!(JFFFF)V", (void*) SkMatrixGlue::postScale__FFFF}, |
| 337 | {"native_postScale","!(JFF)V", (void*) SkMatrixGlue::postScale__FF}, |
| 338 | {"native_postRotate","!(JFFF)V", (void*) SkMatrixGlue::postRotate__FFF}, |
| 339 | {"native_postRotate","!(JF)V", (void*) SkMatrixGlue::postRotate__F}, |
| 340 | {"native_postSkew","!(JFFFF)V", (void*) SkMatrixGlue::postSkew__FFFF}, |
| 341 | {"native_postSkew","!(JFF)V", (void*) SkMatrixGlue::postSkew__FF}, |
| 342 | {"native_postConcat","!(JJ)V", (void*) SkMatrixGlue::postConcat}, |
| 343 | {"native_setRectToRect","!(JLandroid/graphics/RectF;Landroid/graphics/RectF;I)Z", (void*) SkMatrixGlue::setRectToRect}, |
| 344 | {"native_setPolyToPoly","!(J[FI[FII)Z", (void*) SkMatrixGlue::setPolyToPoly}, |
| 345 | {"native_invert","!(JJ)Z", (void*) SkMatrixGlue::invert}, |
| 346 | {"native_mapPoints","!(J[FI[FIIZ)V", (void*) SkMatrixGlue::mapPoints}, |
| 347 | {"native_mapRect","!(JLandroid/graphics/RectF;Landroid/graphics/RectF;)Z", (void*) SkMatrixGlue::mapRect__RectFRectF}, |
| 348 | {"native_mapRadius","!(JF)F", (void*) SkMatrixGlue::mapRadius}, |
| 349 | {"native_getValues","!(J[F)V", (void*) SkMatrixGlue::getValues}, |
| 350 | {"native_setValues","!(J[F)V", (void*) SkMatrixGlue::setValues}, |
| 351 | {"native_equals", "!(JJ)Z", (void*) SkMatrixGlue::equals} |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 352 | }; |
| 353 | |
Jeff Brown | 20e987b | 2010-08-23 12:01:02 -0700 | [diff] [blame] | 354 | static jfieldID sNativeInstanceField; |
| 355 | |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 356 | int register_android_graphics_Matrix(JNIEnv* env) { |
Andreas Gampe | ed6b9df | 2014-11-20 22:02:20 -0800 | [diff] [blame] | 357 | int result = RegisterMethodsOrDie(env, "android/graphics/Matrix", methods, NELEM(methods)); |
Jeff Brown | 20e987b | 2010-08-23 12:01:02 -0700 | [diff] [blame] | 358 | |
Andreas Gampe | ed6b9df | 2014-11-20 22:02:20 -0800 | [diff] [blame] | 359 | jclass clazz = FindClassOrDie(env, "android/graphics/Matrix"); |
| 360 | sNativeInstanceField = GetFieldIDOrDie(env, clazz, "native_instance", "J"); |
Jeff Brown | 20e987b | 2010-08-23 12:01:02 -0700 | [diff] [blame] | 361 | |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 362 | return result; |
| 363 | } |
| 364 | |
Jeff Brown | 20e987b | 2010-08-23 12:01:02 -0700 | [diff] [blame] | 365 | SkMatrix* android_graphics_Matrix_getSkMatrix(JNIEnv* env, jobject matrixObj) { |
Ashok Bhat | 36bef0b | 2014-01-20 20:08:01 +0000 | [diff] [blame] | 366 | return reinterpret_cast<SkMatrix*>(env->GetLongField(matrixObj, sNativeInstanceField)); |
Jeff Brown | 20e987b | 2010-08-23 12:01:02 -0700 | [diff] [blame] | 367 | } |
| 368 | |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 369 | } |