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

Commit 9d427400 authored by Peiyong Lin's avatar Peiyong Lin
Browse files

Replace createHardwareBitmap with wrapHardwareBuffer.

The bitmap.createHardwareBitmap doesn't take a ColorSpace as input, as a result
the returned bitmap is always in SRGB color space. Given that we want to remove
the assumption of SRGB color space, we replace the usage of
createHardwareBitmap with wrapHardwareBuffer which takes an extra argument
ColorSpace. As a result, we will be able to also fix SurfaceControl and various
other places that use screenshot in follow up patches.

BUG: 120904891
Test: CtsUiRenderingTestCases
Change-Id: I57fc0c85d68df43b0e69f9a1ebac00d2ba39554d
parent 1f034852
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -19875,7 +19875,6 @@ HSPLandroid/graphics/Bitmap;->createBitmap(Landroid/util/DisplayMetrics;IILandro
HSPLandroid/graphics/Bitmap;->createBitmap(Landroid/util/DisplayMetrics;IILandroid/graphics/Bitmap$Config;ZLandroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;
HSPLandroid/graphics/Bitmap;->createBitmap(Landroid/util/DisplayMetrics;IILandroid/graphics/Bitmap$Config;ZLandroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;
HSPLandroid/graphics/Bitmap;->createBitmap(Landroid/util/DisplayMetrics;[IIIIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;
HSPLandroid/graphics/Bitmap;->createBitmap(Landroid/util/DisplayMetrics;[IIIIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;
HSPLandroid/graphics/Bitmap;->createBitmap([IIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;
HSPLandroid/graphics/Bitmap;->createBitmap([IIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;
HSPLandroid/graphics/Bitmap;->createHardwareBitmap(Landroid/graphics/GraphicBuffer;)Landroid/graphics/Bitmap;
HSPLandroid/graphics/Bitmap;->createScaledBitmap(Landroid/graphics/Bitmap;IIZ)Landroid/graphics/Bitmap;
HSPLandroid/graphics/Bitmap;->createScaledBitmap(Landroid/graphics/Bitmap;IIZ)Landroid/graphics/Bitmap;
HSPLandroid/graphics/Bitmap;->eraseColor(I)V
HSPLandroid/graphics/Bitmap;->eraseColor(I)V
HSPLandroid/graphics/Bitmap;->extractAlpha(Landroid/graphics/Paint;[I)Landroid/graphics/Bitmap;
HSPLandroid/graphics/Bitmap;->extractAlpha(Landroid/graphics/Paint;[I)Landroid/graphics/Bitmap;
+12 −0
Original line number Original line Diff line number Diff line
@@ -42,6 +42,7 @@ import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Color;
import android.graphics.ColorSpace;
import android.graphics.GraphicBuffer;
import android.graphics.GraphicBuffer;
import android.graphics.Matrix;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.Point;
@@ -1767,6 +1768,10 @@ public class ActivityManager {
        private final int mSystemUiVisibility;
        private final int mSystemUiVisibility;
        private final boolean mIsTranslucent;
        private final boolean mIsTranslucent;


        // TODO(b/116112787) TaskSnapshot must also book keep the color space from hardware bitmap
        // when created.
        private final ColorSpace mColorSpace = ColorSpace.get(ColorSpace.Named.SRGB);

        public TaskSnapshot(@NonNull ComponentName topActivityComponent, GraphicBuffer snapshot,
        public TaskSnapshot(@NonNull ComponentName topActivityComponent, GraphicBuffer snapshot,
                int orientation, Rect contentInsets, boolean reducedResolution, float scale,
                int orientation, Rect contentInsets, boolean reducedResolution, float scale,
                boolean isRealSnapshot, int windowingMode, int systemUiVisibility,
                boolean isRealSnapshot, int windowingMode, int systemUiVisibility,
@@ -1811,6 +1816,13 @@ public class ActivityManager {
            return mSnapshot;
            return mSnapshot;
        }
        }


        /**
         * @return The color space of graphic buffer representing the screenshot.
         */
        public ColorSpace getColorSpace() {
            return mColorSpace;
        }

        /**
        /**
         * @return The screen orientation the screenshot was taken in.
         * @return The screen orientation the screenshot was taken in.
         */
         */
+3 −1
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@ import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Bitmap.Config;
import android.graphics.GraphicBuffer;
import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.graphics.Rect;
import android.hardware.HardwareBuffer;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler;
import android.os.IRemoteCallback;
import android.os.IRemoteCallback;
@@ -916,7 +917,8 @@ public class ActivityOptions {
                // Unpackage the GraphicBuffer from the parceled thumbnail
                // Unpackage the GraphicBuffer from the parceled thumbnail
                final GraphicBuffer buffer = opts.getParcelable(KEY_ANIM_THUMBNAIL);
                final GraphicBuffer buffer = opts.getParcelable(KEY_ANIM_THUMBNAIL);
                if (buffer != null) {
                if (buffer != null) {
                    mThumbnail = Bitmap.createHardwareBitmap(buffer);
                    mThumbnail = Bitmap.wrapHardwareBuffer(
                            HardwareBuffer.createFromGraphicBuffer(buffer), null);
                }
                }
                mStartX = opts.getInt(KEY_ANIM_START_X, 0);
                mStartX = opts.getInt(KEY_ANIM_START_X, 0);
                mStartY = opts.getInt(KEY_ANIM_START_Y, 0);
                mStartY = opts.getInt(KEY_ANIM_START_Y, 0);
+3 −1
Original line number Original line Diff line number Diff line
@@ -23,6 +23,7 @@ import android.graphics.Matrix;
import android.graphics.RectF;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable;
import android.hardware.HardwareBuffer;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Parcelable;
import android.os.Parcelable;
import android.transition.TransitionUtils;
import android.transition.TransitionUtils;
@@ -234,7 +235,8 @@ public abstract class SharedElementCallback {
                return null;
                return null;
            }
            }
            if (bitmap == null) {
            if (bitmap == null) {
                bitmap = Bitmap.createHardwareBitmap(buffer);
                bitmap = Bitmap.wrapHardwareBuffer(HardwareBuffer.createFromGraphicBuffer(buffer),
                                                   null);
            }
            }
            ImageView imageView = new ImageView(context);
            ImageView imageView = new ImageView(context);
            view = imageView;
            view = imageView;
+15 −0
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.IntDef;
import android.annotation.LongDef;
import android.annotation.LongDef;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.UnsupportedAppUsage;
import android.annotation.UnsupportedAppUsage;
import android.graphics.GraphicBuffer;
import android.os.Build;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;
@@ -213,6 +214,19 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
        return nIsSupported(width, height, format, layers, usage);
        return nIsSupported(width, height, format, layers, usage);
    }
    }


    /**
     * @hide
     * Returns a <code>HardwareBuffer</code> instance from <code>GraphicBuffer</code>
     *
     * @param graphicBuffer A GraphicBuffer to be wrapped as HardwareBuffer
     * @return A <code>HardwareBuffer</code> instance.
     */
    @NonNull
    public static HardwareBuffer createFromGraphicBuffer(@NonNull GraphicBuffer graphicBuffer) {
        long nativeObject = nCreateFromGraphicBuffer(graphicBuffer);
        return new HardwareBuffer(nativeObject);
    }

    /**
    /**
     * Private use only. See {@link #create(int, int, int, int, long)}. May also be
     * Private use only. See {@link #create(int, int, int, int, long)}. May also be
     * called from JNI using an already allocated native <code>HardwareBuffer</code>.
     * called from JNI using an already allocated native <code>HardwareBuffer</code>.
@@ -405,6 +419,7 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {


    private static native long nCreateHardwareBuffer(int width, int height, int format, int layers,
    private static native long nCreateHardwareBuffer(int width, int height, int format, int layers,
            long usage);
            long usage);
    private static native long nCreateFromGraphicBuffer(GraphicBuffer graphicBuffer);
    private static native long nGetNativeFinalizer();
    private static native long nGetNativeFinalizer();
    private static native void nWriteHardwareBufferToParcel(long nativeObject, Parcel dest);
    private static native void nWriteHardwareBufferToParcel(long nativeObject, Parcel dest);
    private static native long nReadHardwareBufferFromParcel(Parcel in);
    private static native long nReadHardwareBufferFromParcel(Parcel in);
Loading