From 790255f9cac3cdfe3f70b156efea4a5b3e717fca Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Sat, 30 Dec 2023 23:35:33 +0100 Subject: [PATCH] ImageView: allow non bitmap Drawables Also pass size of child paintable in DrawableContainer --- .../android_widget_ImageView.h | 8 ++++++ ...roid_graphics_drawable_DrawableContainer.c | 28 +++++++++++++++++++ .../widgets/android_widget_ImageView.c | 7 +++++ src/api-impl/android/widget/ImageView.java | 7 ++++- 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/api-impl-jni/generated_headers/android_widget_ImageView.h b/src/api-impl-jni/generated_headers/android_widget_ImageView.h index 17742fb8..24f6b685 100644 --- a/src/api-impl-jni/generated_headers/android_widget_ImageView.h +++ b/src/api-impl-jni/generated_headers/android_widget_ImageView.h @@ -215,6 +215,14 @@ JNIEXPORT jlong JNICALL Java_android_widget_ImageView_native_1constructor JNIEXPORT void JNICALL Java_android_widget_ImageView_native_1setPixbuf (JNIEnv *, jobject, jlong); +/* + * Class: android_widget_ImageView + * Method: native_setDrawable + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_android_widget_ImageView_native_1setDrawable + (JNIEnv *, jobject, jlong, jlong); + #ifdef __cplusplus } #endif diff --git a/src/api-impl-jni/graphics/android_graphics_drawable_DrawableContainer.c b/src/api-impl-jni/graphics/android_graphics_drawable_DrawableContainer.c index 20444e4e..0ce698a4 100644 --- a/src/api-impl-jni/graphics/android_graphics_drawable_DrawableContainer.c +++ b/src/api-impl-jni/graphics/android_graphics_drawable_DrawableContainer.c @@ -15,6 +15,30 @@ static void container_paintable_snapshot(GdkPaintable *paintable, GdkSnapshot *s gdk_paintable_snapshot(container->child, snapshot, width, height); } +static double container_paintable_get_intrinsic_aspect_ratio(GdkPaintable *paintable) { + ContainerPaintable *container = CONTAINER_PAINTABLE(paintable); + if (container->child) + return gdk_paintable_get_intrinsic_aspect_ratio(container->child); + else + return 0; +} + +static int container_paintable_get_intrinsic_width(GdkPaintable *paintable) { + ContainerPaintable *container = CONTAINER_PAINTABLE(paintable); + if (container->child) + return gdk_paintable_get_intrinsic_width(container->child); + else + return 0; +} + +static int container_paintable_get_intrinsic_height(GdkPaintable *paintable) { + ContainerPaintable *container = CONTAINER_PAINTABLE(paintable); + if (container->child) + return gdk_paintable_get_intrinsic_height(container->child); + else + return 0; +} + static void container_paintable_init(ContainerPaintable *container_paintable) { } @@ -22,6 +46,9 @@ static void container_paintable_init(ContainerPaintable *container_paintable) static void container_paintable_paintable_init(GdkPaintableInterface *iface) { iface->snapshot = container_paintable_snapshot; + iface->get_intrinsic_aspect_ratio = container_paintable_get_intrinsic_aspect_ratio; + iface->get_intrinsic_width = container_paintable_get_intrinsic_width; + iface->get_intrinsic_height = container_paintable_get_intrinsic_height; } static void container_paintable_class_init(ContainerPaintableClass *class) { @@ -40,4 +67,5 @@ JNIEXPORT void JNICALL Java_android_graphics_drawable_DrawableContainer_native_1 ContainerPaintable *container = CONTAINER_PAINTABLE(_PTR(ptr)); container->child = GDK_PAINTABLE(_PTR(child_ptr)); gdk_paintable_invalidate_contents(GDK_PAINTABLE(container)); + gdk_paintable_invalidate_size(GDK_PAINTABLE(container)); } diff --git a/src/api-impl-jni/widgets/android_widget_ImageView.c b/src/api-impl-jni/widgets/android_widget_ImageView.c index 0bd63d76..7f2d4ae2 100644 --- a/src/api-impl-jni/widgets/android_widget_ImageView.c +++ b/src/api-impl-jni/widgets/android_widget_ImageView.c @@ -22,3 +22,10 @@ JNIEXPORT void JNICALL Java_android_widget_ImageView_native_1setPixbuf(JNIEnv *e GdkPixbuf *pixbuf = _PTR(pixbuf_ptr); gtk_picture_set_pixbuf(GTK_PICTURE(image), pixbuf); } + +JNIEXPORT void JNICALL Java_android_widget_ImageView_native_1setDrawable(JNIEnv *env, jobject this, jlong widget_ptr, jlong paintable_ptr) +{ + GtkPicture *picture = _PTR(widget_ptr); + GdkPaintable *paintable = _PTR(paintable_ptr); + gtk_picture_set_paintable(picture, paintable); +} diff --git a/src/api-impl/android/widget/ImageView.java b/src/api-impl/android/widget/ImageView.java index 885d2a85..6b8776ac 100644 --- a/src/api-impl/android/widget/ImageView.java +++ b/src/api-impl/android/widget/ImageView.java @@ -40,10 +40,13 @@ public class ImageView extends View { @Override protected native long native_constructor(Context context, AttributeSet attrs); protected native void native_setPixbuf(long pixbuf); + protected native void native_setDrawable(long widget, long paintable); public /*native*/ void setImageResource(final int resid) { - if (Context.this_application.getResources().getString(resid).endsWith(".xml")) + if (Context.this_application.getResources().getString(resid).endsWith(".xml")) { + setImageDrawable(getResources().getDrawable(resid)); return; + } bitmap = BitmapFactory.decodeResource(Context.this_application.getResources(), resid); native_setPixbuf(bitmap.pixbuf); } @@ -64,6 +67,8 @@ public class ImageView extends View { public void setImageDrawable(Drawable drawable) { if (drawable instanceof BitmapDrawable) { setImageBitmap(((BitmapDrawable) drawable).getBitmap()); + } else if (drawable != null) { + native_setDrawable(widget, drawable.paintable); } }