From ea70d22dc8dc5d61f075edf6d03f86f6a68169cd Mon Sep 17 00:00:00 2001 From: Matt Sarett Date: Wed, 29 Mar 2017 16:25:10 -0400 Subject: Xform bitmaps to sRGB on SW and PDF canvases For picture-backed canvases, we will defer the xform until playback. Test: Unit tests and cts test. Bug: 32984164 Change-Id: Ib74663bcb688b74b6ba8792b403b0475126732af --- libs/hwui/SkiaCanvas.cpp | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) (limited to 'libs/hwui/SkiaCanvas.cpp') diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index daf14af87288..13d7e09b6e79 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -23,6 +23,7 @@ #include "hwui/MinikinUtils.h" #include "pipeline/skia/AnimatedDrawables.h" +#include #include #include #include @@ -44,18 +45,22 @@ Canvas* Canvas::create_canvas(const SkBitmap& bitmap) { return new SkiaCanvas(bitmap); } -Canvas* Canvas::create_canvas(SkCanvas* skiaCanvas) { - return new SkiaCanvas(skiaCanvas); +Canvas* Canvas::create_canvas(SkCanvas* skiaCanvas, XformToSRGB xformToSRGB) { + return new SkiaCanvas(skiaCanvas, xformToSRGB); } SkiaCanvas::SkiaCanvas() {} -SkiaCanvas::SkiaCanvas(SkCanvas* canvas) - : mCanvas(canvas) {} +SkiaCanvas::SkiaCanvas(SkCanvas* canvas, XformToSRGB xformToSRGB) + : mCanvas(canvas) +{ + LOG_ALWAYS_FATAL_IF(XformToSRGB::kImmediate == xformToSRGB); +} SkiaCanvas::SkiaCanvas(const SkBitmap& bitmap) { mCanvasOwned = std::unique_ptr(new SkCanvas(bitmap)); - mCanvas = mCanvasOwned.get(); + mCanvasWrapper = SkCreateColorSpaceXformCanvas(mCanvasOwned.get(), SkColorSpace::MakeSRGB()); + mCanvas = mCanvasWrapper.get(); } SkiaCanvas::~SkiaCanvas() {} @@ -92,19 +97,22 @@ private: }; void SkiaCanvas::setBitmap(const SkBitmap& bitmap) { - SkCanvas* newCanvas = new SkCanvas(bitmap); + std::unique_ptr newCanvas = std::unique_ptr(new SkCanvas(bitmap)); + std::unique_ptr newCanvasWrapper = + SkCreateColorSpaceXformCanvas(newCanvas.get(), SkColorSpace::MakeSRGB()); if (!bitmap.isNull()) { // Copy the canvas matrix & clip state. - newCanvas->setMatrix(mCanvas->getTotalMatrix()); + newCanvasWrapper->setMatrix(mCanvas->getTotalMatrix()); - ClipCopier copier(newCanvas); + ClipCopier copier(newCanvasWrapper.get()); mCanvas->replayClips(&copier); } // deletes the previously owned canvas (if any) - mCanvasOwned = std::unique_ptr(newCanvas); - mCanvas = newCanvas; + mCanvasOwned = std::move(newCanvas); + mCanvasWrapper = std::move(newCanvasWrapper); + mCanvas = mCanvasWrapper.get(); // clean up the old save stack mSaveStack.reset(nullptr); -- cgit v1.2.3-59-g8ed1b