Merge "Replace createHardwareBitmap with wrapHardwareBuffer."
This commit is contained in:
@@ -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;[IIIIILandroid/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;->eraseColor(I)V
|
||||
HSPLandroid/graphics/Bitmap;->extractAlpha(Landroid/graphics/Paint;[I)Landroid/graphics/Bitmap;
|
||||
|
||||
@@ -42,6 +42,7 @@ import android.content.res.Resources;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.ColorSpace;
|
||||
import android.graphics.GraphicBuffer;
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.Point;
|
||||
@@ -1777,6 +1778,10 @@ public class ActivityManager {
|
||||
private final int mSystemUiVisibility;
|
||||
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,
|
||||
int orientation, Rect contentInsets, boolean reducedResolution, float scale,
|
||||
boolean isRealSnapshot, int windowingMode, int systemUiVisibility,
|
||||
@@ -1821,6 +1826,13 @@ public class ActivityManager {
|
||||
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.
|
||||
*/
|
||||
|
||||
@@ -33,6 +33,7 @@ import android.graphics.Bitmap;
|
||||
import android.graphics.Bitmap.Config;
|
||||
import android.graphics.GraphicBuffer;
|
||||
import android.graphics.Rect;
|
||||
import android.hardware.HardwareBuffer;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.IRemoteCallback;
|
||||
@@ -916,7 +917,8 @@ public class ActivityOptions {
|
||||
// Unpackage the GraphicBuffer from the parceled thumbnail
|
||||
final GraphicBuffer buffer = opts.getParcelable(KEY_ANIM_THUMBNAIL);
|
||||
if (buffer != null) {
|
||||
mThumbnail = Bitmap.createHardwareBitmap(buffer);
|
||||
mThumbnail = Bitmap.wrapHardwareBuffer(
|
||||
HardwareBuffer.createFromGraphicBuffer(buffer), null);
|
||||
}
|
||||
mStartX = opts.getInt(KEY_ANIM_START_X, 0);
|
||||
mStartY = opts.getInt(KEY_ANIM_START_Y, 0);
|
||||
|
||||
@@ -23,6 +23,7 @@ import android.graphics.Matrix;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.hardware.HardwareBuffer;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcelable;
|
||||
import android.transition.TransitionUtils;
|
||||
@@ -234,7 +235,8 @@ public abstract class SharedElementCallback {
|
||||
return null;
|
||||
}
|
||||
if (bitmap == null) {
|
||||
bitmap = Bitmap.createHardwareBitmap(buffer);
|
||||
bitmap = Bitmap.wrapHardwareBuffer(HardwareBuffer.createFromGraphicBuffer(buffer),
|
||||
null);
|
||||
}
|
||||
ImageView imageView = new ImageView(context);
|
||||
view = imageView;
|
||||
|
||||
@@ -20,6 +20,7 @@ import android.annotation.IntDef;
|
||||
import android.annotation.LongDef;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.UnsupportedAppUsage;
|
||||
import android.graphics.GraphicBuffer;
|
||||
import android.os.Build;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
@@ -213,6 +214,19 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
|
||||
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
|
||||
* 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,
|
||||
long usage);
|
||||
private static native long nCreateFromGraphicBuffer(GraphicBuffer graphicBuffer);
|
||||
private static native long nGetNativeFinalizer();
|
||||
private static native void nWriteHardwareBufferToParcel(long nativeObject, Parcel dest);
|
||||
private static native long nReadHardwareBufferFromParcel(Parcel in);
|
||||
|
||||
@@ -31,6 +31,7 @@ import android.app.contentsuggestions.SelectionsRequest;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.GraphicBuffer;
|
||||
import android.hardware.HardwareBuffer;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
@@ -62,7 +63,8 @@ public abstract class ContentSuggestionsService extends Service {
|
||||
mHandler.sendMessage(
|
||||
obtainMessage(ContentSuggestionsService::processContextImage,
|
||||
ContentSuggestionsService.this, taskId,
|
||||
Bitmap.createHardwareBitmap(contextImage),
|
||||
Bitmap.wrapHardwareBuffer(
|
||||
HardwareBuffer.createFromGraphicBuffer(contextImage), null),
|
||||
imageContextRequestExtras));
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ import android.graphics.PixelFormat;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.Region;
|
||||
import android.hardware.HardwareBuffer;
|
||||
import android.hardware.display.DisplayedContentSample;
|
||||
import android.hardware.display.DisplayedContentSamplingAttributes;
|
||||
import android.os.IBinder;
|
||||
@@ -1738,7 +1739,10 @@ public final class SurfaceControl implements Parcelable {
|
||||
Log.w(TAG, "Failed to take screenshot");
|
||||
return null;
|
||||
}
|
||||
return Bitmap.createHardwareBitmap(buffer);
|
||||
// TODO(b/116112787) Now that hardware bitmap creation can take color space, we
|
||||
// should continue to fix screenshot.
|
||||
return Bitmap.wrapHardwareBuffer(HardwareBuffer.createFromGraphicBuffer(buffer),
|
||||
ColorSpace.get(ColorSpace.Named.SRGB));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1149,19 +1149,6 @@ static jobject Bitmap_copyPreserveInternalConfig(JNIEnv* env, jobject, jlong bit
|
||||
return createBitmap(env, bitmap.release(), getPremulBitmapCreateFlags(false));
|
||||
}
|
||||
|
||||
static jobject Bitmap_createHardwareBitmap(JNIEnv* env, jobject, jobject graphicBuffer) {
|
||||
sp<GraphicBuffer> buffer(graphicBufferForJavaObject(env, graphicBuffer));
|
||||
// To support any color space, we need to pass an additional ColorSpace argument to
|
||||
// java Bitmap.createHardwareBitmap.
|
||||
SkColorType ct = uirenderer::PixelFormatToColorType(buffer->getPixelFormat());
|
||||
sk_sp<Bitmap> bitmap = Bitmap::createFrom(buffer, ct, SkColorSpace::MakeSRGB());
|
||||
if (!bitmap.get()) {
|
||||
ALOGW("failed to create hardware bitmap from graphic buffer");
|
||||
return NULL;
|
||||
}
|
||||
return bitmap::createBitmap(env, bitmap.release(), getPremulBitmapCreateFlags(false));
|
||||
}
|
||||
|
||||
static jobject Bitmap_wrapHardwareBufferBitmap(JNIEnv* env, jobject, jobject hardwareBuffer,
|
||||
jlong colorSpacePtr) {
|
||||
AHardwareBuffer* hwBuf = android_hardware_HardwareBuffer_getNativeHardwareBuffer(env,
|
||||
@@ -1257,8 +1244,6 @@ static const JNINativeMethod gBitmapMethods[] = {
|
||||
{ "nativeGetAllocationByteCount", "(J)I", (void*)Bitmap_getAllocationByteCount },
|
||||
{ "nativeCopyPreserveInternalConfig", "(J)Landroid/graphics/Bitmap;",
|
||||
(void*)Bitmap_copyPreserveInternalConfig },
|
||||
{ "nativeCreateHardwareBitmap", "(Landroid/graphics/GraphicBuffer;)Landroid/graphics/Bitmap;",
|
||||
(void*) Bitmap_createHardwareBitmap },
|
||||
{ "nativeWrapHardwareBufferBitmap", "(Landroid/hardware/HardwareBuffer;J)Landroid/graphics/Bitmap;",
|
||||
(void*) Bitmap_wrapHardwareBufferBitmap },
|
||||
{ "nativeCreateGraphicBufferHandle", "(J)Landroid/graphics/GraphicBuffer;",
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include "android_os_Parcel.h"
|
||||
#include "android/graphics/GraphicsJNI.h"
|
||||
#include "android/graphics/GraphicBuffer.h"
|
||||
|
||||
#include <android/hardware_buffer.h>
|
||||
#include <android_runtime/android_hardware_HardwareBuffer.h>
|
||||
@@ -96,6 +97,12 @@ static jlong android_hardware_HardwareBuffer_create(JNIEnv* env, jobject clazz,
|
||||
return reinterpret_cast<jlong>(wrapper);
|
||||
}
|
||||
|
||||
static jlong android_hardware_HardwareBuffer_createFromGraphicBuffer(JNIEnv* env, jobject clazz, jobject graphicBuffer) {
|
||||
sp<GraphicBuffer> buffer(graphicBufferForJavaObject(env, graphicBuffer));
|
||||
GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(buffer);
|
||||
return reinterpret_cast<jlong>(wrapper);
|
||||
}
|
||||
|
||||
static void destroyWrapper(GraphicBufferWrapper* wrapper) {
|
||||
delete wrapper;
|
||||
}
|
||||
@@ -243,6 +250,8 @@ const char* const kClassPathName = "android/hardware/HardwareBuffer";
|
||||
static const JNINativeMethod gMethods[] = {
|
||||
{ "nCreateHardwareBuffer", "(IIIIJ)J",
|
||||
(void*) android_hardware_HardwareBuffer_create },
|
||||
{ "nCreateFromGraphicBuffer", "(Landroid/graphics/GraphicBuffer;)J",
|
||||
(void*) android_hardware_HardwareBuffer_createFromGraphicBuffer },
|
||||
{ "nGetNativeFinalizer", "()J",
|
||||
(void*) android_hardware_HardwareBuffer_getNativeFinalizer },
|
||||
{ "nWriteHardwareBufferToParcel", "(JLandroid/os/Parcel;)V",
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package android.graphics;
|
||||
|
||||
import android.hardware.HardwareBuffer;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
@@ -233,14 +235,31 @@ public class BitmapTest extends TestCase {
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
public void testCreateHardwareBitmapFromGraphicBuffer() {
|
||||
public void testWrapHardwareBufferWithSrgbColorSpace() {
|
||||
GraphicBuffer buffer = GraphicBuffer.create(10, 10, PixelFormat.RGBA_8888,
|
||||
GraphicBuffer.USAGE_HW_TEXTURE | GraphicBuffer.USAGE_SOFTWARE_MASK);
|
||||
Canvas canvas = buffer.lockCanvas();
|
||||
canvas.drawColor(Color.YELLOW);
|
||||
buffer.unlockCanvasAndPost(canvas);
|
||||
Bitmap hardwareBitmap = Bitmap.createHardwareBitmap(buffer);
|
||||
Bitmap hardwareBitmap =
|
||||
Bitmap.wrapHardwareBuffer(HardwareBuffer.createFromGraphicBuffer(buffer), null);
|
||||
assertTrue(hardwareBitmap.isPremultiplied());
|
||||
assertFalse(hardwareBitmap.isMutable());
|
||||
assertEquals(ColorSpace.get(ColorSpace.Named.SRGB), hardwareBitmap.getColorSpace());
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
public void testWrapHardwareBufferWithDisplayP3ColorSpace() {
|
||||
GraphicBuffer buffer = GraphicBuffer.create(10, 10, PixelFormat.RGBA_8888,
|
||||
GraphicBuffer.USAGE_HW_TEXTURE | GraphicBuffer.USAGE_SOFTWARE_MASK);
|
||||
Canvas canvas = buffer.lockCanvas();
|
||||
canvas.drawColor(Color.YELLOW);
|
||||
buffer.unlockCanvasAndPost(canvas);
|
||||
Bitmap hardwareBitmap = Bitmap.wrapHardwareBuffer(
|
||||
HardwareBuffer.createFromGraphicBuffer(buffer),
|
||||
ColorSpace.get(ColorSpace.Named.DISPLAY_P3));
|
||||
assertTrue(hardwareBitmap.isPremultiplied());
|
||||
assertFalse(hardwareBitmap.isMutable());
|
||||
assertEquals(ColorSpace.get(ColorSpace.Named.DISPLAY_P3), hardwareBitmap.getColorSpace());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -711,18 +711,6 @@ public final class Bitmap implements Parcelable {
|
||||
return b;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create hardware bitmap backed GraphicBuffer.
|
||||
*
|
||||
* @return Bitmap or null if this GraphicBuffer has unsupported PixelFormat.
|
||||
* currently PIXEL_FORMAT_RGBA_8888 is the only supported format
|
||||
* @hide
|
||||
*/
|
||||
@UnsupportedAppUsage
|
||||
public static Bitmap createHardwareBitmap(@NonNull GraphicBuffer graphicBuffer) {
|
||||
return nativeCreateHardwareBitmap(graphicBuffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a hardware bitmap backed by a {@link HardwareBuffer}.
|
||||
*
|
||||
@@ -2249,7 +2237,6 @@ public final class Bitmap implements Parcelable {
|
||||
private static native void nativePrepareToDraw(long nativeBitmap);
|
||||
private static native int nativeGetAllocationByteCount(long nativeBitmap);
|
||||
private static native Bitmap nativeCopyPreserveInternalConfig(long nativeBitmap);
|
||||
private static native Bitmap nativeCreateHardwareBitmap(GraphicBuffer buffer);
|
||||
private static native Bitmap nativeWrapHardwareBufferBitmap(HardwareBuffer buffer,
|
||||
long nativeColorSpace);
|
||||
private static native GraphicBuffer nativeCreateGraphicBufferHandle(long nativeBitmap);
|
||||
|
||||
@@ -17,11 +17,13 @@
|
||||
package com.android.systemui.shared.recents.model;
|
||||
|
||||
import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
|
||||
|
||||
import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_UNDEFINED;
|
||||
|
||||
import android.app.ActivityManager.TaskSnapshot;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Rect;
|
||||
import android.hardware.HardwareBuffer;
|
||||
|
||||
/**
|
||||
* Data for a single thumbnail.
|
||||
@@ -51,7 +53,9 @@ public class ThumbnailData {
|
||||
}
|
||||
|
||||
public ThumbnailData(TaskSnapshot snapshot) {
|
||||
thumbnail = Bitmap.createHardwareBitmap(snapshot.getSnapshot());
|
||||
thumbnail = Bitmap.wrapHardwareBuffer(
|
||||
HardwareBuffer.createFromGraphicBuffer(snapshot.getSnapshot()),
|
||||
snapshot.getColorSpace());
|
||||
insets = new Rect(snapshot.getContentInsets());
|
||||
orientation = snapshot.getOrientation();
|
||||
reducedResolution = snapshot.isReducedResolution();
|
||||
|
||||
@@ -26,6 +26,7 @@ import android.app.ActivityManager;
|
||||
import android.app.ActivityManager.TaskSnapshot;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Bitmap.Config;
|
||||
import android.hardware.HardwareBuffer;
|
||||
import android.os.Process;
|
||||
import android.os.SystemClock;
|
||||
import android.util.ArraySet;
|
||||
@@ -359,7 +360,11 @@ class TaskSnapshotPersister {
|
||||
}
|
||||
|
||||
boolean writeBuffer() {
|
||||
final Bitmap bitmap = Bitmap.createHardwareBitmap(mSnapshot.getSnapshot());
|
||||
// TODO(b/116112787) TaskSnapshot needs bookkeep the ColorSpace of the
|
||||
// hardware bitmap when created.
|
||||
final Bitmap bitmap = Bitmap.wrapHardwareBuffer(
|
||||
HardwareBuffer.createFromGraphicBuffer(mSnapshot.getSnapshot()),
|
||||
mSnapshot.getColorSpace());
|
||||
if (bitmap == null) {
|
||||
Slog.e(TAG, "Invalid task snapshot hw bitmap");
|
||||
return false;
|
||||
|
||||
@@ -34,8 +34,10 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
|
||||
import static com.android.server.wm.WindowManagerService.H.WALLPAPER_DRAW_PENDING_TIMEOUT;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.ColorSpace;
|
||||
import android.graphics.GraphicBuffer;
|
||||
import android.graphics.Rect;
|
||||
import android.hardware.HardwareBuffer;
|
||||
import android.os.Bundle;
|
||||
import android.os.Debug;
|
||||
import android.os.IBinder;
|
||||
@@ -729,7 +731,10 @@ class WallpaperController {
|
||||
Slog.w(TAG_WM, "Failed to screenshot wallpaper");
|
||||
return null;
|
||||
}
|
||||
return Bitmap.createHardwareBitmap(wallpaperBuffer);
|
||||
// TODO(b/116112787) Now that hardware bitmap creation can take color space, we
|
||||
// should continue to fix screenshot.
|
||||
return Bitmap.wrapHardwareBuffer(HardwareBuffer.createFromGraphicBuffer(wallpaperBuffer),
|
||||
ColorSpace.get(ColorSpace.Named.SRGB));
|
||||
}
|
||||
|
||||
private WindowState getTopVisibleWallpaper() {
|
||||
|
||||
Reference in New Issue
Block a user