Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca8aef63 authored by Leon Scroggins III's avatar Leon Scroggins III
Browse files

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
parent 3111cff3
Loading
Loading
Loading
Loading
+0 −7
Original line number Diff line number Diff line
@@ -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));
}
+0 −2
Original line number Diff line number Diff line
@@ -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
+2 −2
Original line number Diff line number Diff line
@@ -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();
        }
    }

+1 −1
Original line number Diff line number Diff line
@@ -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);
+9 −3
Original line number Diff line number Diff line
@@ -436,10 +436,16 @@ public class BitmapFactory {
        static void validate(Options opts) {
            if (opts == null) return;

            if (opts.inBitmap != null && opts.inBitmap.getConfig() == Bitmap.Config.HARDWARE) {
            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) {
                throw new IllegalArgumentException("Bitmaps with Config.HARDWARE cannot be " +