summaryrefslogtreecommitdiffstats
path: root/core/jni/android/graphics
diff options
context:
space:
mode:
authorOwen Lin <owenlin@google.com>2012-04-25 18:49:09 +0800
committerOwen Lin <owenlin@google.com>2012-05-17 12:48:02 -0700
commitf970c2e6de52ef0da91c3c8f3b48a44303d0eb73 (patch)
tree4eb7903fba27c51bf7f5c8912496ccb223e65f52 /core/jni/android/graphics
parent9cb376e792567b5278e0eb418a3aeb848339a283 (diff)
downloadframeworks_base-f970c2e6de52ef0da91c3c8f3b48a44303d0eb73.zip
frameworks_base-f970c2e6de52ef0da91c3c8f3b48a44303d0eb73.tar.gz
frameworks_base-f970c2e6de52ef0da91c3c8f3b48a44303d0eb73.tar.bz2
Nvidia's patch for reusing bitmap in image region decoding.
bug: 5884845 Change-Id: I43d4d86ee94591b0b53393dfba13c7cc5c4e428d
Diffstat (limited to 'core/jni/android/graphics')
-rw-r--r--core/jni/android/graphics/BitmapFactory.h1
-rw-r--r--core/jni/android/graphics/BitmapRegionDecoder.cpp29
2 files changed, 22 insertions, 8 deletions
diff --git a/core/jni/android/graphics/BitmapFactory.h b/core/jni/android/graphics/BitmapFactory.h
index 9ae61bc..f2aaab7 100644
--- a/core/jni/android/graphics/BitmapFactory.h
+++ b/core/jni/android/graphics/BitmapFactory.h
@@ -16,6 +16,7 @@ extern jfieldID gOptions_widthFieldID;
extern jfieldID gOptions_heightFieldID;
extern jfieldID gOptions_mimeFieldID;
extern jfieldID gOptions_mCancelID;
+extern jfieldID gOptions_bitmapFieldID;
jstring getMimeTypeString(JNIEnv* env, SkImageDecoder::Format format);
diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp
index dd8e84f..b218bcd 100644
--- a/core/jni/android/graphics/BitmapRegionDecoder.cpp
+++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp
@@ -29,6 +29,7 @@
#include "CreateJavaOutputStreamAdaptor.h"
#include "Utils.h"
#include "JNIHelp.h"
+#include "SkTScopedPtr.h"
#include <android_runtime/AndroidRuntime.h>
#include "android_util_Binder.h"
@@ -180,7 +181,8 @@ static jobject nativeNewInstanceFromAsset(JNIEnv* env, jobject clazz,
* reportSizeToVM not supported
*/
static jobject nativeDecodeRegion(JNIEnv* env, jobject, SkBitmapRegionDecoder *brd,
- int start_x, int start_y, int width, int height, jobject options) {
+ int start_x, int start_y, int width, int height, jobject options) {
+ jobject tileBitmap = NULL;
SkImageDecoder *decoder = brd->getDecoder();
int sampleSize = 1;
SkBitmap::Config prefConfig = SkBitmap::kNo_Config;
@@ -199,12 +201,12 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, SkBitmapRegionDecoder *b
doDither = env->GetBooleanField(options, gOptions_ditherFieldID);
preferQualityOverSpeed = env->GetBooleanField(options,
gOptions_preferQualityOverSpeedFieldID);
+ // Get the bitmap for re-use if it exists.
+ tileBitmap = env->GetObjectField(options, gOptions_bitmapFieldID);
}
decoder->setDitherImage(doDither);
decoder->setPreferQualityOverSpeed(preferQualityOverSpeed);
- SkBitmap* bitmap = new SkBitmap;
- SkAutoTDelete<SkBitmap> adb(bitmap);
AutoDecoderCancel adc(options, decoder);
// To fix the race condition in case "requestCancelDecode"
@@ -219,6 +221,17 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, SkBitmapRegionDecoder *b
region.fTop = start_y;
region.fRight = start_x + width;
region.fBottom = start_y + height;
+ SkBitmap* bitmap = NULL;
+ SkTScopedPtr<SkBitmap> adb;
+
+ if (tileBitmap != NULL) {
+ // Re-use bitmap.
+ bitmap = GraphicsJNI::getNativeBitmap(env, tileBitmap);
+ }
+ if (bitmap == NULL) {
+ bitmap = new SkBitmap;
+ adb.reset(bitmap);
+ }
if (!brd->decodeRegion(bitmap, region, prefConfig, sampleSize)) {
return nullObjectReturn("decoder->decodeRegion returned false");
@@ -235,12 +248,12 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, SkBitmapRegionDecoder *b
getMimeTypeString(env, decoder->getFormat()));
}
- // detach bitmap from its autodeleter, since we want to own it now
- adb.detach();
+ if (tileBitmap != NULL) {
+ return tileBitmap;
+ }
- SkPixelRef* pr = bitmap->pixelRef();
- // promise we will never change our pixels (great for sharing and pictures)
- pr->setImmutable();
+ // detach bitmap from its autodeleter, since we want to own it now
+ adb.release();
JavaPixelAllocator* allocator = (JavaPixelAllocator*) decoder->getAllocator();
jbyteArray buff = allocator->getStorageObjAndReset();