Bitmap: regenerate GdkTexture when Canvas was used on the Bitmap

This commit is contained in:
Julian Winkler
2024-06-15 00:04:23 +02:00
parent 2a10196bc5
commit b81f53e4b2
4 changed files with 27 additions and 1 deletions

View File

@@ -158,3 +158,9 @@ JNIEXPORT void JNICALL Java_android_graphics_Bitmap_nativeCopyPixelsToBuffer(JNI
memcpy(pixels, gdk_pixbuf_get_pixels(pixbuf), pixbuf_size);
release_nio_buffer(env, array_ref, array);
}
JNIEXPORT void JNICALL Java_android_graphics_Bitmap_native_1unref_1texture(JNIEnv *env, jclass class, jlong texture_ptr)
{
GdkTexture *texture = GDK_TEXTURE(_PTR(texture_ptr));
g_object_unref(texture);
}

View File

@@ -67,6 +67,14 @@ JNIEXPORT jlong JNICALL Java_android_graphics_Bitmap_native_1create
JNIEXPORT jlong JNICALL Java_android_graphics_Bitmap_native_1paintable_1from_1pixbuf
(JNIEnv *, jclass, jlong);
/*
* Class: android_graphics_Bitmap
* Method: native_unref_texture
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_android_graphics_Bitmap_native_1unref_1texture
(JNIEnv *, jclass, jlong);
/*
* Class: android_graphics_Bitmap
* Method: nativeCopy

View File

@@ -1607,13 +1607,24 @@ public final class Bitmap {
return texture;
}
/**
* internal ATL method to destroy the cached GdkTexture when the Bitmap was touched
*/
public void destroyTexture() {
if (texture != 0) {
native_unref_texture(texture);
texture = 0;
}
}
//////////// native methods
private native long native_bitmap_from_path(CharSequence path);
static native long native_copy(long src);
static native long native_subpixbuf(long src, int x, int y, int width, int height);
private static native long native_create(int width, int height);
public static native long native_paintable_from_pixbuf(long pixbuf);
private static native long native_paintable_from_pixbuf(long pixbuf);
private static native void native_unref_texture(long texture);
private static native Bitmap nativeCopy(int srcBitmap, int nativeConfig,
boolean isMutable);

View File

@@ -9,6 +9,7 @@ public class Canvas {
public Canvas() {}
public Canvas(Bitmap bmp) {
bmp.destroyTexture(); // invalidate cached texture
this.skia_canvas = native_canvas_from_bitmap(bmp.pixbuf);
this.widget = 0;
}