From 98afaa6e1cc30bda6600d3e48eee98c3aa9a4261 Mon Sep 17 00:00:00 2001 From: chaviw Date: Thu, 28 Jan 2021 18:47:17 -0800 Subject: [PATCH] Added new arguments for screenshot request Added frameScaleX and frameScaleY to replace frameScale to allow callers to specify an X and Y scale separately. Added grayscale flag to allow the caller to take the screenshot in grayscale. Test: Screenshot in grayscale Bug: 155825630 Change-Id: I00521c2fbc1a847586bde9c23beafa343115d4f5 --- core/java/android/view/SurfaceControl.java | 35 ++++++++++++++++++---- core/jni/android_view_SurfaceControl.cpp | 16 +++++++--- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 0a1a231169417..acd25077fb5ad 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -750,18 +750,22 @@ public final class SurfaceControl implements Parcelable { private abstract static class CaptureArgs { private final int mPixelFormat; private final Rect mSourceCrop = new Rect(); - private final float mFrameScale; + private final float mFrameScaleX; + private final float mFrameScaleY; private final boolean mCaptureSecureLayers; private final boolean mAllowProtected; private final long mUid; + private final boolean mGrayscale; private CaptureArgs(Builder> builder) { mPixelFormat = builder.mPixelFormat; mSourceCrop.set(builder.mSourceCrop); - mFrameScale = builder.mFrameScale; + mFrameScaleX = builder.mFrameScaleX; + mFrameScaleY = builder.mFrameScaleY; mCaptureSecureLayers = builder.mCaptureSecureLayers; mAllowProtected = builder.mAllowProtected; mUid = builder.mUid; + mGrayscale = builder.mGrayscale; } /** @@ -772,10 +776,12 @@ public final class SurfaceControl implements Parcelable { abstract static class Builder> { private int mPixelFormat = PixelFormat.RGBA_8888; private final Rect mSourceCrop = new Rect(); - private float mFrameScale = 1; + private float mFrameScaleX = 1; + private float mFrameScaleY = 1; private boolean mCaptureSecureLayers; private boolean mAllowProtected; private long mUid = -1; + private boolean mGrayscale; /** * The desired pixel format of the returned buffer. @@ -798,7 +804,18 @@ public final class SurfaceControl implements Parcelable { * The desired scale of the returned buffer. The raw screen will be scaled up/down. */ public T setFrameScale(float frameScale) { - mFrameScale = frameScale; + mFrameScaleX = frameScale; + mFrameScaleY = frameScale; + return getThis(); + } + + /** + * The desired scale of the returned buffer, allowing separate values for x and y scale. + * The raw screen will be scaled up/down. + */ + public T setFrameScale(float frameScaleX, float frameScaleY) { + mFrameScaleX = frameScaleX; + mFrameScaleY = frameScaleY; return getThis(); } @@ -833,6 +850,14 @@ public final class SurfaceControl implements Parcelable { return getThis(); } + /** + * Set whether the screenshot should use grayscale or not. + */ + public T setGrayscale(boolean grayscale) { + mGrayscale = grayscale; + return getThis(); + } + /** * Each sub class should return itself to allow the builder to chain properly */ @@ -929,7 +954,7 @@ public final class SurfaceControl implements Parcelable { /** * The arguments class used to make layer capture requests. * - * @see #nativeCaptureLayers(LayerCaptureArgs) + * @see #nativeCaptureLayers(LayerCaptureArgs, ScreenCaptureListener) * @hide */ public static class LayerCaptureArgs extends CaptureArgs { diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 4ef63ae930160..cf4ec93c2dfc6 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -110,10 +110,12 @@ static struct { static struct { jfieldID pixelFormat; jfieldID sourceCrop; - jfieldID frameScale; + jfieldID frameScaleX; + jfieldID frameScaleY; jfieldID captureSecureLayers; jfieldID allowProtected; jfieldID uid; + jfieldID grayscale; } gCaptureArgsClassInfo; static struct { @@ -380,13 +382,17 @@ static void getCaptureArgs(JNIEnv* env, jobject captureArgsObject, CaptureArgs& captureArgs.sourceCrop = rectFromObj(env, env->GetObjectField(captureArgsObject, gCaptureArgsClassInfo.sourceCrop)); - captureArgs.frameScale = - env->GetFloatField(captureArgsObject, gCaptureArgsClassInfo.frameScale); + captureArgs.frameScaleX = + env->GetFloatField(captureArgsObject, gCaptureArgsClassInfo.frameScaleX); + captureArgs.frameScaleY = + env->GetFloatField(captureArgsObject, gCaptureArgsClassInfo.frameScaleY); captureArgs.captureSecureLayers = env->GetBooleanField(captureArgsObject, gCaptureArgsClassInfo.captureSecureLayers); captureArgs.allowProtected = env->GetBooleanField(captureArgsObject, gCaptureArgsClassInfo.allowProtected); captureArgs.uid = env->GetLongField(captureArgsObject, gCaptureArgsClassInfo.uid); + captureArgs.grayscale = + env->GetBooleanField(captureArgsObject, gCaptureArgsClassInfo.grayscale); } static DisplayCaptureArgs displayCaptureArgsFromObject(JNIEnv* env, @@ -2032,12 +2038,14 @@ int register_android_view_SurfaceControl(JNIEnv* env) gCaptureArgsClassInfo.pixelFormat = GetFieldIDOrDie(env, captureArgsClazz, "mPixelFormat", "I"); gCaptureArgsClassInfo.sourceCrop = GetFieldIDOrDie(env, captureArgsClazz, "mSourceCrop", "Landroid/graphics/Rect;"); - gCaptureArgsClassInfo.frameScale = GetFieldIDOrDie(env, captureArgsClazz, "mFrameScale", "F"); + gCaptureArgsClassInfo.frameScaleX = GetFieldIDOrDie(env, captureArgsClazz, "mFrameScaleX", "F"); + gCaptureArgsClassInfo.frameScaleY = GetFieldIDOrDie(env, captureArgsClazz, "mFrameScaleY", "F"); gCaptureArgsClassInfo.captureSecureLayers = GetFieldIDOrDie(env, captureArgsClazz, "mCaptureSecureLayers", "Z"); gCaptureArgsClassInfo.allowProtected = GetFieldIDOrDie(env, captureArgsClazz, "mAllowProtected", "Z"); gCaptureArgsClassInfo.uid = GetFieldIDOrDie(env, captureArgsClazz, "mUid", "J"); + gCaptureArgsClassInfo.grayscale = GetFieldIDOrDie(env, captureArgsClazz, "mGrayscale", "Z"); jclass displayCaptureArgsClazz = FindClassOrDie(env, "android/view/SurfaceControl$DisplayCaptureArgs");