SkColorSpaceXformCanvas: Use when drawing picture images
authorMatt Sarett <msarett@google.com>
Fri, 21 Apr 2017 15:42:00 +0000 (11:42 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Fri, 21 Apr 2017 16:09:12 +0000 (16:09 +0000)
The new code path is triggered by SkImage::makeColorSpace()
when the image is picture backed.

Fixes 3 gms in gbr-8888 config.

Bug: skia:6516
Change-Id: I397903eb0f926834efd277f30265339518777920
Reviewed-on: https://skia-review.googlesource.com/14034
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Matt Sarett <msarett@google.com>

src/core/SkPictureImageGenerator.cpp
src/core/SkPictureImageGenerator.h

index a960001..34046e9 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "SkImage_Base.h"
 #include "SkCanvas.h"
+#include "SkColorSpaceXformCanvas.h"
 #include "SkMakeUnique.h"
 #include "SkMatrix.h"
 #include "SkPaint.h"
@@ -69,6 +70,25 @@ bool SkPictureImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels,
     return true;
 }
 
+bool SkPictureImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
+                                          const Options& opts) {
+    // No need to use the xform canvas if we want fully color correct behavior or if we do not
+    // have a destination color space.
+    if (SkTransferFunctionBehavior::kRespect == opts.fBehavior || !info.colorSpace()) {
+        return this->onGetPixels(info, pixels, rowBytes, opts.fColorTable, opts.fColorTableCount);
+    }
+
+    auto canvas = SkCanvas::MakeRasterDirect(info.makeColorSpace(nullptr), pixels, rowBytes);
+    if (!canvas) {
+        return false;
+    }
+    canvas->clear(0);
+
+    auto xformCanvas = SkCreateColorSpaceXformCanvas(canvas.get(), info.refColorSpace());
+    xformCanvas->drawPicture(fPicture, &fMatrix, fPaint.getMaybeNull());
+    return true;
+}
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 std::unique_ptr<SkImageGenerator>
index 8387260..ed5e87c 100644 (file)
@@ -19,6 +19,8 @@ public:
 protected:
     bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor ctable[],
                      int* ctableCount) override;
+    bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options& opts)
+                     override;
 
 #if SK_SUPPORT_GPU
     sk_sp<GrTextureProxy> onGenerateTexture(GrContext*, const SkImageInfo&,