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