aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/makecolorspace.cpp
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-05-03 19:09:46 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-03 23:45:55 +0000
commit9ad0531a18f854e5a2c8034880140dd6cd3ea3c1 (patch)
treebfa2ca0ef23438b70159a5d2eb5a8a1a3b477094 /gm/makecolorspace.cpp
parent1478f74aa2233a7ae40351764d37fde679d2c561 (diff)
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: I04eea5c4fb53c50c0406c2e6b6778b0e21fd85f8 Reviewed-on: https://skia-review.googlesource.com/14403 Commit-Queue: Matt Sarett <msarett@google.com> Reviewed-by: Mike Reed <reed@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;)