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

Commit 3eb9843a authored by Leon Scroggins III's avatar Leon Scroggins III
Browse files

Add public API for @hidden Bitmap#createAshmemBitmap

Bug: 150395371
Test: I442cd0c7a849e4c6a2fe7ba21b25a6e44417bbf5

The system needs to move off of @hidden Bitmap APIs so Bitmap can move
to a mainline module. It is valuable to provide a public way for clients
to create a Bitmap backed by ashmem, and the method's usage level is
HIGH. As I understand it, ashmem is being deprecated, so make the new
name more general: #asShared(). This method calls createAshmemBitmap(),
which must continue to exist for now due to the greylist. Add a
maxTargetSdk and publicAlternatives to move clients to the new method.

Mark asShared as @NonNull. It should only fail due to a failure to
allocate the shared memory. Throw a RunTimeException in this (rare)
case.

Add a (private) native method to check whether the Bitmap is already
backed by ashmem so it can skip the copy as necessary.

Remove outdated comments in both createAshmemBitmap methods regarding
SRGB. The new Bitmap will have the same ColorSpace as the original.

Remove the Config param from DisplayContent#screenshotLocked. It is only
ever called with ARGB_8888, which matches the ScreenshotGraphicBuffer
it is copied from. This means Bitmap#createAshmemBitmap(Config) does not
need a public version. It may need to continue to exist due to
@UnsupportedAppUsage.

Change-Id: I359187a5c70b5e241c7f5879d50fde2a7449c818
parent 8a8a7dd1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -14037,6 +14037,7 @@ package android.gesture {
package android.graphics {
  public final class Bitmap implements android.os.Parcelable {
    method @NonNull public android.graphics.Bitmap asShared();
    method @WorkerThread public boolean compress(android.graphics.Bitmap.CompressFormat, int, java.io.OutputStream);
    method public android.graphics.Bitmap copy(android.graphics.Bitmap.Config, boolean);
    method public void copyPixelsFromBuffer(java.nio.Buffer);
+1 −1
Original line number Diff line number Diff line
@@ -6731,7 +6731,7 @@ public class Notification implements Parcelable
            if (mPicture != null &&
                mPicture.isMutable() &&
                mPicture.getAllocationByteCount() >= MIN_ASHMEM_BITMAP_SIZE) {
                mPicture = mPicture.createAshmemBitmap();
                mPicture = mPicture.asShared();
            }
            if (mBigLargeIcon != null) {
                mBigLargeIcon.convertToAshmem();
+27 −5
Original line number Diff line number Diff line
@@ -686,14 +686,16 @@ public final class Bitmap implements Parcelable {
        return b;
    }

    // FIXME: The maxTargetSdk should be R, once R is no longer set to
    // CUR_DEVELOPMENT.
    /**
     * Creates a new immutable bitmap backed by ashmem which can efficiently
     * be passed between processes. The bitmap is assumed to be in the sRGB
     * color space.
     * be passed between processes.
     *
     * @hide
     */
    @UnsupportedAppUsage
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q,
            publicAlternatives = "Use {@link #asShared()} instead")
    public Bitmap createAshmemBitmap() {
        checkRecycled("Can't copy a recycled bitmap");
        noteHardwareBitmapSlowCall();
@@ -705,10 +707,27 @@ public final class Bitmap implements Parcelable {
        return b;
    }

    /**
     * Return an immutable bitmap backed by shared memory which can be
     * efficiently passed between processes via Parcelable.
     *
     * <p>If this bitmap already meets these criteria it will return itself.
     */
    @NonNull
    public Bitmap asShared() {
        if (nativeIsBackedByAshmem(mNativePtr) && nativeIsImmutable(mNativePtr)) {
            return this;
        }
        Bitmap shared = createAshmemBitmap();
        if (shared == null) {
            throw new RuntimeException("Failed to create shared Bitmap!");
        }
        return shared;
    }

    /**
     * Creates a new immutable bitmap backed by ashmem which can efficiently
     * be passed between processes. The bitmap is assumed to be in the sRGB
     * color space.
     * be passed between processes.
     *
     * @hide
     */
@@ -2346,4 +2365,7 @@ public final class Bitmap implements Parcelable {

    @CriticalNative
    private static native boolean nativeIsImmutable(long nativePtr);

    @CriticalNative
    private static native boolean nativeIsBackedByAshmem(long nativePtr);
}
+1 −1
Original line number Diff line number Diff line
@@ -467,7 +467,7 @@ public final class Icon implements Parcelable {
        if ((mType == TYPE_BITMAP || mType == TYPE_ADAPTIVE_BITMAP) &&
            getBitmap().isMutable() &&
            getBitmap().getAllocationByteCount() >= MIN_ASHMEM_ICON_SIZE) {
            setBitmap(getBitmap().createAshmemBitmap());
            setBitmap(getBitmap().asShared());
        }
    }

+10 −1
Original line number Diff line number Diff line
@@ -1216,6 +1216,14 @@ static jboolean Bitmap_isImmutable(CRITICAL_JNI_PARAMS_COMMA jlong bitmapHandle)
    return bitmapHolder->bitmap().isImmutable() ? JNI_TRUE : JNI_FALSE;
}

static jboolean Bitmap_isBackedByAshmem(CRITICAL_JNI_PARAMS_COMMA jlong bitmapHandle) {
    LocalScopedBitmap bitmapHolder(bitmapHandle);
    if (!bitmapHolder.valid()) return JNI_FALSE;

    return bitmapHolder->bitmap().pixelStorageType() == PixelStorageType::Ashmem ? JNI_TRUE
                                                                                 : JNI_FALSE;
}

static void Bitmap_setImmutable(JNIEnv* env, jobject, jlong bitmapHandle) {
    LocalScopedBitmap bitmapHolder(bitmapHandle);
    if (!bitmapHolder.valid()) return;
@@ -1282,7 +1290,8 @@ static const JNINativeMethod gBitmapMethods[] = {
    {   "nativeSetImmutable",       "(J)V", (void*)Bitmap_setImmutable},

    // ------------ @CriticalNative ----------------
    {   "nativeIsImmutable",        "(J)Z", (void*)Bitmap_isImmutable}
    {   "nativeIsImmutable",        "(J)Z", (void*)Bitmap_isImmutable},
    {   "nativeIsBackedByAshmem",   "(J)Z", (void*)Bitmap_isBackedByAshmem}

};

Loading