diff options
author | 2017-03-29 16:25:10 -0400 | |
---|---|---|
committer | 2017-04-06 15:14:00 +0000 | |
commit | ea70d22dc8dc5d61f075edf6d03f86f6a68169cd (patch) | |
tree | 076905e7bf8d2a09631a597d8c1c4975964e8ab6 /libs/hwui/SkiaCanvas.cpp | |
parent | 3cc32f2aa205db9770c694a823f6d9a532ff0901 (diff) |
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
Diffstat (limited to 'libs/hwui/SkiaCanvas.cpp')
-rw-r--r-- | libs/hwui/SkiaCanvas.cpp | 28 |
1 files changed, 18 insertions, 10 deletions
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 <SkColorSpaceXformCanvas.h> #include <SkDrawable.h> #include <SkDeque.h> #include <SkDrawFilter.h> @@ -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<SkCanvas>(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<SkCanvas> newCanvas = std::unique_ptr<SkCanvas>(new SkCanvas(bitmap)); + std::unique_ptr<SkCanvas> 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<SkCanvas>(newCanvas); - mCanvas = newCanvas; + mCanvasOwned = std::move(newCanvas); + mCanvasWrapper = std::move(newCanvasWrapper); + mCanvas = mCanvasWrapper.get(); // clean up the old save stack mSaveStack.reset(nullptr); |