diff options
author | Owen Lin <owenlin@google.com> | 2012-04-25 18:49:09 +0800 |
---|---|---|
committer | Owen Lin <owenlin@google.com> | 2012-05-17 12:48:02 -0700 |
commit | f970c2e6de52ef0da91c3c8f3b48a44303d0eb73 (patch) | |
tree | 4eb7903fba27c51bf7f5c8912496ccb223e65f52 /core/jni/android/graphics | |
parent | 9cb376e792567b5278e0eb418a3aeb848339a283 (diff) | |
download | frameworks_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.h | 1 | ||||
-rw-r--r-- | core/jni/android/graphics/BitmapRegionDecoder.cpp | 29 |
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(); |