Merge "Replace createHardwareBitmap with wrapHardwareBuffer."

This commit is contained in:
Peiyong Lin
2019-01-31 15:37:56 +00:00
committed by Android (Google) Code Review
14 changed files with 88 additions and 38 deletions

View File

@@ -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;

View File

@@ -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.
*/

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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));
}

View File

@@ -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));
}
/**

View File

@@ -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;",

View File

@@ -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",

View File

@@ -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());
}
}

View File

@@ -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);

View File

@@ -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();

View File

@@ -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;

View File

@@ -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() {