implement android.graphics.Matrix and View.getMatrix()

This is needed for androidx CoordinatorLayout and will also be required
for VectorDrawables
This commit is contained in:
Julian Winkler 2024-03-13 22:51:34 +01:00
parent f852c2bbc9
commit 796742c0fc
10 changed files with 369 additions and 180 deletions

View file

@ -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',

View file

@ -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)))

View file

@ -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
}

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,167 @@
#include <graphene.h>
#include <stdint.h>
#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;
}

View file

@ -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));
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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];