diff --git a/src/api-impl-jni/android_graphics_Bitmap.c b/src/api-impl-jni/android_graphics_Bitmap.c index c1600b11..d540abe4 100644 --- a/src/api-impl-jni/android_graphics_Bitmap.c +++ b/src/api-impl-jni/android_graphics_Bitmap.c @@ -26,3 +26,29 @@ JNIEXPORT jint JNICALL Java_android_graphics_Bitmap_getHeight(JNIEnv *env, jobje return gdk_pixbuf_get_height(pixbuf); } + +JNIEXPORT void JNICALL Java_android_graphics_Bitmap_nativeGetPixels(JNIEnv *env, jclass, jlong bitmapHandle, jintArray pixelArray, jint offset, jint stride, jint x, jint y, jint width, jint height, jboolean premultiplied) { + int i,j; + GdkPixbuf *pixbuf = _PTR(bitmapHandle); + g_assert(gdk_pixbuf_get_n_channels(pixbuf) == 4); + g_assert(gdk_pixbuf_get_colorspace(pixbuf) == GDK_COLORSPACE_RGB); + jint *dst = (*env)->GetIntArrayElements(env, pixelArray, NULL); + jint *d = dst + offset; + const guint8 *src = gdk_pixbuf_read_pixels(pixbuf); + int rowstride = gdk_pixbuf_get_rowstride(pixbuf); + src += y * rowstride + x; + for (i=0; iReleaseIntArrayElements(env, pixelArray, dst, 0); +} + +JNIEXPORT jboolean JNICALL Java_android_graphics_Bitmap_nativeRecycle(JNIEnv *env, jclass, jlong bitmapHandle) { + GdkPixbuf *pixbuf = _PTR(bitmapHandle); + g_object_unref(pixbuf); + return true; +} 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 5819dc32..f64e690f 100644 --- a/src/api-impl-jni/generated_headers/android_graphics_Bitmap.h +++ b/src/api-impl-jni/generated_headers/android_graphics_Bitmap.h @@ -54,10 +54,10 @@ JNIEXPORT void JNICALL Java_android_graphics_Bitmap_nativeDestructor /* * Class: android_graphics_Bitmap * Method: nativeRecycle - * Signature: (I)Z + * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_android_graphics_Bitmap_nativeRecycle - (JNIEnv *, jclass, jint); + (JNIEnv *, jclass, jlong); /* * Class: android_graphics_Bitmap @@ -110,10 +110,10 @@ JNIEXPORT jint JNICALL Java_android_graphics_Bitmap_nativeGetPixel /* * Class: android_graphics_Bitmap * Method: nativeGetPixels - * Signature: (I[IIIIIIIZ)V + * Signature: (J[IIIIIIIZ)V */ JNIEXPORT void JNICALL Java_android_graphics_Bitmap_nativeGetPixels - (JNIEnv *, jclass, jint, jintArray, jint, jint, jint, jint, jint, jint, jboolean); + (JNIEnv *, jclass, jlong, jintArray, jint, jint, jint, jint, jint, jint, jboolean); /* * Class: android_graphics_Bitmap diff --git a/src/api-impl/android/content/res/AssetManager.java b/src/api-impl/android/content/res/AssetManager.java index d122b428..92783032 100644 --- a/src/api-impl/android/content/res/AssetManager.java +++ b/src/api-impl/android/content/res/AssetManager.java @@ -319,7 +319,7 @@ public final class AssetManager { } asset = openAsset(fileName, accessMode); if (asset >= 0) { - AssetInputStream res = new AssetInputStream(asset); + AssetInputStream res = new AssetInputStream(asset, "/assets/" + fileName); incRefsLocked(res.hashCode()); return res; } @@ -413,7 +413,7 @@ public final class AssetManager { } asset = openNonAssetNative(cookie, fileName, accessMode); if (asset >= 0) { - AssetInputStream res = new AssetInputStream(asset); + AssetInputStream res = new AssetInputStream(asset, fileName); incRefsLocked(res.hashCode()); return res; } @@ -554,10 +554,11 @@ public final class AssetManager { public final int getAssetInt() { return mAsset; } - private AssetInputStream(int asset) + private AssetInputStream(int asset, String fileName) { mAsset = asset; mLength = getAssetLength(asset); + this.fileName = fileName; } public final int read() throws IOException { return readAssetChar(mAsset); @@ -609,6 +610,7 @@ public final class AssetManager { private int mAsset; private long mLength; private long mMarkPos; + public String fileName; } /** diff --git a/src/api-impl/android/graphics/Bitmap.java b/src/api-impl/android/graphics/Bitmap.java index f102a25e..759739b8 100644 --- a/src/api-impl/android/graphics/Bitmap.java +++ b/src/api-impl/android/graphics/Bitmap.java @@ -334,7 +334,7 @@ public final class Bitmap { */ public void recycle() { if (!mRecycled) { - if (nativeRecycle(mNativeBitmap)) { + if (nativeRecycle(pixbuf)) { // return value indicates whether native pixel object was actually recycled. // false indicates that it is still in use at the native level and these // objects should not be collected now. They will be collected later when the @@ -1352,7 +1352,7 @@ public final class Bitmap { return; // nothing to do } checkPixelsAccess(x, y, width, height, offset, stride, pixels); - nativeGetPixels(mNativeBitmap, pixels, offset, stride, + nativeGetPixels(pixbuf, pixels, offset, stride, x, y, width, height, mIsPremultiplied); } @@ -1571,7 +1571,7 @@ public final class Bitmap { private static native Bitmap nativeCopy(int srcBitmap, int nativeConfig, boolean isMutable); private static native void nativeDestructor(int nativeBitmap); - private static native boolean nativeRecycle(int nativeBitmap); + private static native boolean nativeRecycle(long nativeBitmap); private static native void nativeReconfigure(int nativeBitmap, int width, int height, int config, int allocSize); @@ -1584,7 +1584,7 @@ public final class Bitmap { private static native int nativeGetPixel(int nativeBitmap, int x, int y, boolean isPremultiplied); - private static native void nativeGetPixels(int nativeBitmap, int[] pixels, + private static native void nativeGetPixels(long nativeBitmap, int[] pixels, int offset, int stride, int x, int y, int width, int height, boolean isPremultiplied); diff --git a/src/api-impl/android/graphics/BitmapFactory.java b/src/api-impl/android/graphics/BitmapFactory.java index da49d2d1..77c3b8b1 100644 --- a/src/api-impl/android/graphics/BitmapFactory.java +++ b/src/api-impl/android/graphics/BitmapFactory.java @@ -567,8 +567,8 @@ public class BitmapFactory { Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "decodeBitmap"); try { if (is instanceof AssetManager.AssetInputStream) { - final int asset = ((AssetManager.AssetInputStream) is).getAssetInt(); - bm = nativeDecodeAsset(asset, outPadding, opts); + final String fileName = ((AssetManager.AssetInputStream) is).fileName; + bm = new Bitmap(fileName); } else { bm = decodeStreamInternal(is, outPadding, opts); }