Loading cmds/screencap/screencap.cpp +34 −13 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <gui/ISurfaceComposer.h> #include <ui/DisplayInfo.h> #include <ui/GraphicTypes.h> #include <ui/PixelFormat.h> #include <system/graphics.h> Loading Loading @@ -74,12 +75,12 @@ static SkColorType flinger2skia(PixelFormat f) } } static sk_sp<SkColorSpace> dataSpaceToColorSpace(android_dataspace d) static sk_sp<SkColorSpace> dataSpaceToColorSpace(ui::Dataspace d) { switch (d) { case HAL_DATASPACE_V0_SRGB: case ui::Dataspace::V0_SRGB: return SkColorSpace::MakeSRGB(); case HAL_DATASPACE_DISPLAY_P3: case ui::Dataspace::DISPLAY_P3: return SkColorSpace::MakeRGB( SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kDCIP3_D65_Gamut); default: Loading @@ -87,12 +88,26 @@ static sk_sp<SkColorSpace> dataSpaceToColorSpace(android_dataspace d) } } static uint32_t dataSpaceToInt(android_dataspace d) static ui::Dataspace pickBestDataspace(ui::ColorMode colorMode) { switch (colorMode) { case ui::ColorMode::SRGB: return ui::Dataspace::V0_SRGB; case ui::ColorMode::DISPLAY_P3: case ui::ColorMode::BT2100_PQ: case ui::ColorMode::BT2100_HLG: return ui::Dataspace::DISPLAY_P3; default: return ui::Dataspace::V0_SRGB; } } static uint32_t dataSpaceToInt(ui::Dataspace d) { switch (d) { case HAL_DATASPACE_V0_SRGB: case ui::Dataspace::V0_SRGB: return COLORSPACE_SRGB; case HAL_DATASPACE_DISPLAY_P3: case ui::Dataspace::DISPLAY_P3: return COLORSPACE_DISPLAY_P3; default: return COLORSPACE_UNKNOWN; Loading Loading @@ -161,7 +176,6 @@ int main(int argc, char** argv) void* base = NULL; uint32_t w, s, h, f; android_dataspace d; size_t size = 0; // Maps orientations from DisplayInfo to ISurfaceComposer Loading Loading @@ -197,8 +211,15 @@ int main(int argc, char** argv) uint32_t captureOrientation = ORIENTATION_MAP[displayOrientation]; sp<GraphicBuffer> outBuffer; status_t result = ScreenshotClient::capture(display, Rect(), 0 /* reqWidth */, 0 /* reqHeight */, false, captureOrientation, &outBuffer); ui::Dataspace reqDataspace = pickBestDataspace(SurfaceComposerClient::getActiveColorMode(display)); // Due to the fact that we hard code the way we write pixels into screenshot, // we hard code RGBA_8888 here. ui::PixelFormat reqPixelFormat = ui::PixelFormat::RGBA_8888; status_t result = ScreenshotClient::capture(display, reqDataspace, reqPixelFormat, Rect(), 0 /* reqWidth */, 0 /* reqHeight */, false, captureOrientation, &outBuffer); if (result != NO_ERROR) { close(fd); return 1; Loading @@ -222,12 +243,12 @@ int main(int argc, char** argv) h = outBuffer->getHeight(); s = outBuffer->getStride(); f = outBuffer->getPixelFormat(); d = HAL_DATASPACE_UNKNOWN; size = s * h * bytesPerPixel(f); if (png) { const SkImageInfo info = SkImageInfo::Make(w, h, flinger2skia(f), kPremul_SkAlphaType, dataSpaceToColorSpace(d)); SkImageInfo::Make(w, h, flinger2skia(f), kPremul_SkAlphaType, dataSpaceToColorSpace(reqDataspace)); SkPixmap pixmap(info, base, s * bytesPerPixel(f)); struct FDWStream final : public SkWStream { size_t fBytesWritten = 0; Loading @@ -244,7 +265,7 @@ int main(int argc, char** argv) notifyMediaScanner(fn); } } else { uint32_t c = dataSpaceToInt(d); uint32_t c = dataSpaceToInt(reqDataspace); write(fd, &w, 4); write(fd, &h, 4); write(fd, &f, 4); Loading core/jni/android_view_SurfaceControl.cpp +7 −3 Original line number Diff line number Diff line Loading @@ -166,7 +166,9 @@ static jobject nativeScreenshot(JNIEnv* env, jclass clazz, } Rect sourceCrop = rectFromObj(env, sourceCropObj); sp<GraphicBuffer> buffer; status_t res = ScreenshotClient::capture(displayToken, sourceCrop, width, height, status_t res = ScreenshotClient::capture(displayToken, ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888, sourceCrop, width, height, useIdentityTransform, rotation, &buffer); if (res != NO_ERROR) { return NULL; Loading Loading @@ -195,7 +197,9 @@ static jobject nativeCaptureLayers(JNIEnv* env, jclass clazz, jobject layerHandl } sp<GraphicBuffer> buffer; status_t res = ScreenshotClient::captureChildLayers(layerHandle, sourceCrop, frameScale, &buffer); status_t res = ScreenshotClient::captureChildLayers(layerHandle, ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888, sourceCrop, frameScale, &buffer); if (res != NO_ERROR) { return NULL; } Loading Loading
cmds/screencap/screencap.cpp +34 −13 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <gui/ISurfaceComposer.h> #include <ui/DisplayInfo.h> #include <ui/GraphicTypes.h> #include <ui/PixelFormat.h> #include <system/graphics.h> Loading Loading @@ -74,12 +75,12 @@ static SkColorType flinger2skia(PixelFormat f) } } static sk_sp<SkColorSpace> dataSpaceToColorSpace(android_dataspace d) static sk_sp<SkColorSpace> dataSpaceToColorSpace(ui::Dataspace d) { switch (d) { case HAL_DATASPACE_V0_SRGB: case ui::Dataspace::V0_SRGB: return SkColorSpace::MakeSRGB(); case HAL_DATASPACE_DISPLAY_P3: case ui::Dataspace::DISPLAY_P3: return SkColorSpace::MakeRGB( SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kDCIP3_D65_Gamut); default: Loading @@ -87,12 +88,26 @@ static sk_sp<SkColorSpace> dataSpaceToColorSpace(android_dataspace d) } } static uint32_t dataSpaceToInt(android_dataspace d) static ui::Dataspace pickBestDataspace(ui::ColorMode colorMode) { switch (colorMode) { case ui::ColorMode::SRGB: return ui::Dataspace::V0_SRGB; case ui::ColorMode::DISPLAY_P3: case ui::ColorMode::BT2100_PQ: case ui::ColorMode::BT2100_HLG: return ui::Dataspace::DISPLAY_P3; default: return ui::Dataspace::V0_SRGB; } } static uint32_t dataSpaceToInt(ui::Dataspace d) { switch (d) { case HAL_DATASPACE_V0_SRGB: case ui::Dataspace::V0_SRGB: return COLORSPACE_SRGB; case HAL_DATASPACE_DISPLAY_P3: case ui::Dataspace::DISPLAY_P3: return COLORSPACE_DISPLAY_P3; default: return COLORSPACE_UNKNOWN; Loading Loading @@ -161,7 +176,6 @@ int main(int argc, char** argv) void* base = NULL; uint32_t w, s, h, f; android_dataspace d; size_t size = 0; // Maps orientations from DisplayInfo to ISurfaceComposer Loading Loading @@ -197,8 +211,15 @@ int main(int argc, char** argv) uint32_t captureOrientation = ORIENTATION_MAP[displayOrientation]; sp<GraphicBuffer> outBuffer; status_t result = ScreenshotClient::capture(display, Rect(), 0 /* reqWidth */, 0 /* reqHeight */, false, captureOrientation, &outBuffer); ui::Dataspace reqDataspace = pickBestDataspace(SurfaceComposerClient::getActiveColorMode(display)); // Due to the fact that we hard code the way we write pixels into screenshot, // we hard code RGBA_8888 here. ui::PixelFormat reqPixelFormat = ui::PixelFormat::RGBA_8888; status_t result = ScreenshotClient::capture(display, reqDataspace, reqPixelFormat, Rect(), 0 /* reqWidth */, 0 /* reqHeight */, false, captureOrientation, &outBuffer); if (result != NO_ERROR) { close(fd); return 1; Loading @@ -222,12 +243,12 @@ int main(int argc, char** argv) h = outBuffer->getHeight(); s = outBuffer->getStride(); f = outBuffer->getPixelFormat(); d = HAL_DATASPACE_UNKNOWN; size = s * h * bytesPerPixel(f); if (png) { const SkImageInfo info = SkImageInfo::Make(w, h, flinger2skia(f), kPremul_SkAlphaType, dataSpaceToColorSpace(d)); SkImageInfo::Make(w, h, flinger2skia(f), kPremul_SkAlphaType, dataSpaceToColorSpace(reqDataspace)); SkPixmap pixmap(info, base, s * bytesPerPixel(f)); struct FDWStream final : public SkWStream { size_t fBytesWritten = 0; Loading @@ -244,7 +265,7 @@ int main(int argc, char** argv) notifyMediaScanner(fn); } } else { uint32_t c = dataSpaceToInt(d); uint32_t c = dataSpaceToInt(reqDataspace); write(fd, &w, 4); write(fd, &h, 4); write(fd, &f, 4); Loading
core/jni/android_view_SurfaceControl.cpp +7 −3 Original line number Diff line number Diff line Loading @@ -166,7 +166,9 @@ static jobject nativeScreenshot(JNIEnv* env, jclass clazz, } Rect sourceCrop = rectFromObj(env, sourceCropObj); sp<GraphicBuffer> buffer; status_t res = ScreenshotClient::capture(displayToken, sourceCrop, width, height, status_t res = ScreenshotClient::capture(displayToken, ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888, sourceCrop, width, height, useIdentityTransform, rotation, &buffer); if (res != NO_ERROR) { return NULL; Loading Loading @@ -195,7 +197,9 @@ static jobject nativeCaptureLayers(JNIEnv* env, jclass clazz, jobject layerHandl } sp<GraphicBuffer> buffer; status_t res = ScreenshotClient::captureChildLayers(layerHandle, sourceCrop, frameScale, &buffer); status_t res = ScreenshotClient::captureChildLayers(layerHandle, ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888, sourceCrop, frameScale, &buffer); if (res != NO_ERROR) { return NULL; } Loading