diff options
author | Matt Sarett <msarett@google.com> | 2017-05-04 08:53:32 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-05-04 13:22:39 +0000 |
commit | 9f3dcb3f760274d42e28095fd3cf0f484168d996 (patch) | |
tree | bfae1b5cf79982a047015bd778c53c3dd4e1e41d /gm | |
parent | 421fe443f833c916e6c3616f92570c8920b030f9 (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')
-rw-r--r-- | gm/makecolorspace.cpp | 90 |
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;) |