summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author chaviw <chaviw@google.com> 2021-08-10 13:56:04 -0500
committer Chavi Weingarten <chaviw@google.com> 2021-08-16 14:50:22 +0000
commit8ca2be726d07ad0810c29692158a0c9c57b563d4 (patch)
tree5c08a76959d5dc3f4215134e0228615f8872b252
parent577a74da8d0afb7a869a07a2fb5996b13906237d (diff)
Add transform matrix to InputWindowHandle.
Added the transform matrix from WindowInfo native to the Java side InputWindowHandle. This is to allow clients that register a WindowInfoListener to translate the window's screen coordinates to window space. Test: Transform is now sent to WindowInfoListener Bug: 188792659 Change-Id: Ifba8488ff470d3c6c8066e23b871c3d541cff0a1
-rw-r--r--core/java/android/view/InputWindowHandle.java9
-rw-r--r--core/jni/android_hardware_input_InputWindowHandle.cpp12
-rw-r--r--libs/hwui/apex/android_matrix.cpp7
-rw-r--r--libs/hwui/apex/include/android/graphics/matrix.h10
-rw-r--r--libs/hwui/jni/android_graphics_Matrix.cpp7
-rw-r--r--libs/hwui/jni/android_graphics_Matrix.h3
-rw-r--r--libs/hwui/libhwui.map.txt1
7 files changed, 49 insertions, 0 deletions
diff --git a/core/java/android/view/InputWindowHandle.java b/core/java/android/view/InputWindowHandle.java
index 1cb1439f4032..e21d775f7f53 100644
--- a/core/java/android/view/InputWindowHandle.java
+++ b/core/java/android/view/InputWindowHandle.java
@@ -19,6 +19,7 @@ package android.view;
import static android.view.Display.INVALID_DISPLAY;
import android.annotation.Nullable;
+import android.graphics.Matrix;
import android.graphics.Region;
import android.gui.TouchOcclusionMode;
import android.os.IBinder;
@@ -122,6 +123,12 @@ public final class InputWindowHandle {
*/
public boolean replaceTouchableRegionWithCrop;
+ /**
+ * The transform that should be applied to the Window to get it from screen coordinates to
+ * window coordinates
+ */
+ public Matrix transform;
+
private native void nativeDispose();
public InputWindowHandle(InputApplicationHandle inputApplicationHandle, int displayId) {
@@ -136,6 +143,8 @@ public final class InputWindowHandle {
.append(frameRight).append(",").append(frameBottom).append("]")
.append(", touchableRegion=").append(touchableRegion)
.append(", visible=").append(visible)
+ .append(", scaleFactor=").append(scaleFactor)
+ .append(", transform=").append(transform)
.toString();
}
diff --git a/core/jni/android_hardware_input_InputWindowHandle.cpp b/core/jni/android_hardware_input_InputWindowHandle.cpp
index 3f51dd8617c1..671d556a9717 100644
--- a/core/jni/android_hardware_input_InputWindowHandle.cpp
+++ b/core/jni/android_hardware_input_InputWindowHandle.cpp
@@ -26,6 +26,7 @@
#include <ui/Region.h>
#include <utils/threads.h>
+#include <android/graphics/matrix.h>
#include <gui/WindowInfo.h>
#include "SkRegion.h"
#include "android_hardware_input_InputApplicationHandle.h"
@@ -74,6 +75,7 @@ static struct {
jfieldID displayId;
jfieldID replaceTouchableRegionWithCrop;
WeakRefHandleField touchableRegionSurfaceControl;
+ jfieldID transform;
} gInputWindowHandleClassInfo;
static struct {
@@ -305,6 +307,13 @@ jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, gui::WindowIn
env->SetIntField(inputWindowHandle, gInputWindowHandleClassInfo.inputFeatures,
static_cast<int32_t>(windowInfo.inputFeatures.get()));
+ float transformVals[9];
+ for (int i = 0; i < 9; i++) {
+ transformVals[i] = windowInfo.transform[i % 3][i / 3];
+ }
+ ScopedLocalRef<jobject> matrixObj(env, AMatrix_newInstance(env, transformVals));
+ env->SetObjectField(inputWindowHandle, gInputWindowHandleClassInfo.transform, matrixObj.get());
+
return inputWindowHandle;
}
@@ -429,6 +438,9 @@ int register_android_view_InputWindowHandle(JNIEnv* env) {
GET_FIELD_ID(gInputWindowHandleClassInfo.replaceTouchableRegionWithCrop, clazz,
"replaceTouchableRegionWithCrop", "Z");
+ GET_FIELD_ID(gInputWindowHandleClassInfo.transform, clazz, "transform",
+ "Landroid/graphics/Matrix;");
+
jclass weakRefClazz;
FIND_CLASS(weakRefClazz, "java/lang/ref/Reference");
diff --git a/libs/hwui/apex/android_matrix.cpp b/libs/hwui/apex/android_matrix.cpp
index 693b22b62663..04ac3cf0ebc8 100644
--- a/libs/hwui/apex/android_matrix.cpp
+++ b/libs/hwui/apex/android_matrix.cpp
@@ -35,3 +35,10 @@ bool AMatrix_getContents(JNIEnv* env, jobject matrixObj, float values[9]) {
}
return false;
}
+
+jobject AMatrix_newInstance(JNIEnv* env, float values[9]) {
+ jobject matrixObj = android::android_graphics_Matrix_newInstance(env);
+ SkMatrix* m = android::android_graphics_Matrix_getSkMatrix(env, matrixObj);
+ m->set9(values);
+ return matrixObj;
+}
diff --git a/libs/hwui/apex/include/android/graphics/matrix.h b/libs/hwui/apex/include/android/graphics/matrix.h
index 987ad13f7635..5705ba485ba3 100644
--- a/libs/hwui/apex/include/android/graphics/matrix.h
+++ b/libs/hwui/apex/include/android/graphics/matrix.h
@@ -34,6 +34,16 @@ __BEGIN_DECLS
*/
ANDROID_API bool AMatrix_getContents(JNIEnv* env, jobject matrixObj, float values[9]);
+/**
+ * Returns a new Matrix jobject that contains the values passed in as initial values.
+ * @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 The matrix jobject
+ */
+ANDROID_API jobject AMatrix_newInstance(JNIEnv* env, float values[9]);
+
__END_DECLS
#endif // ANDROID_GRAPHICS_MATRIX_H
diff --git a/libs/hwui/jni/android_graphics_Matrix.cpp b/libs/hwui/jni/android_graphics_Matrix.cpp
index 7338ef24cb58..cf6702e45fff 100644
--- a/libs/hwui/jni/android_graphics_Matrix.cpp
+++ b/libs/hwui/jni/android_graphics_Matrix.cpp
@@ -378,13 +378,17 @@ static const JNINativeMethod methods[] = {
{"nEquals", "(JJ)Z", (void*) SkMatrixGlue::equals}
};
+static jclass sClazz;
static jfieldID sNativeInstanceField;
+static jmethodID sCtor;
int register_android_graphics_Matrix(JNIEnv* env) {
int result = RegisterMethodsOrDie(env, "android/graphics/Matrix", methods, NELEM(methods));
jclass clazz = FindClassOrDie(env, "android/graphics/Matrix");
+ sClazz = MakeGlobalRefOrDie(env, clazz);
sNativeInstanceField = GetFieldIDOrDie(env, clazz, "native_instance", "J");
+ sCtor = GetMethodIDOrDie(env, clazz, "<init>", "()V");
return result;
}
@@ -393,4 +397,7 @@ SkMatrix* android_graphics_Matrix_getSkMatrix(JNIEnv* env, jobject matrixObj) {
return reinterpret_cast<SkMatrix*>(env->GetLongField(matrixObj, sNativeInstanceField));
}
+jobject android_graphics_Matrix_newInstance(JNIEnv* env) {
+ return env->NewObject(sClazz, sCtor);
+}
}
diff --git a/libs/hwui/jni/android_graphics_Matrix.h b/libs/hwui/jni/android_graphics_Matrix.h
index fe90d2ef945d..79de48b46954 100644
--- a/libs/hwui/jni/android_graphics_Matrix.h
+++ b/libs/hwui/jni/android_graphics_Matrix.h
@@ -25,6 +25,9 @@ namespace android {
/* Gets the underlying SkMatrix from a Matrix object. */
SkMatrix* android_graphics_Matrix_getSkMatrix(JNIEnv* env, jobject matrixObj);
+/* Creates a new Matrix java object. */
+jobject android_graphics_Matrix_newInstance(JNIEnv* env);
+
} // namespace android
#endif // _ANDROID_GRAPHICS_MATRIX_H_
diff --git a/libs/hwui/libhwui.map.txt b/libs/hwui/libhwui.map.txt
index 73de0d12a60b..77b8a44d85a1 100644
--- a/libs/hwui/libhwui.map.txt
+++ b/libs/hwui/libhwui.map.txt
@@ -28,6 +28,7 @@ LIBHWUI {
register_android_graphics_GraphicsStatsService;
zygote_preload_graphics;
AMatrix_getContents;
+ AMatrix_newInstance;
APaint_createPaint;
APaint_destroyPaint;
APaint_setBlendMode;