diff options
author | Leon Scroggins III <scroggo@google.com> | 2019-03-26 12:11:27 -0400 |
---|---|---|
committer | Leon Scroggins III <scroggo@google.com> | 2019-03-26 16:50:32 -0400 |
commit | ca8aef63766b3193464b8f9b4cde45324a83789a (patch) | |
tree | 0e4b9e8cddf0673773e6c7f845892c412ee596e0 | |
parent | 3111cff3c790a340ab479cf086b2a537fb2e8df1 (diff) |
Remove bitmap::getBitmapAllocationByteCount
Test: I7eb02bc2389aadc10ee0b65993bb7e2dab27a129
Also remove gBitmap_getAllocationByteCountMethodID. These called into
Java, which then called back into native. Instead, call the native method
directly. The only extra wrinkle is that the Java method returns 0
if (mRecycled). But we would never reach that return value, since if
it was recycled, we would have crashed in native Bitmap::assertValid.
Instead, throw an IllegalArgumentException when attempting to reuse
it.
This avoids the overhead of two JNI calls, which tend to be slow.
Change-Id: I29e8d2428036252cfad532b1351e3a3d33817b43
-rwxr-xr-x | core/jni/android/graphics/Bitmap.cpp | 7 | ||||
-rw-r--r-- | core/jni/android/graphics/Bitmap.h | 2 | ||||
-rw-r--r-- | core/jni/android/graphics/BitmapFactory.cpp | 4 | ||||
-rw-r--r-- | core/jni/android/graphics/BitmapRegionDecoder.cpp | 2 | ||||
-rw-r--r-- | graphics/java/android/graphics/BitmapFactory.java | 12 |
5 files changed, 12 insertions, 15 deletions
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index e0b7629013fb..59cc5ec55206 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -39,7 +39,6 @@ static jclass gBitmap_class; static jfieldID gBitmap_nativePtr; static jmethodID gBitmap_constructorMethodID; static jmethodID gBitmap_reinitMethodID; -static jmethodID gBitmap_getAllocationByteCountMethodID; namespace android { @@ -193,11 +192,6 @@ void reinitBitmap(JNIEnv* env, jobject javaBitmap, const SkImageInfo& info, info.width(), info.height(), isPremultiplied); } -int getBitmapAllocationByteCount(JNIEnv* env, jobject javaBitmap) -{ - return env->CallIntMethod(javaBitmap, gBitmap_getAllocationByteCountMethodID); -} - jobject createBitmap(JNIEnv* env, Bitmap* bitmap, int bitmapCreateFlags, jbyteArray ninePatchChunk, jobject ninePatchInsets, int density) { @@ -1227,7 +1221,6 @@ int register_android_graphics_Bitmap(JNIEnv* env) gBitmap_nativePtr = GetFieldIDOrDie(env, gBitmap_class, "mNativePtr", "J"); gBitmap_constructorMethodID = GetMethodIDOrDie(env, gBitmap_class, "<init>", "(JIIIZ[BLandroid/graphics/NinePatch$InsetStruct;Z)V"); gBitmap_reinitMethodID = GetMethodIDOrDie(env, gBitmap_class, "reinit", "(IIZ)V"); - gBitmap_getAllocationByteCountMethodID = GetMethodIDOrDie(env, gBitmap_class, "getAllocationByteCount", "()I"); return android::RegisterMethodsOrDie(env, "android/graphics/Bitmap", gBitmapMethods, NELEM(gBitmapMethods)); } diff --git a/core/jni/android/graphics/Bitmap.h b/core/jni/android/graphics/Bitmap.h index 06877915856e..8cfef196db1b 100644 --- a/core/jni/android/graphics/Bitmap.h +++ b/core/jni/android/graphics/Bitmap.h @@ -56,8 +56,6 @@ bool unlockPixels(JNIEnv* env, jobject bitmap); void reinitBitmap(JNIEnv* env, jobject javaBitmap, const SkImageInfo& info, bool isPremultiplied); -int getBitmapAllocationByteCount(JNIEnv* env, jobject javaBitmap); - } // namespace bitmap } // namespace android diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 47b1548edb67..f510e24c9507 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -327,10 +327,10 @@ static jobject doDecode(JNIEnv* env, std::unique_ptr<SkStreamRewindable> stream, reuseBitmap = &bitmap::toBitmap(env, javaBitmap); if (reuseBitmap->isImmutable()) { ALOGW("Unable to reuse an immutable bitmap as an image decoder target."); - javaBitmap = NULL; + javaBitmap = nullptr; reuseBitmap = nullptr; } else { - existingBufferSize = bitmap::getBitmapAllocationByteCount(env, javaBitmap); + existingBufferSize = reuseBitmap->getAllocationByteCount(); } } diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp index 9c07e2d64c6e..8a632a14ee04 100644 --- a/core/jni/android/graphics/BitmapRegionDecoder.cpp +++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp @@ -162,7 +162,7 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, jlong brdHandle, jint in if (recycledBitmap->isImmutable()) { ALOGW("Warning: Reusing an immutable bitmap as an image decoder target."); } - recycledBytes = bitmap::getBitmapAllocationByteCount(env, javaBitmap); + recycledBytes = recycledBitmap->getAllocationByteCount(); } SkBitmapRegionDecoder* brd = reinterpret_cast<SkBitmapRegionDecoder*>(brdHandle); diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java index 49c3a3ba68b8..d8a864015202 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -436,9 +436,15 @@ public class BitmapFactory { static void validate(Options opts) { if (opts == null) return; - if (opts.inBitmap != null && opts.inBitmap.getConfig() == Bitmap.Config.HARDWARE) { - throw new IllegalArgumentException( - "Bitmaps with Config.HARDWARE are always immutable"); + if (opts.inBitmap != null) { + if (opts.inBitmap.getConfig() == Bitmap.Config.HARDWARE) { + throw new IllegalArgumentException( + "Bitmaps with Config.HARDWARE are always immutable"); + } + if (opts.inBitmap.isRecycled()) { + throw new IllegalArgumentException( + "Cannot reuse a recycled Bitmap"); + } } if (opts.inMutable && opts.inPreferredConfig == Bitmap.Config.HARDWARE) { |