Merge "Allow disabling layer rotation during screenshots"

This commit is contained in:
Dan Stoza
2014-02-20 00:56:33 +00:00
committed by Android (Google) Code Review
4 changed files with 47 additions and 23 deletions

View File

@@ -141,7 +141,7 @@ int main(int argc, char** argv)
ScreenshotClient screenshot;
sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(displayId);
if (display != NULL && screenshot.update(display) == NO_ERROR) {
if (display != NULL && screenshot.update(display, false) == NO_ERROR) {
base = screenshot.getPixels();
w = screenshot.getWidth();
h = screenshot.getHeight();

View File

@@ -39,9 +39,11 @@ public class SurfaceControl {
private static native void nativeDestroy(long nativeObject);
private static native Bitmap nativeScreenshot(IBinder displayToken,
int width, int height, int minLayer, int maxLayer, boolean allLayers);
int width, int height, int minLayer, int maxLayer, boolean allLayers,
boolean useIdentityTransform);
private static native void nativeScreenshot(IBinder displayToken, Surface consumer,
int width, int height, int minLayer, int maxLayer, boolean allLayers);
int width, int height, int minLayer, int maxLayer, boolean allLayers,
boolean useIdentityTransform);
private static native void nativeOpenTransaction();
private static native void nativeCloseTransaction();
@@ -554,10 +556,15 @@ public class SurfaceControl {
* include in the screenshot.
* @param maxLayer The highest (top-most Z order) surface layer to
* include in the screenshot.
* @param useIdentityTransform Replace whatever transformation (rotation,
* scaling, translation) the surface layers are currently using with the
* identity transformation while taking the screenshot.
*/
public static void screenshot(IBinder display, Surface consumer,
int width, int height, int minLayer, int maxLayer) {
screenshot(display, consumer, width, height, minLayer, maxLayer, false);
int width, int height, int minLayer, int maxLayer,
boolean useIdentityTransform) {
screenshot(display, consumer, width, height, minLayer, maxLayer, false,
useIdentityTransform);
}
/**
@@ -572,7 +579,7 @@ public class SurfaceControl {
*/
public static void screenshot(IBinder display, Surface consumer,
int width, int height) {
screenshot(display, consumer, width, height, 0, 0, true);
screenshot(display, consumer, width, height, 0, 0, true, false);
}
/**
@@ -582,7 +589,7 @@ public class SurfaceControl {
* @param consumer The {@link Surface} to take the screenshot into.
*/
public static void screenshot(IBinder display, Surface consumer) {
screenshot(display, consumer, 0, 0, 0, 0, true);
screenshot(display, consumer, 0, 0, 0, 0, true, false);
}
@@ -602,15 +609,20 @@ public class SurfaceControl {
* include in the screenshot.
* @param maxLayer The highest (top-most Z order) surface layer to
* include in the screenshot.
* @param useIdentityTransform Replace whatever transformation (rotation,
* scaling, translation) the surface layers are currently using with the
* identity transformation while taking the screenshot.
* @return Returns a Bitmap containing the screen contents, or null
* if an error occurs. Make sure to call Bitmap.recycle() as soon as
* possible, once its content is not needed anymore.
*/
public static Bitmap screenshot(int width, int height, int minLayer, int maxLayer) {
public static Bitmap screenshot(int width, int height, int minLayer, int maxLayer,
boolean useIdentityTransform) {
// TODO: should take the display as a parameter
IBinder displayToken = SurfaceControl.getBuiltInDisplay(
SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN);
return nativeScreenshot(displayToken, width, height, minLayer, maxLayer, false);
return nativeScreenshot(displayToken, width, height, minLayer, maxLayer, false,
useIdentityTransform);
}
/**
@@ -629,17 +641,19 @@ public class SurfaceControl {
// TODO: should take the display as a parameter
IBinder displayToken = SurfaceControl.getBuiltInDisplay(
SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN);
return nativeScreenshot(displayToken, width, height, 0, 0, true);
return nativeScreenshot(displayToken, width, height, 0, 0, true, false);
}
private static void screenshot(IBinder display, Surface consumer,
int width, int height, int minLayer, int maxLayer, boolean allLayers) {
int width, int height, int minLayer, int maxLayer, boolean allLayers,
boolean useIdentityTransform) {
if (display == null) {
throw new IllegalArgumentException("displayToken must not be null");
}
if (consumer == null) {
throw new IllegalArgumentException("consumer must not be null");
}
nativeScreenshot(display, consumer, width, height, minLayer, maxLayer, allLayers);
nativeScreenshot(display, consumer, width, height, minLayer, maxLayer, allLayers,
useIdentityTransform);
}
}

View File

@@ -72,12 +72,15 @@ public:
}
status_t update(const sp<IBinder>& display, int width, int height,
int minLayer, int maxLayer, bool allLayers) {
int minLayer, int maxLayer, bool allLayers,
bool useIdentityTransform) {
status_t res = (width > 0 && height > 0)
? (allLayers
? mScreenshot.update(display, width, height)
: mScreenshot.update(display, width, height, minLayer, maxLayer))
: mScreenshot.update(display);
? mScreenshot.update(display, width, height,
useIdentityTransform)
: mScreenshot.update(display, width, height,
minLayer, maxLayer, useIdentityTransform))
: mScreenshot.update(display, useIdentityTransform);
if (res != NO_ERROR) {
return res;
}
@@ -162,7 +165,8 @@ static inline SkBitmap::Config convertPixelFormat(PixelFormat format) {
}
static jobject nativeScreenshotBitmap(JNIEnv* env, jclass clazz, jobject displayTokenObj,
jint width, jint height, jint minLayer, jint maxLayer, bool allLayers) {
jint width, jint height, jint minLayer, jint maxLayer, bool allLayers,
bool useIdentityTransform) {
sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj);
if (displayToken == NULL) {
return NULL;
@@ -170,7 +174,7 @@ static jobject nativeScreenshotBitmap(JNIEnv* env, jclass clazz, jobject display
ScreenshotPixelRef* pixels = new ScreenshotPixelRef(NULL);
if (pixels->update(displayToken, width, height,
minLayer, maxLayer, allLayers) != NO_ERROR) {
minLayer, maxLayer, allLayers, useIdentityTransform) != NO_ERROR) {
delete pixels;
return NULL;
}
@@ -202,7 +206,8 @@ static jobject nativeScreenshotBitmap(JNIEnv* env, jclass clazz, jobject display
static void nativeScreenshot(JNIEnv* env, jclass clazz,
jobject displayTokenObj, jobject surfaceObj,
jint width, jint height, jint minLayer, jint maxLayer, bool allLayers) {
jint width, jint height, jint minLayer, jint maxLayer, bool allLayers,
bool useIdentityTransform) {
sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj);
if (displayToken != NULL) {
sp<Surface> consumer = android_view_Surface_getSurface(env, surfaceObj);
@@ -213,7 +218,8 @@ static void nativeScreenshot(JNIEnv* env, jclass clazz,
}
ScreenshotClient::capture(
displayToken, consumer->getIGraphicBufferProducer(),
width, height, uint32_t(minLayer), uint32_t(maxLayer));
width, height, uint32_t(minLayer), uint32_t(maxLayer),
useIdentityTransform);
}
}
}
@@ -417,9 +423,9 @@ static JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeRelease },
{"nativeDestroy", "(J)V",
(void*)nativeDestroy },
{"nativeScreenshot", "(Landroid/os/IBinder;IIIIZ)Landroid/graphics/Bitmap;",
{"nativeScreenshot", "(Landroid/os/IBinder;IIIIZZ)Landroid/graphics/Bitmap;",
(void*)nativeScreenshotBitmap },
{"nativeScreenshot", "(Landroid/os/IBinder;Landroid/view/Surface;IIIIZ)V",
{"nativeScreenshot", "(Landroid/os/IBinder;Landroid/view/Surface;IIIIZZ)V",
(void*)nativeScreenshot },
{"nativeOpenTransaction", "()V",
(void*)nativeOpenTransaction },

View File

@@ -5762,7 +5762,11 @@ public class WindowManagerService extends IWindowManager.Stub
+ " surfaceLayer=" + win.mWinAnimator.mSurfaceLayer);
}
}
rawss = SurfaceControl.screenshot(dw, dh, minLayer, maxLayer);
// TODO: Replace 'false' in the following line with a variable that indicates
// whether the screenshot should use the identity transformation matrix
// (e.g., enable it when taking a screenshot for recents, since we might be in
// the middle of the rotation animation, but don't want a rotated recent image).
rawss = SurfaceControl.screenshot(dw, dh, minLayer, maxLayer, false);
}
} while (!screenshotReady && retryCount <= MAX_SCREENSHOT_RETRIES);
if (retryCount > MAX_SCREENSHOT_RETRIES) Slog.i(TAG, "Screenshot max retries " +