diff options
author | 2021-08-10 13:56:04 -0500 | |
---|---|---|
committer | 2021-08-16 14:50:22 +0000 | |
commit | 8ca2be726d07ad0810c29692158a0c9c57b563d4 (patch) | |
tree | 5c08a76959d5dc3f4215134e0228615f8872b252 | |
parent | 577a74da8d0afb7a869a07a2fb5996b13906237d (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.java | 9 | ||||
-rw-r--r-- | core/jni/android_hardware_input_InputWindowHandle.cpp | 12 | ||||
-rw-r--r-- | libs/hwui/apex/android_matrix.cpp | 7 | ||||
-rw-r--r-- | libs/hwui/apex/include/android/graphics/matrix.h | 10 | ||||
-rw-r--r-- | libs/hwui/jni/android_graphics_Matrix.cpp | 7 | ||||
-rw-r--r-- | libs/hwui/jni/android_graphics_Matrix.h | 3 | ||||
-rw-r--r-- | libs/hwui/libhwui.map.txt | 1 |
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; |