Loading core/java/android/view/InputWindowHandle.java +9 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading @@ -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(); } Loading core/jni/android_hardware_input_InputWindowHandle.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -74,6 +75,7 @@ static struct { jfieldID displayId; jfieldID replaceTouchableRegionWithCrop; WeakRefHandleField touchableRegionSurfaceControl; jfieldID transform; } gInputWindowHandleClassInfo; static struct { Loading Loading @@ -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; } Loading Loading @@ -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"); Loading libs/hwui/apex/android_matrix.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -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; } libs/hwui/apex/include/android/graphics/matrix.h +10 −0 Original line number Diff line number Diff line Loading @@ -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 libs/hwui/jni/android_graphics_Matrix.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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); } } Loading
core/java/android/view/InputWindowHandle.java +9 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading @@ -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(); } Loading
core/jni/android_hardware_input_InputWindowHandle.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -74,6 +75,7 @@ static struct { jfieldID displayId; jfieldID replaceTouchableRegionWithCrop; WeakRefHandleField touchableRegionSurfaceControl; jfieldID transform; } gInputWindowHandleClassInfo; static struct { Loading Loading @@ -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; } Loading Loading @@ -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"); Loading
libs/hwui/apex/android_matrix.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -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; }
libs/hwui/apex/include/android/graphics/matrix.h +10 −0 Original line number Diff line number Diff line Loading @@ -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
libs/hwui/jni/android_graphics_Matrix.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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); } }