From 9ad0531a18f854e5a2c8034880140dd6cd3ea3c1 Mon Sep 17 00:00:00 2001 From: Matt Sarett Date: Wed, 3 May 2017 19:09:46 -0400 Subject: 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 Reviewed-by: Mike Reed --- gm/makecolorspace.cpp | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 gm/makecolorspace.cpp (limited to 'gm/makecolorspace.cpp') 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 make_raster_image(const char* path, SkTransferFunctionBehavior behavior) { + SkString resourcePath = GetResourcePath(path); + sk_sp resourceData = SkData::MakeFromFileName(resourcePath.c_str()); + std::unique_ptr 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 make_color_space(sk_sp orig, sk_sp colorSpace, + SkTransferFunctionBehavior behavior) { + sk_sp 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 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 wideGamut = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma, + SkColorSpace::kAdobeRGB_Gamut); + sk_sp wideGamutLinear = as_CSB(wideGamut)->makeLinearGamma(); + + // Lazy images + sk_sp opaqueImage = GetResourceAsImage("mandrill_128.png"); + sk_sp 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;) -- cgit v1.2.3