From cf70d71781a40d197c3ecde89351976b27eb9a8a Mon Sep 17 00:00:00 2001 From: Dan Stoza Date: Tue, 9 Jun 2015 16:47:33 -0700 Subject: screencap: Rotate images when display is rotated Changes screencap to read the display rotation and use it when capturing the screenshot so that the output image is oriented correctly. Bug: 8433742 Change-Id: I0f7db422399985a1ff17da3faa946ff0943e58f7 --- cmds/screencap/screencap.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'cmds/screencap') diff --git a/cmds/screencap/screencap.cpp b/cmds/screencap/screencap.cpp index dbc35af..c469ae4 100644 --- a/cmds/screencap/screencap.cpp +++ b/cmds/screencap/screencap.cpp @@ -30,6 +30,7 @@ #include #include +#include #include // TODO: Fix Skia. @@ -159,9 +160,35 @@ int main(int argc, char** argv) uint32_t w, s, h, f; size_t size = 0; + // Maps orientations from DisplayInfo to ISurfaceComposer + static const uint32_t ORIENTATION_MAP[] = { + ISurfaceComposer::eRotateNone, // 0 == DISPLAY_ORIENTATION_0 + ISurfaceComposer::eRotate270, // 1 == DISPLAY_ORIENTATION_90 + ISurfaceComposer::eRotate180, // 2 == DISPLAY_ORIENTATION_180 + ISurfaceComposer::eRotate90, // 3 == DISPLAY_ORIENTATION_270 + }; + ScreenshotClient screenshot; sp display = SurfaceComposerClient::getBuiltInDisplay(displayId); - if (display != NULL && screenshot.update(display, Rect(), false) == NO_ERROR) { + if (display == NULL) { + fprintf(stderr, "Unable to get handle for display %d\n", displayId); + return 1; + } + + Vector configs; + SurfaceComposerClient::getDisplayConfigs(display, &configs); + int activeConfig = SurfaceComposerClient::getActiveConfig(display); + if (static_cast(activeConfig) >= configs.size()) { + fprintf(stderr, "Active config %d not inside configs (size %zu)\n", + activeConfig, configs.size()); + return 1; + } + uint8_t displayOrientation = configs[activeConfig].orientation; + uint32_t captureOrientation = ORIENTATION_MAP[displayOrientation]; + + status_t result = screenshot.update(display, Rect(), 0, 0, 0, -1U, + false, captureOrientation); + if (result == NO_ERROR) { base = screenshot.getPixels(); w = screenshot.getWidth(); h = screenshot.getHeight(); -- cgit v1.1