Merge "Propagate HDR information to screenshot animation." into tm-dev am: 866f67dc94

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17992944

Change-Id: I44edaa03cbdda374a9ca5c8d29d39bd8ae4161e2
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Leon Scroggins
2022-04-29 16:57:59 +00:00
committed by Automerger Merge Worker
4 changed files with 26 additions and 10 deletions

View File

@@ -785,12 +785,14 @@ public final class SurfaceControl implements Parcelable {
private final HardwareBuffer mHardwareBuffer; private final HardwareBuffer mHardwareBuffer;
private final ColorSpace mColorSpace; private final ColorSpace mColorSpace;
private final boolean mContainsSecureLayers; private final boolean mContainsSecureLayers;
private final boolean mContainsHdrLayers;
public ScreenshotHardwareBuffer(HardwareBuffer hardwareBuffer, ColorSpace colorSpace, public ScreenshotHardwareBuffer(HardwareBuffer hardwareBuffer, ColorSpace colorSpace,
boolean containsSecureLayers) { boolean containsSecureLayers, boolean containsHdrLayers) {
mHardwareBuffer = hardwareBuffer; mHardwareBuffer = hardwareBuffer;
mColorSpace = colorSpace; mColorSpace = colorSpace;
mContainsSecureLayers = containsSecureLayers; mContainsSecureLayers = containsSecureLayers;
mContainsHdrLayers = containsHdrLayers;
} }
/** /**
@@ -798,13 +800,15 @@ public final class SurfaceControl implements Parcelable {
* @param hardwareBuffer The existing HardwareBuffer object * @param hardwareBuffer The existing HardwareBuffer object
* @param namedColorSpace Integer value of a named color space {@link ColorSpace.Named} * @param namedColorSpace Integer value of a named color space {@link ColorSpace.Named}
* @param containsSecureLayers Indicates whether this graphic buffer contains captured * @param containsSecureLayers Indicates whether this graphic buffer contains captured
* contents * contents of secure layers, in which case the screenshot
* of secure layers, in which case the screenshot should not be persisted. * should not be persisted.
* @param containsHdrLayers Indicates whether this graphic buffer contains HDR content.
*/ */
private static ScreenshotHardwareBuffer createFromNative(HardwareBuffer hardwareBuffer, private static ScreenshotHardwareBuffer createFromNative(HardwareBuffer hardwareBuffer,
int namedColorSpace, boolean containsSecureLayers) { int namedColorSpace, boolean containsSecureLayers, boolean containsHdrLayers) {
ColorSpace colorSpace = ColorSpace.get(ColorSpace.Named.values()[namedColorSpace]); ColorSpace colorSpace = ColorSpace.get(ColorSpace.Named.values()[namedColorSpace]);
return new ScreenshotHardwareBuffer(hardwareBuffer, colorSpace, containsSecureLayers); return new ScreenshotHardwareBuffer(
hardwareBuffer, colorSpace, containsSecureLayers, containsHdrLayers);
} }
public ColorSpace getColorSpace() { public ColorSpace getColorSpace() {
@@ -818,6 +822,14 @@ public final class SurfaceControl implements Parcelable {
public boolean containsSecureLayers() { public boolean containsSecureLayers() {
return mContainsSecureLayers; return mContainsSecureLayers;
} }
/**
* Returns whether the screenshot contains at least one HDR layer.
* This information may be useful for informing the display whether this screenshot
* is allowed to be dimmed to SDR white.
*/
public boolean containsHdrLayers() {
return mContainsHdrLayers;
}
/** /**
* Copy content of ScreenshotHardwareBuffer into a hardware bitmap and return it. * Copy content of ScreenshotHardwareBuffer into a hardware bitmap and return it.

View File

@@ -322,7 +322,8 @@ public:
env->CallStaticObjectMethod(gScreenshotHardwareBufferClassInfo.clazz, env->CallStaticObjectMethod(gScreenshotHardwareBufferClassInfo.clazz,
gScreenshotHardwareBufferClassInfo.builder, gScreenshotHardwareBufferClassInfo.builder,
jhardwareBuffer, namedColorSpace, jhardwareBuffer, namedColorSpace,
captureResults.capturedSecureLayers); captureResults.capturedSecureLayers,
captureResults.capturedHdrLayers);
env->CallVoidMethod(screenCaptureListenerObject, env->CallVoidMethod(screenCaptureListenerObject,
gScreenCaptureListenerClassInfo.onScreenCaptureComplete, gScreenCaptureListenerClassInfo.onScreenCaptureComplete,
screenshotHardwareBuffer); screenshotHardwareBuffer);
@@ -2399,7 +2400,7 @@ int register_android_view_SurfaceControl(JNIEnv* env)
MakeGlobalRefOrDie(env, screenshotGraphicsBufferClazz); MakeGlobalRefOrDie(env, screenshotGraphicsBufferClazz);
gScreenshotHardwareBufferClassInfo.builder = gScreenshotHardwareBufferClassInfo.builder =
GetStaticMethodIDOrDie(env, screenshotGraphicsBufferClazz, "createFromNative", GetStaticMethodIDOrDie(env, screenshotGraphicsBufferClazz, "createFromNative",
"(Landroid/hardware/HardwareBuffer;IZ)Landroid/view/" "(Landroid/hardware/HardwareBuffer;IZZ)Landroid/view/"
"SurfaceControl$ScreenshotHardwareBuffer;"); "SurfaceControl$ScreenshotHardwareBuffer;");
jclass displayedContentSampleClazz = FindClassOrDie(env, jclass displayedContentSampleClazz = FindClassOrDie(env,

View File

@@ -454,8 +454,11 @@ public class BubbleExpandedView extends LinearLayout {
p.beginRecording(mOverflowView.getWidth(), mOverflowView.getHeight())); p.beginRecording(mOverflowView.getWidth(), mOverflowView.getHeight()));
p.endRecording(); p.endRecording();
Bitmap snapshot = Bitmap.createBitmap(p); Bitmap snapshot = Bitmap.createBitmap(p);
return new SurfaceControl.ScreenshotHardwareBuffer(snapshot.getHardwareBuffer(), return new SurfaceControl.ScreenshotHardwareBuffer(
snapshot.getColorSpace(), false /* containsSecureLayers */); snapshot.getHardwareBuffer(),
snapshot.getColorSpace(),
false /* containsSecureLayers */,
false /* containsHdrLayers */);
} }
if (mTaskView == null || mTaskView.getSurfaceControl() == null) { if (mTaskView == null || mTaskView.getSurfaceControl() == null) {
return null; return null;

View File

@@ -219,7 +219,7 @@ class ScreenRotationAnimation {
// If hdr layers are on-screen, e.g. picture-in-picture mode, the screenshot of // If hdr layers are on-screen, e.g. picture-in-picture mode, the screenshot of
// rotation animation is an sdr image containing tone-mapping hdr content, then // rotation animation is an sdr image containing tone-mapping hdr content, then
// disable dimming effect to get avoid of hdr content being dimmed during animation. // disable dimming effect to get avoid of hdr content being dimmed during animation.
t.setDimmingEnabled(mScreenshotLayer, false); t.setDimmingEnabled(mScreenshotLayer, !screenshotBuffer.containsHdrLayers());
t.setLayer(mBackColorSurface, -1); t.setLayer(mBackColorSurface, -1);
t.setColor(mBackColorSurface, new float[]{mStartLuma, mStartLuma, mStartLuma}); t.setColor(mBackColorSurface, new float[]{mStartLuma, mStartLuma, mStartLuma});
t.setAlpha(mBackColorSurface, 1); t.setAlpha(mBackColorSurface, 1);