Merge "Determine the dataspace of the screenshot buffer based on display color mode." into qt-dev
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user