Merge "Determine the dataspace of the screenshot buffer based on display color mode." into qt-dev

This commit is contained in:
Peiyong Lin
2019-04-12 16:57:38 +00:00
committed by Android (Google) Code Review
7 changed files with 47 additions and 27 deletions

View File

@@ -1838,17 +1838,17 @@ public class ActivityManager {
private final float mScale;
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);
// Must be one of the named color spaces, otherwise, always use SRGB color space.
private final ColorSpace mColorSpace;
public TaskSnapshot(@NonNull ComponentName topActivityComponent, GraphicBuffer snapshot,
int orientation, Rect contentInsets, boolean reducedResolution, float scale,
boolean isRealSnapshot, int windowingMode, int systemUiVisibility,
boolean isTranslucent) {
@NonNull ColorSpace colorSpace, int orientation, Rect contentInsets,
boolean reducedResolution, float scale, boolean isRealSnapshot, int windowingMode,
int systemUiVisibility, boolean isTranslucent) {
mTopActivityComponent = topActivityComponent;
mSnapshot = snapshot;
mColorSpace = colorSpace.getId() < 0
? ColorSpace.get(ColorSpace.Named.SRGB) : colorSpace;
mOrientation = orientation;
mContentInsets = new Rect(contentInsets);
mReducedResolution = reducedResolution;
@@ -1862,6 +1862,10 @@ public class ActivityManager {
private TaskSnapshot(Parcel source) {
mTopActivityComponent = ComponentName.readFromParcel(source);
mSnapshot = source.readParcelable(null /* classLoader */);
int colorSpaceId = source.readInt();
mColorSpace = colorSpaceId >= 0
? ColorSpace.get(ColorSpace.Named.values()[colorSpaceId])
: ColorSpace.get(ColorSpace.Named.SRGB);
mOrientation = source.readInt();
mContentInsets = source.readParcelable(null /* classLoader */);
mReducedResolution = source.readBoolean();
@@ -1968,6 +1972,7 @@ public class ActivityManager {
public void writeToParcel(Parcel dest, int flags) {
ComponentName.writeToParcel(mTopActivityComponent, dest);
dest.writeParcelable(mSnapshot, 0);
dest.writeInt(mColorSpace.getId());
dest.writeInt(mOrientation);
dest.writeParcelable(mContentInsets, 0);
dest.writeBoolean(mReducedResolution);
@@ -1985,6 +1990,7 @@ public class ActivityManager {
return "TaskSnapshot{"
+ " mTopActivityComponent=" + mTopActivityComponent.flattenToShortString()
+ " mSnapshot=" + mSnapshot + " (" + width + "x" + height + ")"
+ " mColorSpace=" + mColorSpace.toString()
+ " mOrientation=" + mOrientation
+ " mContentInsets=" + mContentInsets.toShortString()
+ " mReducedResolution=" + mReducedResolution + " mScale=" + mScale

View File

@@ -90,8 +90,8 @@ public final class SurfaceControl implements Parcelable {
private static native ScreenshotGraphicBuffer nativeScreenshot(IBinder displayToken,
Rect sourceCrop, int width, int height, boolean useIdentityTransform, int rotation,
boolean captureSecureLayers);
private static native ScreenshotGraphicBuffer nativeCaptureLayers(IBinder layerHandleToken,
Rect sourceCrop, float frameScale, IBinder[] excludeLayers);
private static native ScreenshotGraphicBuffer nativeCaptureLayers(IBinder displayToken,
IBinder layerHandleToken, Rect sourceCrop, float frameScale, IBinder[] excludeLayers);
private static native long nativeCreateTransaction();
private static native long nativeGetNativeTransactionFinalizer();
@@ -1998,7 +1998,8 @@ public final class SurfaceControl implements Parcelable {
*/
public static ScreenshotGraphicBuffer captureLayers(IBinder layerHandleToken, Rect sourceCrop,
float frameScale) {
return nativeCaptureLayers(layerHandleToken, sourceCrop, frameScale, null);
final IBinder displayToken = SurfaceControl.getInternalDisplayToken();
return nativeCaptureLayers(displayToken, layerHandleToken, sourceCrop, frameScale, null);
}
/**
@@ -2007,7 +2008,8 @@ public final class SurfaceControl implements Parcelable {
*/
public static ScreenshotGraphicBuffer captureLayersExcluding(IBinder layerHandleToken,
Rect sourceCrop, float frameScale, IBinder[] exclude) {
return nativeCaptureLayers(layerHandleToken, sourceCrop, frameScale, exclude);
final IBinder displayToken = SurfaceControl.getInternalDisplayToken();
return nativeCaptureLayers(displayToken, layerHandleToken, sourceCrop, frameScale, exclude);
}
/**

View File

@@ -271,8 +271,9 @@ static jobject nativeScreenshot(JNIEnv* env, jclass clazz,
capturedSecureLayers);
}
static jobject nativeCaptureLayers(JNIEnv* env, jclass clazz, jobject layerHandleToken,
jobject sourceCropObj, jfloat frameScale, jobjectArray excludeArray) {
static jobject nativeCaptureLayers(JNIEnv* env, jclass clazz, jobject displayTokenObj,
jobject layerHandleToken, jobject sourceCropObj, jfloat frameScale,
jobjectArray excludeArray) {
sp<IBinder> layerHandle = ibinderForJavaObject(env, layerHandleToken);
if (layerHandle == NULL) {
@@ -301,7 +302,12 @@ static jobject nativeCaptureLayers(JNIEnv* env, jclass clazz, jobject layerHandl
}
sp<GraphicBuffer> buffer;
const ui::Dataspace dataspace = ui::Dataspace::V0_SRGB;
ui::Dataspace dataspace = ui::Dataspace::V0_SRGB;
sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj);
if (displayToken != nullptr) {
const ui::ColorMode colorMode = SurfaceComposerClient::getActiveColorMode(displayToken);
dataspace = pickDataspaceFromColorMode(colorMode);
}
status_t res = ScreenshotClient::captureChildLayers(layerHandle, dataspace,
ui::PixelFormat::RGBA_8888, sourceCrop,
excludeHandles, frameScale, &buffer);
@@ -1373,7 +1379,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
"Landroid/view/SurfaceControl$ScreenshotGraphicBuffer;",
(void*)nativeScreenshot },
{"nativeCaptureLayers",
"(Landroid/os/IBinder;Landroid/graphics/Rect;F[Landroid/os/IBinder;)"
"(Landroid/os/IBinder;Landroid/os/IBinder;Landroid/graphics/Rect;"
"F[Landroid/os/IBinder;)"
"Landroid/view/SurfaceControl$ScreenshotGraphicBuffer;",
(void*)nativeCaptureLayers },
{"nativeSetInputWindowInfo", "(JJLandroid/view/InputWindowHandle;)V",

View File

@@ -292,9 +292,9 @@ class TaskSnapshotController {
}
final boolean isWindowTranslucent = mainWindow.getAttrs().format != PixelFormat.OPAQUE;
return new TaskSnapshot(appWindowToken.mActivityComponent, buffer,
appWindowToken.getConfiguration().orientation, getInsets(mainWindow),
isLowRamDevice /* reduced */, scaleFraction /* scale */, true /* isRealSnapshot */,
task.getWindowingMode(), getSystemUiVisibility(task),
screenshotBuffer.getColorSpace(), appWindowToken.getConfiguration().orientation,
getInsets(mainWindow), isLowRamDevice /* reduced */, scaleFraction /* scale */,
true /* isRealSnapshot */, task.getWindowingMode(), getSystemUiVisibility(task),
!appWindowToken.fillsParent() || isWindowTranslucent);
}
@@ -383,10 +383,10 @@ class TaskSnapshotController {
// Note, the app theme snapshot is never translucent because we enforce a non-translucent
// color above
return new TaskSnapshot(topChild.mActivityComponent, hwBitmap.createGraphicBufferHandle(),
topChild.getConfiguration().orientation, mainWindow.getStableInsets(),
ActivityManager.isLowRamDeviceStatic() /* reduced */, 1.0f /* scale */,
false /* isRealSnapshot */, task.getWindowingMode(), getSystemUiVisibility(task),
false);
hwBitmap.getColorSpace(), topChild.getConfiguration().orientation,
mainWindow.getStableInsets(), ActivityManager.isLowRamDeviceStatic() /* reduced */,
1.0f /* scale */, false /* isRealSnapshot */, task.getWindowingMode(),
getSystemUiVisibility(task), false);
}
/**

View File

@@ -89,7 +89,8 @@ class TaskSnapshotLoader {
}
ComponentName topActivityComponent = ComponentName.unflattenFromString(
proto.topActivityComponent);
return new TaskSnapshot(topActivityComponent, buffer, proto.orientation,
return new TaskSnapshot(topActivityComponent, buffer, bitmap.getColorSpace(),
proto.orientation,
new Rect(proto.insetLeft, proto.insetTop, proto.insetRight, proto.insetBottom),
reducedResolution, reducedResolution ? mPersister.getReducedScale() : 1f,
proto.isRealSnapshot, proto.windowingMode, proto.systemUiVisibility,

View File

@@ -27,6 +27,7 @@ import android.app.ActivityManager.TaskSnapshot;
import android.content.ComponentName;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorSpace;
import android.graphics.GraphicBuffer;
import android.graphics.PixelFormat;
import android.graphics.Rect;
@@ -127,8 +128,9 @@ class TaskSnapshotPersisterTestBase extends WindowTestsBase {
Canvas c = buffer.lockCanvas();
c.drawColor(Color.RED);
buffer.unlockCanvasAndPost(c);
return new TaskSnapshot(new ComponentName("", ""), buffer, ORIENTATION_PORTRAIT,
TEST_INSETS, mScale < 1f /* reducedResolution */, mScale, mIsRealSnapshot,
return new TaskSnapshot(new ComponentName("", ""), buffer,
ColorSpace.get(ColorSpace.Named.SRGB), ORIENTATION_PORTRAIT, TEST_INSETS,
mScale < 1f /* reducedResolution */, mScale, mIsRealSnapshot,
mWindowingMode, mSystemUiVisibility, mIsTranslucent);
}
}

View File

@@ -35,6 +35,7 @@ import android.app.ActivityManager.TaskSnapshot;
import android.content.ComponentName;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorSpace;
import android.graphics.GraphicBuffer;
import android.graphics.PixelFormat;
import android.graphics.Rect;
@@ -64,8 +65,9 @@ public class TaskSnapshotSurfaceTest extends WindowTestsBase {
final GraphicBuffer buffer = GraphicBuffer.create(width, height, PixelFormat.RGBA_8888,
GraphicBuffer.USAGE_SW_READ_RARELY | GraphicBuffer.USAGE_SW_WRITE_NEVER);
final TaskSnapshot snapshot = new TaskSnapshot(new ComponentName("", ""), buffer,
ORIENTATION_PORTRAIT, contentInsets, false, 1.0f, true /* isRealSnapshot */,
WINDOWING_MODE_FULLSCREEN, 0 /* systemUiVisibility */, false /* isTranslucent */);
ColorSpace.get(ColorSpace.Named.SRGB), ORIENTATION_PORTRAIT, contentInsets, false,
1.0f, true /* isRealSnapshot */, WINDOWING_MODE_FULLSCREEN,
0 /* systemUiVisibility */, false /* isTranslucent */);
mSurface = new TaskSnapshotSurface(mWm, new Window(), new SurfaceControl(), snapshot, "Test",
createTaskDescription(Color.WHITE, Color.RED, Color.BLUE), sysuiVis, windowFlags, 0,
taskBounds, ORIENTATION_PORTRAIT);