aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/makecolorspace.cpp
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-05-04 08:53:32 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-04 13:22:39 +0000
commit9f3dcb3f760274d42e28095fd3cf0f484168d996 (patch)
treebfae1b5cf79982a047015bd778c53c3dd4e1e41d /gm/makecolorspace.cpp
parent421fe443f833c916e6c3616f92570c8920b030f9 (diff)
Reland "Add SkImage::makeColorSpace() with correct transfer fn behavior"
Completes implementation for lazy and raster images. gpu is still a TODO. Bug: skia:6553 Change-Id: I898e4464ffc91442c7f98669f1203dd5c203621b Reviewed-on: https://skia-review.googlesource.com/15307 Reviewed-by: Matt Sarett <msarett@google.com> Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'gm/makecolorspace.cpp')
-rw-r--r--gm/makecolorspace.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/gm/makecolorspace.cpp b/gm/makecolorspace.cpp
new file mode 100644
index 0000000000..af0b3d4b19
--- /dev/null
+++ b/gm/makecolorspace.cpp
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "gm.h"
+#include "Resources.h"
+#include "SkCodec.h"
+#include "SkColorSpace_Base.h"
+#include "SkImage.h"
+#include "SkImagePriv.h"
+
+sk_sp<SkImage> make_raster_image(const char* path, SkTransferFunctionBehavior behavior) {
+ SkString resourcePath = GetResourcePath(path);
+ sk_sp<SkData> resourceData = SkData::MakeFromFileName(resourcePath.c_str());
+ std::unique_ptr<SkCodec> codec(SkCodec::NewFromData(resourceData));
+
+ SkBitmap bitmap;
+ bitmap.allocPixels(codec->getInfo());
+
+ SkCodec::Options opts;
+ opts.fPremulBehavior = behavior;
+ codec->getPixels(codec->getInfo(), bitmap.getPixels(), bitmap.rowBytes(), &opts,
+ nullptr, nullptr);
+ return SkImage::MakeFromBitmap(bitmap);
+}
+
+sk_sp<SkImage> make_color_space(sk_sp<SkImage> orig, sk_sp<SkColorSpace> colorSpace,
+ SkTransferFunctionBehavior behavior) {
+ sk_sp<SkImage> xform = orig->makeColorSpace(colorSpace, behavior);
+
+ // Assign an sRGB color space on the xformed image, so we can see the effects of the xform
+ // when we draw.
+ sk_sp<SkColorSpace> srgb = SkColorSpace::MakeSRGB();
+ if (colorSpace->gammaIsLinear()) {
+ srgb = SkColorSpace::MakeSRGBLinear();
+ }
+ return SkImageMakeRasterCopyAndAssignColorSpace(xform.get(), srgb.get());
+}
+
+class MakeCSGM : public skiagm::GM {
+public:
+ MakeCSGM() {}
+
+protected:
+ SkString onShortName() override {
+ return SkString("makecolorspace");
+ }
+
+ SkISize onISize() override {
+ return SkISize::Make(128*3, 128*4);
+ }
+
+ void onDraw(SkCanvas* canvas) override {
+ SkTransferFunctionBehavior behavior = canvas->imageInfo().colorSpace() ?
+ SkTransferFunctionBehavior::kRespect : SkTransferFunctionBehavior::kIgnore;
+
+ sk_sp<SkColorSpace> wideGamut = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
+ SkColorSpace::kAdobeRGB_Gamut);
+ sk_sp<SkColorSpace> wideGamutLinear = as_CSB(wideGamut)->makeLinearGamma();
+
+ // Lazy images
+ sk_sp<SkImage> opaqueImage = GetResourceAsImage("mandrill_128.png");
+ sk_sp<SkImage> premulImage = GetResourceAsImage("color_wheel.png");
+ canvas->drawImage(opaqueImage, 0.0f, 0.0f);
+ canvas->drawImage(make_color_space(opaqueImage, wideGamut, behavior), 128.0f, 0.0f);
+ canvas->drawImage(make_color_space(opaqueImage, wideGamutLinear, behavior), 256.0f, 0.0f);
+ canvas->drawImage(premulImage, 0.0f, 128.0f);
+ canvas->drawImage(make_color_space(premulImage, wideGamut, behavior), 128.0f, 128.0f);
+ canvas->drawImage(make_color_space(premulImage, wideGamutLinear, behavior), 256.0f, 128.0f);
+ canvas->translate(0.0f, 256.0f);
+
+ // Raster images
+ opaqueImage = make_raster_image("mandrill_128.png", behavior);
+ premulImage = make_raster_image("color_wheel.png", behavior);
+ canvas->drawImage(opaqueImage, 0.0f, 0.0f);
+ canvas->drawImage(make_color_space(opaqueImage, wideGamut, behavior), 128.0f, 0.0f);
+ canvas->drawImage(make_color_space(opaqueImage, wideGamutLinear, behavior), 256.0f, 0.0f);
+ canvas->drawImage(premulImage, 0.0f, 128.0f);
+ canvas->drawImage(make_color_space(premulImage, wideGamut, behavior), 128.0f, 128.0f);
+ canvas->drawImage(make_color_space(premulImage, wideGamutLinear, behavior), 256.0f, 128.0f);
+ }
+
+private:
+ typedef skiagm::GM INHERITED;
+};
+
+DEF_GM(return new MakeCSGM;)