Replace framework usage of SkMatrix with a stable C API
Isolate the usage of SkMatrix within the graphics module and
replace external usages with a stable C API.
Bug: 137655431
Test: CTS presubmit
Change-Id: I058051a6afb4ae6d48ecdcf5cf8bd21aa0995e90
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index c3c7b95..0068476 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -1541,6 +1541,8 @@
@FastNative
private static native float nativeGetAxisValue(long nativePtr,
int axis, int pointerIndex, int historyPos);
+ @FastNative
+ private static native void nativeTransform(long nativePtr, Matrix matrix);
// -------------- @CriticalNative ----------------------
@@ -1614,8 +1616,6 @@
@CriticalNative
private static native void nativeScale(long nativePtr, float scale);
- @CriticalNative
- private static native void nativeTransform(long nativePtr, long matrix);
private MotionEvent() {
}
@@ -3210,7 +3210,7 @@
throw new IllegalArgumentException("matrix must not be null");
}
- nativeTransform(mNativePtr, matrix.native_instance);
+ nativeTransform(mNativePtr, matrix);
}
/**
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 98ce8b0..6e6746f 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -345,8 +345,9 @@
srcs: [
"android/graphics/apex/android_bitmap.cpp",
- "android/graphics/apex/android_region.cpp",
+ "android/graphics/apex/android_matrix.cpp",
"android/graphics/apex/android_paint.cpp",
+ "android/graphics/apex/android_region.cpp",
"android_graphics_Canvas.cpp",
"android_graphics_ColorSpace.cpp",
diff --git a/core/jni/android/graphics/Matrix.h b/core/jni/android/graphics/Matrix.h
index 11c9e72..fe90d2e 100644
--- a/core/jni/android/graphics/Matrix.h
+++ b/core/jni/android/graphics/Matrix.h
@@ -23,7 +23,7 @@
namespace android {
/* Gets the underlying SkMatrix from a Matrix object. */
-extern SkMatrix* android_graphics_Matrix_getSkMatrix(JNIEnv* env, jobject matrixObj);
+SkMatrix* android_graphics_Matrix_getSkMatrix(JNIEnv* env, jobject matrixObj);
} // namespace android
diff --git a/core/jni/android/graphics/apex/android_matrix.cpp b/core/jni/android/graphics/apex/android_matrix.cpp
new file mode 100644
index 0000000..309360d
--- /dev/null
+++ b/core/jni/android/graphics/apex/android_matrix.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "android/graphics/matrix.h"
+#include "Matrix.h"
+
+bool AMatrix_getContents(JNIEnv* env, jobject matrixObj, float values[9]) {
+ static_assert(SkMatrix::kMScaleX == 0, "SkMatrix unexpected index");
+ static_assert(SkMatrix::kMSkewX == 1, "SkMatrix unexpected index");
+ static_assert(SkMatrix::kMTransX == 2, "SkMatrix unexpected index");
+ static_assert(SkMatrix::kMSkewY == 3, "SkMatrix unexpected index");
+ static_assert(SkMatrix::kMScaleY == 4, "SkMatrix unexpected index");
+ static_assert(SkMatrix::kMTransY == 5, "SkMatrix unexpected index");
+ static_assert(SkMatrix::kMPersp0 == 6, "SkMatrix unexpected index");
+ static_assert(SkMatrix::kMPersp1 == 7, "SkMatrix unexpected index");
+ static_assert(SkMatrix::kMPersp2 == 8, "SkMatrix unexpected index");
+
+ SkMatrix* m = android::android_graphics_Matrix_getSkMatrix(env, matrixObj);
+ if (m != nullptr) {
+ m->get9(values);
+ return true;
+ }
+ return false;
+}
diff --git a/core/jni/android/graphics/apex/include/android/graphics/matrix.h b/core/jni/android/graphics/apex/include/android/graphics/matrix.h
new file mode 100644
index 0000000..4039cd1
--- /dev/null
+++ b/core/jni/android/graphics/apex/include/android/graphics/matrix.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_GRAPHICS_MATRIX_H
+#define ANDROID_GRAPHICS_MATRIX_H
+
+#include <jni.h>
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+
+/**
+ * Returns an array of floats that represents the 3x3 matrix of the java object.
+ * @param values The 9 values of the 3x3 matrix in the following order.
+ * values[0] = scaleX values[1] = skewX values[2] = transX
+ * values[3] = skewY values[4] = scaleY values[5] = transY
+ * values[6] = persp0 values[7] = persp1 values[8] = persp2
+ * @return true if the values param was populated and false otherwise.
+
+ */
+bool AMatrix_getContents(JNIEnv* env, jobject matrixObj, float values[9]);
+
+__END_DECLS
+
+#endif // ANDROID_GRAPHICS_MATRIX_H
diff --git a/core/jni/android_view_MotionEvent.cpp b/core/jni/android_view_MotionEvent.cpp
index c75c54b..feb9fe3 100644
--- a/core/jni/android_view_MotionEvent.cpp
+++ b/core/jni/android_view_MotionEvent.cpp
@@ -18,7 +18,7 @@
#include <nativehelper/JNIHelp.h>
-#include <SkMatrix.h>
+#include <android/graphics/matrix.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>
#include <utils/Log.h>
@@ -571,6 +571,15 @@
}
}
+static void android_view_MotionEvent_nativeTransform(JNIEnv* env, jclass clazz,
+ jlong nativePtr, jobject matrixObj) {
+ MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
+
+ float m[9];
+ AMatrix_getContents(env, matrixObj, m);
+ event->transform(m);
+}
+
// ----------------- @CriticalNative ------------------------------
static jlong android_view_MotionEvent_nativeCopy(jlong destNativePtr, jlong sourceNativePtr,
@@ -745,24 +754,6 @@
event->scale(scale);
}
-static void android_view_MotionEvent_nativeTransform(jlong nativePtr, jlong matrixPtr) {
- MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
- SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
-
- static_assert(SkMatrix::kMScaleX == 0, "SkMatrix unexpected index");
- static_assert(SkMatrix::kMSkewX == 1, "SkMatrix unexpected index");
- static_assert(SkMatrix::kMTransX == 2, "SkMatrix unexpected index");
- static_assert(SkMatrix::kMSkewY == 3, "SkMatrix unexpected index");
- static_assert(SkMatrix::kMScaleY == 4, "SkMatrix unexpected index");
- static_assert(SkMatrix::kMTransY == 5, "SkMatrix unexpected index");
- static_assert(SkMatrix::kMPersp0 == 6, "SkMatrix unexpected index");
- static_assert(SkMatrix::kMPersp1 == 7, "SkMatrix unexpected index");
- static_assert(SkMatrix::kMPersp2 == 8, "SkMatrix unexpected index");
- float m[9];
- matrix->get9(m);
- event->transform(m);
-}
-
// ----------------------------------------------------------------------------
static const JNINativeMethod gMotionEventMethods[] = {
@@ -810,6 +801,9 @@
{ "nativeGetAxisValue",
"(JIII)F",
(void*)android_view_MotionEvent_nativeGetAxisValue },
+ { "nativeTransform",
+ "(JLandroid/graphics/Matrix;)V",
+ (void*)android_view_MotionEvent_nativeTransform },
// --------------- @CriticalNative ------------------
@@ -912,9 +906,6 @@
{ "nativeScale",
"(JF)V",
(void*)android_view_MotionEvent_nativeScale },
- { "nativeTransform",
- "(JJ)V",
- (void*)android_view_MotionEvent_nativeTransform },
};
int register_android_view_MotionEvent(JNIEnv* env) {