diff --git a/meson.build b/meson.build index 5136061c..8c8cddca 100644 --- a/meson.build +++ b/meson.build @@ -86,6 +86,7 @@ libtranslationlayer_so = shared_library('translation_layer_main', [ 'src/api-impl-jni/graphics/android_graphics_BitmapFactory.c', 'src/api-impl-jni/graphics/android_graphics_drawable_Drawable.c', 'src/api-impl-jni/graphics/android_graphics_drawable_DrawableContainer.c', + 'src/api-impl-jni/graphics/android_graphics_Matrix.c', 'src/api-impl-jni/graphics/android_graphics_Typeface.c', 'src/api-impl-jni/graphics/NinePatchPaintable.c', 'src/api-impl-jni/media/android_media_MediaCodec.c', diff --git a/src/api-impl-jni/defines.h b/src/api-impl-jni/defines.h index ec6c6bb4..ec5f7df7 100644 --- a/src/api-impl-jni/defines.h +++ b/src/api-impl-jni/defines.h @@ -30,6 +30,8 @@ #define _GET_INT_FIELD(object, field) ((*env)->GetIntField(env, object, _FIELD_ID(_CLASS(object), field, "I"))) #define _SET_BOOL_FIELD(object, field, value) ((*env)->SetBooleanField(env, object, _FIELD_ID(_CLASS(object), field, "Z"), value)) #define _GET_BOOL_FIELD(object, field) ((*env)->GetBooleanField(env, object, _FIELD_ID(_CLASS(object), field, "Z"))) +#define _GET_FLOAT_FIELD(object, field) ((*env)->GetFloatField(env, object, _FIELD_ID(_CLASS(object), field, "F"))) +#define _SET_FLOAT_FIELD(object, field, value) ((*env)->SetFloatField(env, object, _FIELD_ID(_CLASS(object), field, "F"), value)) #define _SET_STATIC_INT_FIELD(class, field, value) ((*env)->SetStaticIntField(env, class, _STATIC_FIELD_ID(class, field, "I"), value)) #define _SET_STATIC_OBJ_FIELD(class, field, type, value) ((*env)->SetStaticObjectField(env, class, _STATIC_FIELD_ID(class, field, type), value)) #define _GET_STATIC_OBJ_FIELD(class, field, type) ((*env)->GetStaticObjectField(env, class, _STATIC_FIELD_ID(class, field, type))) diff --git a/src/api-impl-jni/generated_headers/android_graphics_Matrix.h b/src/api-impl-jni/generated_headers/android_graphics_Matrix.h index 0c3e594b..a709e8ff 100644 --- a/src/api-impl-jni/generated_headers/android_graphics_Matrix.h +++ b/src/api-impl-jni/generated_headers/android_graphics_Matrix.h @@ -25,325 +25,333 @@ extern "C" { #define android_graphics_Matrix_MPERSP_1 7L #undef android_graphics_Matrix_MPERSP_2 #define android_graphics_Matrix_MPERSP_2 8L +/* + * Class: android_graphics_Matrix + * Method: native_create + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_android_graphics_Matrix_native_1create + (JNIEnv *, jclass, jlong); + /* * Class: android_graphics_Matrix * Method: native_isIdentity - * Signature: (I)Z + * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1isIdentity - (JNIEnv *, jclass, jint); + (JNIEnv *, jclass, jlong); /* * Class: android_graphics_Matrix * Method: native_rectStaysRect - * Signature: (I)Z + * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1rectStaysRect - (JNIEnv *, jclass, jint); + (JNIEnv *, jclass, jlong); /* * Class: android_graphics_Matrix * Method: native_reset - * Signature: (I)V + * Signature: (J)V */ JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1reset - (JNIEnv *, jclass, jint); + (JNIEnv *, jclass, jlong); /* * Class: android_graphics_Matrix * Method: native_set - * Signature: (II)V + * Signature: (JJ)V */ JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1set - (JNIEnv *, jclass, jint, jint); + (JNIEnv *, jclass, jlong, jlong); /* * Class: android_graphics_Matrix * Method: native_setTranslate - * Signature: (IFF)V + * Signature: (JFF)V */ JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setTranslate - (JNIEnv *, jclass, jint, jfloat, jfloat); + (JNIEnv *, jclass, jlong, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_setScale - * Signature: (IFFFF)V + * Signature: (JFFFF)V */ -JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setScale__IFFFF - (JNIEnv *, jclass, jint, jfloat, jfloat, jfloat, jfloat); +JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setScale__JFFFF + (JNIEnv *, jclass, jlong, jfloat, jfloat, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_setScale - * Signature: (IFF)V + * Signature: (JFF)V */ -JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setScale__IFF - (JNIEnv *, jclass, jint, jfloat, jfloat); +JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setScale__JFF + (JNIEnv *, jclass, jlong, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_setRotate - * Signature: (IFFF)V + * Signature: (JFFF)V */ -JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setRotate__IFFF - (JNIEnv *, jclass, jint, jfloat, jfloat, jfloat); +JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setRotate__JFFF + (JNIEnv *, jclass, jlong, jfloat, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_setRotate - * Signature: (IF)V + * Signature: (JF)V */ -JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setRotate__IF - (JNIEnv *, jclass, jint, jfloat); +JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setRotate__JF + (JNIEnv *, jclass, jlong, jfloat); /* * Class: android_graphics_Matrix * Method: native_setSinCos - * Signature: (IFFFF)V + * Signature: (JFFFF)V */ -JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setSinCos__IFFFF - (JNIEnv *, jclass, jint, jfloat, jfloat, jfloat, jfloat); +JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setSinCos__JFFFF + (JNIEnv *, jclass, jlong, jfloat, jfloat, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_setSinCos - * Signature: (IFF)V + * Signature: (JFF)V */ -JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setSinCos__IFF - (JNIEnv *, jclass, jint, jfloat, jfloat); +JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setSinCos__JFF + (JNIEnv *, jclass, jlong, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_setSkew - * Signature: (IFFFF)V + * Signature: (JFFFF)V */ -JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setSkew__IFFFF - (JNIEnv *, jclass, jint, jfloat, jfloat, jfloat, jfloat); +JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setSkew__JFFFF + (JNIEnv *, jclass, jlong, jfloat, jfloat, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_setSkew - * Signature: (IFF)V + * Signature: (JFF)V */ -JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setSkew__IFF - (JNIEnv *, jclass, jint, jfloat, jfloat); +JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setSkew__JFF + (JNIEnv *, jclass, jlong, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_setConcat - * Signature: (III)Z + * Signature: (JJJ)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1setConcat - (JNIEnv *, jclass, jint, jint, jint); + (JNIEnv *, jclass, jlong, jlong, jlong); /* * Class: android_graphics_Matrix * Method: native_preTranslate - * Signature: (IFF)Z + * Signature: (JFF)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preTranslate - (JNIEnv *, jclass, jint, jfloat, jfloat); + (JNIEnv *, jclass, jlong, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_preScale - * Signature: (IFFFF)Z + * Signature: (JFFFF)Z */ -JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preScale__IFFFF - (JNIEnv *, jclass, jint, jfloat, jfloat, jfloat, jfloat); +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preScale__JFFFF + (JNIEnv *, jclass, jlong, jfloat, jfloat, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_preScale - * Signature: (IFF)Z + * Signature: (JFF)Z */ -JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preScale__IFF - (JNIEnv *, jclass, jint, jfloat, jfloat); +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preScale__JFF + (JNIEnv *, jclass, jlong, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_preRotate - * Signature: (IFFF)Z + * Signature: (JFFF)Z */ -JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preRotate__IFFF - (JNIEnv *, jclass, jint, jfloat, jfloat, jfloat); +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preRotate__JFFF + (JNIEnv *, jclass, jlong, jfloat, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_preRotate - * Signature: (IF)Z + * Signature: (JF)Z */ -JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preRotate__IF - (JNIEnv *, jclass, jint, jfloat); +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preRotate__JF + (JNIEnv *, jclass, jlong, jfloat); /* * Class: android_graphics_Matrix * Method: native_preSkew - * Signature: (IFFFF)Z + * Signature: (JFFFF)Z */ -JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preSkew__IFFFF - (JNIEnv *, jclass, jint, jfloat, jfloat, jfloat, jfloat); +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preSkew__JFFFF + (JNIEnv *, jclass, jlong, jfloat, jfloat, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_preSkew - * Signature: (IFF)Z + * Signature: (JFF)Z */ -JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preSkew__IFF - (JNIEnv *, jclass, jint, jfloat, jfloat); +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preSkew__JFF + (JNIEnv *, jclass, jlong, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_preConcat - * Signature: (II)Z + * Signature: (JJ)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preConcat - (JNIEnv *, jclass, jint, jint); + (JNIEnv *, jclass, jlong, jlong); /* * Class: android_graphics_Matrix * Method: native_postTranslate - * Signature: (IFF)Z + * Signature: (JFF)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postTranslate - (JNIEnv *, jclass, jint, jfloat, jfloat); + (JNIEnv *, jclass, jlong, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_postScale - * Signature: (IFFFF)Z + * Signature: (JFFFF)Z */ -JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postScale__IFFFF - (JNIEnv *, jclass, jint, jfloat, jfloat, jfloat, jfloat); +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postScale__JFFFF + (JNIEnv *, jclass, jlong, jfloat, jfloat, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_postScale - * Signature: (IFF)Z + * Signature: (JFF)Z */ -JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postScale__IFF - (JNIEnv *, jclass, jint, jfloat, jfloat); +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postScale__JFF + (JNIEnv *, jclass, jlong, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_postRotate - * Signature: (IFFF)Z + * Signature: (JFFF)Z */ -JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postRotate__IFFF - (JNIEnv *, jclass, jint, jfloat, jfloat, jfloat); +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postRotate__JFFF + (JNIEnv *, jclass, jlong, jfloat, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_postRotate - * Signature: (IF)Z + * Signature: (JF)Z */ -JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postRotate__IF - (JNIEnv *, jclass, jint, jfloat); +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postRotate__JF + (JNIEnv *, jclass, jlong, jfloat); /* * Class: android_graphics_Matrix * Method: native_postSkew - * Signature: (IFFFF)Z + * Signature: (JFFFF)Z */ -JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postSkew__IFFFF - (JNIEnv *, jclass, jint, jfloat, jfloat, jfloat, jfloat); +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postSkew__JFFFF + (JNIEnv *, jclass, jlong, jfloat, jfloat, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_postSkew - * Signature: (IFF)Z + * Signature: (JFF)Z */ -JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postSkew__IFF - (JNIEnv *, jclass, jint, jfloat, jfloat); +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postSkew__JFF + (JNIEnv *, jclass, jlong, jfloat, jfloat); /* * Class: android_graphics_Matrix * Method: native_postConcat - * Signature: (II)Z + * Signature: (JJ)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postConcat - (JNIEnv *, jclass, jint, jint); + (JNIEnv *, jclass, jlong, jlong); /* * Class: android_graphics_Matrix * Method: native_setRectToRect - * Signature: (ILandroid/graphics/RectF;Landroid/graphics/RectF;I)Z + * Signature: (JLandroid/graphics/RectF;Landroid/graphics/RectF;I)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1setRectToRect - (JNIEnv *, jclass, jint, jobject, jobject, jint); + (JNIEnv *, jclass, jlong, jobject, jobject, jint); /* * Class: android_graphics_Matrix * Method: native_setPolyToPoly - * Signature: (I[FI[FII)Z + * Signature: (J[FI[FII)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1setPolyToPoly - (JNIEnv *, jclass, jint, jfloatArray, jint, jfloatArray, jint, jint); + (JNIEnv *, jclass, jlong, jfloatArray, jint, jfloatArray, jint, jint); /* * Class: android_graphics_Matrix * Method: native_invert - * Signature: (II)Z + * Signature: (JJ)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1invert - (JNIEnv *, jclass, jint, jint); + (JNIEnv *, jclass, jlong, jlong); /* * Class: android_graphics_Matrix * Method: native_mapPoints - * Signature: (I[FI[FIIZ)V + * Signature: (J[FI[FIIZ)V */ JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1mapPoints - (JNIEnv *, jclass, jint, jfloatArray, jint, jfloatArray, jint, jint, jboolean); + (JNIEnv *, jclass, jlong, jfloatArray, jint, jfloatArray, jint, jint, jboolean); /* * Class: android_graphics_Matrix * Method: native_mapRect - * Signature: (ILandroid/graphics/RectF;Landroid/graphics/RectF;)Z + * Signature: (JLandroid/graphics/RectF;Landroid/graphics/RectF;)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1mapRect - (JNIEnv *, jclass, jint, jobject, jobject); + (JNIEnv *, jclass, jlong, jobject, jobject); /* * Class: android_graphics_Matrix * Method: native_mapRadius - * Signature: (IF)F + * Signature: (JF)F */ JNIEXPORT jfloat JNICALL Java_android_graphics_Matrix_native_1mapRadius - (JNIEnv *, jclass, jint, jfloat); + (JNIEnv *, jclass, jlong, jfloat); /* * Class: android_graphics_Matrix * Method: native_getValues - * Signature: (I[F)V + * Signature: (J[F)V */ JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1getValues - (JNIEnv *, jclass, jint, jfloatArray); + (JNIEnv *, jclass, jlong, jfloatArray); /* * Class: android_graphics_Matrix * Method: native_setValues - * Signature: (I[F)V + * Signature: (J[F)V */ JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setValues - (JNIEnv *, jclass, jint, jfloatArray); + (JNIEnv *, jclass, jlong, jfloatArray); /* * Class: android_graphics_Matrix * Method: native_equals - * Signature: (II)Z + * Signature: (JJ)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1equals - (JNIEnv *, jclass, jint, jint); + (JNIEnv *, jclass, jlong, jlong); /* * Class: android_graphics_Matrix * Method: finalizer - * Signature: (I)V + * Signature: (J)V */ JNIEXPORT void JNICALL Java_android_graphics_Matrix_finalizer - (JNIEnv *, jclass, jint); + (JNIEnv *, jclass, jlong); #ifdef __cplusplus } diff --git a/src/api-impl-jni/generated_headers/android_graphics_Path.h b/src/api-impl-jni/generated_headers/android_graphics_Path.h index fd960254..6b07b059 100644 --- a/src/api-impl-jni/generated_headers/android_graphics_Path.h +++ b/src/api-impl-jni/generated_headers/android_graphics_Path.h @@ -250,10 +250,10 @@ JNIEXPORT void JNICALL Java_android_graphics_Path_native_1addPath__II /* * Class: android_graphics_Path * Method: native_addPath - * Signature: (III)V + * Signature: (IIJ)V */ -JNIEXPORT void JNICALL Java_android_graphics_Path_native_1addPath__III - (JNIEnv *, jclass, jint, jint, jint); +JNIEXPORT void JNICALL Java_android_graphics_Path_native_1addPath__IIJ + (JNIEnv *, jclass, jint, jint, jlong); /* * Class: android_graphics_Path @@ -282,18 +282,18 @@ JNIEXPORT void JNICALL Java_android_graphics_Path_native_1setLastPoint /* * Class: android_graphics_Path * Method: native_transform - * Signature: (III)V + * Signature: (IJI)V */ -JNIEXPORT void JNICALL Java_android_graphics_Path_native_1transform__III - (JNIEnv *, jclass, jint, jint, jint); +JNIEXPORT void JNICALL Java_android_graphics_Path_native_1transform__IJI + (JNIEnv *, jclass, jint, jlong, jint); /* * Class: android_graphics_Path * Method: native_transform - * Signature: (II)V + * Signature: (IJ)V */ -JNIEXPORT void JNICALL Java_android_graphics_Path_native_1transform__II - (JNIEnv *, jclass, jint, jint); +JNIEXPORT void JNICALL Java_android_graphics_Path_native_1transform__IJ + (JNIEnv *, jclass, jint, jlong); /* * Class: android_graphics_Path diff --git a/src/api-impl-jni/generated_headers/android_view_View.h b/src/api-impl-jni/generated_headers/android_view_View.h index 335f891a..98c21f34 100644 --- a/src/api-impl-jni/generated_headers/android_view_View.h +++ b/src/api-impl-jni/generated_headers/android_view_View.h @@ -319,6 +319,14 @@ JNIEXPORT void JNICALL Java_android_view_View_native_1setVisibility JNIEXPORT void JNICALL Java_android_view_View_setOnLongClickListener (JNIEnv *, jobject, jobject); +/* + * Class: android_view_View + * Method: native_getMatrix + * Signature: (JJ)Z + */ +JNIEXPORT jboolean JNICALL Java_android_view_View_native_1getMatrix + (JNIEnv *, jobject, jlong, jlong); + /* * Class: android_view_View * Method: native_getGlobalVisibleRect diff --git a/src/api-impl-jni/graphics/android_graphics_Matrix.c b/src/api-impl-jni/graphics/android_graphics_Matrix.c new file mode 100644 index 00000000..c85b16d8 --- /dev/null +++ b/src/api-impl-jni/graphics/android_graphics_Matrix.c @@ -0,0 +1,167 @@ +#include +#include + +#include "../defines.h" +#include "../util.h" + +#include "../generated_headers/android_graphics_Matrix.h" + +JNIEXPORT jlong JNICALL Java_android_graphics_Matrix_native_1create(JNIEnv *env, jclass class, jlong src) +{ + return _INTPTR(graphene_matrix_init_identity(graphene_matrix_alloc())); +} + +JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1getValues(JNIEnv *env, jclass class, jlong src, jfloatArray values_ref) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(src); + jfloat *value = (*env)->GetFloatArrayElements(env, values_ref, NULL); + value[android_graphics_Matrix_MSCALE_X] = graphene_matrix_get_value(matrix, 0, 0); + value[android_graphics_Matrix_MSKEW_X] = graphene_matrix_get_value(matrix, 0, 1); + value[android_graphics_Matrix_MTRANS_X] = graphene_matrix_get_value(matrix, 0, 3); + value[android_graphics_Matrix_MSKEW_Y] = graphene_matrix_get_value(matrix, 1, 0); + value[android_graphics_Matrix_MSCALE_Y] = graphene_matrix_get_value(matrix, 1, 1); + value[android_graphics_Matrix_MTRANS_Y] = graphene_matrix_get_value(matrix, 1, 3); + value[android_graphics_Matrix_MPERSP_0] = graphene_matrix_get_value(matrix, 3, 0); + value[android_graphics_Matrix_MPERSP_1] = graphene_matrix_get_value(matrix, 3, 1); + value[android_graphics_Matrix_MPERSP_2] = graphene_matrix_get_value(matrix, 3, 3); + (*env)->ReleaseFloatArrayElements(env, values_ref, value, 0); +} + +JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1set(JNIEnv *env, jclass class, jlong dest_ptr, jlong src_ptr) +{ + graphene_matrix_t *dest = (graphene_matrix_t *)_PTR(dest_ptr); + graphene_matrix_t *src = (graphene_matrix_t *)_PTR(src_ptr); + graphene_matrix_init_from_matrix(dest, src); +} + +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1isIdentity(JNIEnv *env, jclass class, jlong matrix_ptr) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(matrix_ptr); + return graphene_matrix_is_identity(matrix); +} + +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1preConcat(JNIEnv *env, jclass class, jlong matrix_ptr, jlong other_ptr) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(matrix_ptr); + graphene_matrix_t *other = (graphene_matrix_t *)_PTR(other_ptr); + graphene_matrix_multiply(matrix, other, matrix); + + return true; +} + +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1mapRect(JNIEnv *env, jclass class, jlong matrix_ptr, jobject dest, jobject src) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(matrix_ptr); + graphene_rect_t src_rect = GRAPHENE_RECT_INIT( + _GET_FLOAT_FIELD(src, "left"), + _GET_FLOAT_FIELD(src, "top"), + _GET_FLOAT_FIELD(src, "right") - _GET_FLOAT_FIELD(src, "left"), + _GET_FLOAT_FIELD(src, "bottom") - _GET_FLOAT_FIELD(src, "top") + ); + + graphene_quad_t dest_quad; + graphene_matrix_transform_rect(matrix, &src_rect, &dest_quad); + graphene_rect_t dest_rect; + graphene_quad_bounds(&dest_quad, &dest_rect); + + _SET_FLOAT_FIELD(dest, "left", dest_rect.origin.x); + _SET_FLOAT_FIELD(dest, "top", dest_rect.origin.y); + _SET_FLOAT_FIELD(dest, "right", dest_rect.origin.x + dest_rect.size.width); + _SET_FLOAT_FIELD(dest, "bottom", dest_rect.origin.y + dest_rect.size.height); + return true; +} + +JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1reset(JNIEnv *env, jclass class, jlong matrix_ptr) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(matrix_ptr); + graphene_matrix_init_identity(matrix); +} + +JNIEXPORT void JNICALL Java_android_graphics_Matrix_finalizer(JNIEnv *env, jclass class, jlong matrix_ptr) +{ + graphene_matrix_free((graphene_matrix_t *)_PTR(matrix_ptr)); +} + +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postTranslate(JNIEnv *env, jclass class, jlong matrix_ptr, jfloat x, jfloat y) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(matrix_ptr); + graphene_point3d_t translation = GRAPHENE_POINT3D_INIT(x, y, 0); + graphene_matrix_translate(matrix, &translation); + return true; +} + +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postScale__JFF(JNIEnv *env, jclass class, jlong matrix_ptr, jfloat x, jfloat y) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(matrix_ptr); + graphene_matrix_scale(matrix, x, y, 1.f); + return true; +} + +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postRotate__JFFF(JNIEnv *env, jclass class, jlong matrix_ptr, jfloat degrees, jfloat px, jfloat py) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(matrix_ptr); + graphene_matrix_translate(matrix, &GRAPHENE_POINT3D_INIT(-px, -py, 0)); + graphene_matrix_rotate_z(matrix, degrees); + graphene_matrix_translate(matrix, &GRAPHENE_POINT3D_INIT(px, py, 0)); + return true; +} + +JNIEXPORT void Java_android_graphics_Matrix_native_1setScale__JFF(JNIEnv *env, jclass class, jlong matrix_ptr, jfloat x, jfloat y) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(matrix_ptr); + graphene_matrix_init_scale(matrix, x, y, 1.f); +} + +JNIEXPORT void JNICALL Java_android_graphics_Matrix_native_1setScale__JFFFF(JNIEnv *env, jclass class, jlong matrix_ptr, jfloat x, jfloat y, jfloat px, jfloat py) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(matrix_ptr); + graphene_matrix_init_translate(matrix, &GRAPHENE_POINT3D_INIT(-px, -py, 0)); + graphene_matrix_scale(matrix, x, y, 1.f); + graphene_matrix_translate(matrix, &GRAPHENE_POINT3D_INIT(px, py, 0)); +} + +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postScale__JFFFF(JNIEnv *env, jclass class, jlong matrix_ptr, jfloat x, jfloat y, jfloat px, jfloat py) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(matrix_ptr); + graphene_matrix_translate(matrix, &GRAPHENE_POINT3D_INIT(-px, -py, 0)); + graphene_matrix_scale(matrix, x, y, 1.f); + graphene_matrix_translate(matrix, &GRAPHENE_POINT3D_INIT(px, py, 0)); + return true; +} + +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1postRotate__JF(JNIEnv *env, jclass class, jlong matrix_ptr, jfloat degrees) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(matrix_ptr); + graphene_matrix_rotate_z(matrix, degrees); + return true; +} + +#define SCALE_TO_FIT_FILL 0 +#define SCALE_TO_FIT_START 1 +#define SCALE_TO_FIT_CENTER 2 +#define SCALE_TO_FIT_END 3 +JNIEXPORT jboolean JNICALL Java_android_graphics_Matrix_native_1setRectToRect(JNIEnv *env, jclass class, jlong matrix_ptr, jobject src, jobject dest, jint stf) +{ + graphene_matrix_t *matrix = (graphene_matrix_t *)_PTR(matrix_ptr); + graphene_matrix_init_translate(matrix, &GRAPHENE_POINT3D_INIT(-_GET_FLOAT_FIELD(src, "left"), -_GET_FLOAT_FIELD(src, "top"), 0)); + float src_width = _GET_FLOAT_FIELD(src, "right") - _GET_FLOAT_FIELD(src, "left"); + float src_height = _GET_FLOAT_FIELD(src, "bottom") - _GET_FLOAT_FIELD(src, "top"); + float dest_width = _GET_FLOAT_FIELD(dest, "right") - _GET_FLOAT_FIELD(dest, "left"); + float dest_height = _GET_FLOAT_FIELD(dest, "bottom") - _GET_FLOAT_FIELD(dest, "top"); + float factor_x = dest_width / src_width; + float factor_y = dest_height / src_height; + if (stf != SCALE_TO_FIT_FILL) { + factor_x = factor_y = (factor_x < factor_y) ? factor_x : factor_y; + } + graphene_matrix_scale(matrix, factor_x, factor_y, 1.f); + graphene_point3d_t translation = GRAPHENE_POINT3D_INIT(_GET_FLOAT_FIELD(dest, "left"), _GET_FLOAT_FIELD(dest, "top"), 0); + if (stf == SCALE_TO_FIT_CENTER) { + translation.x += (dest_width - src_width * factor_x) / 2; + translation.y += (dest_height - src_height * factor_y) / 2; + } else if (stf == SCALE_TO_FIT_END) { + translation.x += (dest_width - src_width * factor_x); + translation.y += (dest_height - src_height * factor_y); + } + graphene_matrix_translate(matrix, &translation); + return true; +} diff --git a/src/api-impl-jni/views/android_view_View.c b/src/api-impl-jni/views/android_view_View.c index 6ca78d62..c392c38d 100644 --- a/src/api-impl-jni/views/android_view_View.c +++ b/src/api-impl-jni/views/android_view_View.c @@ -523,3 +523,9 @@ JNIEXPORT void JNICALL Java_android_view_View_setOnLongClickListener(JNIEnv *env gtk_widget_add_controller(widget, controller); g_object_set_data(G_OBJECT(widget), "on_long_click_listener", controller); } + +JNIEXPORT jboolean JNICALL Java_android_view_View_native_1getMatrix(JNIEnv *env, jobject this, jlong widget_ptr, jlong matrix_ptr) +{ + GtkWidget *widget = GTK_WIDGET(_PTR(widget_ptr)); + return gtk_widget_compute_transform(gtk_widget_get_parent(gtk_widget_get_parent(widget)), widget, _PTR(matrix_ptr)); +} diff --git a/src/api-impl/android/graphics/Matrix.java b/src/api-impl/android/graphics/Matrix.java index 05bfb359..5292aac0 100644 --- a/src/api-impl/android/graphics/Matrix.java +++ b/src/api-impl/android/graphics/Matrix.java @@ -183,7 +183,7 @@ public class Matrix { /** * @hide */ - public int native_instance; + public long native_instance; /** * Create an identity matrix */ @@ -202,8 +202,7 @@ public class Matrix { * This maybe faster than testing if (getType() == 0) */ public boolean isIdentity() { - return true; - // return native_isIdentity(native_instance); + return native_isIdentity(native_instance); } /** * Returns true if will map a rectangle to another rectangle. This can be @@ -221,7 +220,7 @@ public class Matrix { if (src == null) { reset(); } else { - // native_set(native_instance, src.native_instance); + native_set(native_instance, src.native_instance); } } /** @@ -246,7 +245,7 @@ public class Matrix { * Set the matrix to identity */ public void reset() { - // native_reset(native_instance); + native_reset(native_instance); } /** * Set the matrix to translate by (dx, dy). @@ -260,13 +259,13 @@ public class Matrix { * specified transformation. */ public void setScale(float sx, float sy, float px, float py) { - // native_setScale(native_instance, sx, sy, px, py); + native_setScale(native_instance, sx, sy, px, py); } /** * Set the matrix to scale by sx and sy. */ public void setScale(float sx, float sy) { - // native_setScale(native_instance, sx, sy); + native_setScale(native_instance, sx, sy); } /** * Set the matrix to rotate by the specified number of degrees, with a pivot @@ -381,32 +380,28 @@ public class Matrix { * M' = T(dx, dy) * M */ public boolean postTranslate(float dx, float dy) { - // return native_postTranslate(native_instance, dx, dy); - return true; + return native_postTranslate(native_instance, dx, dy); } /** * Postconcats the matrix with the specified scale. * M' = S(sx, sy, px, py) * M */ public boolean postScale(float sx, float sy, float px, float py) { - // return native_postScale(native_instance, sx, sy, px, py); - return true; + return native_postScale(native_instance, sx, sy, px, py); } /** * Postconcats the matrix with the specified scale. * M' = S(sx, sy) * M */ public boolean postScale(float sx, float sy) { - // return native_postScale(native_instance, sx, sy); - return true; + return native_postScale(native_instance, sx, sy); } /** * Postconcats the matrix with the specified rotation. * M' = R(degrees, px, py) * M */ public boolean postRotate(float degrees, float px, float py) { - // return native_postRotate(native_instance, degrees, px, py); - return true; + return native_postRotate(native_instance, degrees, px, py); } /** * Postconcats the matrix with the specified rotation. @@ -486,8 +481,7 @@ public class Matrix { if (dst == null || src == null) { throw new NullPointerException(); } - // return native_setRectToRect(native_instance, src, dst, stf.nativeInt); - return true; + return native_setRectToRect(native_instance, src, dst, stf.nativeInt); } // private helper to perform range checks on arrays of "points" private static void checkPointArrays(float[] src, int srcIndex, @@ -634,8 +628,7 @@ public class Matrix { if (dst == null || src == null) { throw new NullPointerException(); } - // return native_mapRect(native_instance, dst, src); - return false; + return native_mapRect(native_instance, dst, src); } /** * Apply this matrix to the rectangle, and write the transformed rectangle @@ -747,89 +740,87 @@ public class Matrix { @Override protected void finalize() throws Throwable { try { - // finalizer(native_instance); + finalizer(native_instance); } finally { super.finalize(); } } - /*package*/ final int ni() { + /*package*/ final long ni() { return native_instance; } - private static /*native*/ int native_create(int native_src_or_zero) { - return 0; - } - private static native boolean native_isIdentity(int native_object); - private static native boolean native_rectStaysRect(int native_object); - private static native void native_reset(int native_object); - private static native void native_set(int native_object, int other); - private static native void native_setTranslate(int native_object, + private static native long native_create(long native_src_or_zero); + private static native boolean native_isIdentity(long native_object); + private static native boolean native_rectStaysRect(long native_object); + private static native void native_reset(long native_object); + private static native void native_set(long native_object, long other); + private static native void native_setTranslate(long native_object, float dx, float dy); - private static native void native_setScale(int native_object, + private static native void native_setScale(long native_object, float sx, float sy, float px, float py); - private static native void native_setScale(int native_object, + private static native void native_setScale(long native_object, float sx, float sy); - private static native void native_setRotate(int native_object, + private static native void native_setRotate(long native_object, float degrees, float px, float py); - private static native void native_setRotate(int native_object, + private static native void native_setRotate(long native_object, float degrees); - private static native void native_setSinCos(int native_object, + private static native void native_setSinCos(long native_object, float sinValue, float cosValue, float px, float py); - private static native void native_setSinCos(int native_object, + private static native void native_setSinCos(long native_object, float sinValue, float cosValue); - private static native void native_setSkew(int native_object, + private static native void native_setSkew(long native_object, float kx, float ky, float px, float py); - private static native void native_setSkew(int native_object, + private static native void native_setSkew(long native_object, float kx, float ky); - private static native boolean native_setConcat(int native_object, - int a, int b); - private static native boolean native_preTranslate(int native_object, + private static native boolean native_setConcat(long native_object, + long a, long b); + private static native boolean native_preTranslate(long native_object, float dx, float dy); - private static native boolean native_preScale(int native_object, + private static native boolean native_preScale(long native_object, float sx, float sy, float px, float py); - private static native boolean native_preScale(int native_object, + private static native boolean native_preScale(long native_object, float sx, float sy); - private static native boolean native_preRotate(int native_object, + private static native boolean native_preRotate(long native_object, float degrees, float px, float py); - private static native boolean native_preRotate(int native_object, + private static native boolean native_preRotate(long native_object, float degrees); - private static native boolean native_preSkew(int native_object, + private static native boolean native_preSkew(long native_object, float kx, float ky, float px, float py); - private static native boolean native_preSkew(int native_object, + private static native boolean native_preSkew(long native_object, float kx, float ky); - private static native boolean native_preConcat(int native_object, - int other_matrix); - private static native boolean native_postTranslate(int native_object, + private static native boolean native_preConcat(long native_object, + long other_matrix); + private static native boolean native_postTranslate(long native_object, float dx, float dy); - private static native boolean native_postScale(int native_object, + private static native boolean native_postScale(long native_object, float sx, float sy, float px, float py); - private static native boolean native_postScale(int native_object, + private static native boolean native_postScale(long native_object, float sx, float sy); - private static native boolean native_postRotate(int native_object, + private static native boolean native_postRotate(long native_object, float degrees, float px, float py); - private static native boolean native_postRotate(int native_object, + private static native boolean native_postRotate(long native_object, float degrees); - private static native boolean native_postSkew(int native_object, + private static native boolean native_postSkew(long native_object, float kx, float ky, float px, float py); - private static native boolean native_postSkew(int native_object, + private static native boolean native_postSkew(long native_object, float kx, float ky); - private static native boolean native_postConcat(int native_object, - int other_matrix); - private static native boolean native_setRectToRect(int native_object, + private static native boolean native_postConcat(long native_object, + long other_matrix); + private static native boolean native_setRectToRect(long native_object, RectF src, RectF dst, int stf); - private static native boolean native_setPolyToPoly(int native_object, + private static native boolean native_setPolyToPoly(long native_object, float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount); - private static native boolean native_invert(int native_object, int inverse); - private static native void native_mapPoints(int native_object, + private static native boolean native_invert(long native_object, long inverse); + private static native void native_mapPoints(long native_object, float[] dst, int dstIndex, float[] src, int srcIndex, int ptCount, boolean isPts); - private static native boolean native_mapRect(int native_object, + private static native boolean native_mapRect(long native_object, RectF dst, RectF src); - private static native float native_mapRadius(int native_object, + private static native float native_mapRadius(long native_object, float radius); - private static native void native_getValues(int native_object, + private static native void native_getValues(long native_object, float[] values); - private static native void native_setValues(int native_object, + private static native void native_setValues(long native_object, float[] values); - private static native boolean native_equals(int native_a, int native_b); - private static native void finalizer(int native_instance); + private static native boolean native_equals(long native_a, long native_b); + private static native void finalizer(long native_instance); } diff --git a/src/api-impl/android/graphics/Path.java b/src/api-impl/android/graphics/Path.java index c19f1bf4..397f0789 100644 --- a/src/api-impl/android/graphics/Path.java +++ b/src/api-impl/android/graphics/Path.java @@ -709,12 +709,12 @@ mDetectSimplePaths = HardwareRenderer.isAvailable(); private static native void native_addRoundRect(int nPath, RectF r, float[] radii, int dir); private static native void native_addPath(int nPath, int src, float dx, float dy); private static native void native_addPath(int nPath, int src); - private static native void native_addPath(int nPath, int src, int matrix); + private static native void native_addPath(int nPath, int src, long matrix); private static native void native_offset(int nPath, float dx, float dy, int dst_path); private static native void native_offset(int nPath, float dx, float dy); private static native void native_setLastPoint(int nPath, float dx, float dy); - private static native void native_transform(int nPath, int matrix, int dst_path); - private static native void native_transform(int nPath, int matrix); + private static native void native_transform(int nPath, long matrix, int dst_path); + private static native void native_transform(int nPath, long matrix); private static native boolean native_op(int path1, int path2, int op, int result); private static native void finalizer(int nPath); } diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index d74e49ce..578325ab 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -1374,7 +1374,13 @@ public class View extends Object { public boolean onGenericMotionEvent(MotionEvent event) {return false;} protected boolean awakenScrollBars() {return false;} - public Matrix getMatrix() {return new Matrix();} + + protected native boolean native_getMatrix(long widget, long matrix); + public Matrix getMatrix() { + Matrix matrix = new Matrix(); + native_getMatrix(widget, matrix.native_instance); + return matrix; + } protected static final int[] EMPTY_STATE_SET = new int[0];