From f69cff71130ab0dd0d381cdc4686016ce807557b Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Mon, 10 Feb 2025 18:04:19 +0100 Subject: [PATCH] implement Bitmap.compress() --- .../android_graphics_Bitmap.h | 8 ++++++++ .../graphics/android_graphics_Bitmap.c | 12 ++++++++++++ src/api-impl/android/graphics/Bitmap.java | 18 ++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/src/api-impl-jni/generated_headers/android_graphics_Bitmap.h b/src/api-impl-jni/generated_headers/android_graphics_Bitmap.h index 1e5bab00..b62241cd 100644 --- a/src/api-impl-jni/generated_headers/android_graphics_Bitmap.h +++ b/src/api-impl-jni/generated_headers/android_graphics_Bitmap.h @@ -79,6 +79,14 @@ JNIEXPORT void JNICALL Java_android_graphics_Bitmap_native_1get_1pixels JNIEXPORT void JNICALL Java_android_graphics_Bitmap_native_1copy_1to_1buffer (JNIEnv *, jclass, jlong, jobject, jint, jint); +/* + * Class: android_graphics_Bitmap + * Method: native_save_to_png + * Signature: (J)[B + */ +JNIEXPORT jbyteArray JNICALL Java_android_graphics_Bitmap_native_1save_1to_1png + (JNIEnv *, jclass, jlong); + #ifdef __cplusplus } #endif diff --git a/src/api-impl-jni/graphics/android_graphics_Bitmap.c b/src/api-impl-jni/graphics/android_graphics_Bitmap.c index f099e760..3ce7dad2 100644 --- a/src/api-impl-jni/graphics/android_graphics_Bitmap.c +++ b/src/api-impl-jni/graphics/android_graphics_Bitmap.c @@ -113,3 +113,15 @@ JNIEXPORT void JNICALL Java_android_graphics_Bitmap_native_1copy_1to_1buffer(JNI release_nio_buffer(env, array_ref, array); gdk_texture_downloader_free(downloader); } + +JNIEXPORT jbyteArray JNICALL Java_android_graphics_Bitmap_native_1save_1to_1png(JNIEnv *env, jclass class, jlong texture_ptr) +{ + GdkTexture *texture = GDK_TEXTURE(_PTR(texture_ptr)); + GBytes *bytes = gdk_texture_save_to_png_bytes(texture); + jbyteArray result = (*env)->NewByteArray(env, g_bytes_get_size(bytes)); + gsize size; + gconstpointer data = g_bytes_get_data(bytes, &size); + (*env)->SetByteArrayRegion(env, result, 0, size, data); + g_bytes_unref(bytes); + return result; +} diff --git a/src/api-impl/android/graphics/Bitmap.java b/src/api-impl/android/graphics/Bitmap.java index 191f8dca..93fc14e7 100644 --- a/src/api-impl/android/graphics/Bitmap.java +++ b/src/api-impl/android/graphics/Bitmap.java @@ -1,5 +1,7 @@ package android.graphics; +import java.io.IOException; +import java.io.OutputStream; import java.nio.Buffer; import android.util.DisplayMetrics; @@ -27,6 +29,11 @@ public final class Bitmap { } } + public enum CompressFormat { + JPEG, + PNG, + } + private int width; private int height; private int stride; @@ -190,6 +197,16 @@ public final class Bitmap { return true; } + public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream) throws IOException { + if (format == CompressFormat.PNG) { + stream.write(native_save_to_png(getTexture())); + return true; + } else { + stream.write(("fixme Bitmap.compress " + format.name()).getBytes()); + return false; + } + } + @SuppressWarnings("deprecation") @Override protected void finalize() throws Throwable { @@ -209,4 +226,5 @@ public final class Bitmap { private static native long native_ref_texture(long texture); private static native void native_get_pixels(long texture, int[] pixels, int offset, int stride, int x, int y, int width, int height); private static native void native_copy_to_buffer(long texture, Buffer buffer, int memory_format, int stride); + private static native byte[] native_save_to_png(long texture); }