Add fixes & test for isConfigTexturable and isConfigRenderable
[platform/upstream/libSkiaSharp.git] / gm / makecolorspace.cpp
1 /*
2  * Copyright 2017 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7
8 #include "gm.h"
9 #include "Resources.h"
10 #include "SkCodec.h"
11 #include "SkColorSpace_Base.h"
12 #include "SkImage.h"
13 #include "SkImagePriv.h"
14
15 sk_sp<SkImage> make_raster_image(const char* path, SkTransferFunctionBehavior behavior) {
16     SkString resourcePath = GetResourcePath(path);
17     sk_sp<SkData> resourceData = SkData::MakeFromFileName(resourcePath.c_str());
18     std::unique_ptr<SkCodec> codec(SkCodec::NewFromData(resourceData));
19
20     SkBitmap bitmap;
21     bitmap.allocPixels(codec->getInfo());
22
23     SkCodec::Options opts;
24     opts.fPremulBehavior = behavior;
25     codec->getPixels(codec->getInfo(), bitmap.getPixels(), bitmap.rowBytes(), &opts,
26                      nullptr, nullptr);
27     return SkImage::MakeFromBitmap(bitmap);
28 }
29
30 sk_sp<SkImage> make_color_space(sk_sp<SkImage> orig, sk_sp<SkColorSpace> colorSpace,
31                                 SkTransferFunctionBehavior behavior) {
32     sk_sp<SkImage> xform = orig->makeColorSpace(colorSpace, behavior);
33
34     // Assign an sRGB color space on the xformed image, so we can see the effects of the xform
35     // when we draw.
36     sk_sp<SkColorSpace> srgb = SkColorSpace::MakeSRGB();
37     if (colorSpace->gammaIsLinear()) {
38         srgb = SkColorSpace::MakeSRGBLinear();
39     }
40     return SkImageMakeRasterCopyAndAssignColorSpace(xform.get(), srgb.get());
41 }
42
43 class MakeCSGM : public skiagm::GM {
44 public:
45     MakeCSGM() {}
46
47 protected:
48     SkString onShortName() override {
49         return SkString("makecolorspace");
50     }
51
52     SkISize onISize() override {
53         return SkISize::Make(128*3, 128*4);
54     }
55
56     void onDraw(SkCanvas* canvas) override {
57         SkTransferFunctionBehavior behavior = canvas->imageInfo().colorSpace() ?
58                 SkTransferFunctionBehavior::kRespect : SkTransferFunctionBehavior::kIgnore;
59
60         sk_sp<SkColorSpace> wideGamut = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
61                                                               SkColorSpace::kAdobeRGB_Gamut);
62         sk_sp<SkColorSpace> wideGamutLinear = as_CSB(wideGamut)->makeLinearGamma();
63
64         // Lazy images
65         sk_sp<SkImage> opaqueImage = GetResourceAsImage("mandrill_128.png");
66         sk_sp<SkImage> premulImage = GetResourceAsImage("color_wheel.png");
67         canvas->drawImage(opaqueImage, 0.0f, 0.0f);
68         canvas->drawImage(make_color_space(opaqueImage, wideGamut, behavior), 128.0f, 0.0f);
69         canvas->drawImage(make_color_space(opaqueImage, wideGamutLinear, behavior), 256.0f, 0.0f);
70         canvas->drawImage(premulImage, 0.0f, 128.0f);
71         canvas->drawImage(make_color_space(premulImage, wideGamut, behavior), 128.0f, 128.0f);
72         canvas->drawImage(make_color_space(premulImage, wideGamutLinear, behavior), 256.0f, 128.0f);
73         canvas->translate(0.0f, 256.0f);
74
75         // Raster images
76         opaqueImage = make_raster_image("mandrill_128.png", behavior);
77         premulImage = make_raster_image("color_wheel.png", behavior);
78         canvas->drawImage(opaqueImage, 0.0f, 0.0f);
79         canvas->drawImage(make_color_space(opaqueImage, wideGamut, behavior), 128.0f, 0.0f);
80         canvas->drawImage(make_color_space(opaqueImage, wideGamutLinear, behavior), 256.0f, 0.0f);
81         canvas->drawImage(premulImage, 0.0f, 128.0f);
82         canvas->drawImage(make_color_space(premulImage, wideGamut, behavior), 128.0f, 128.0f);
83         canvas->drawImage(make_color_space(premulImage, wideGamutLinear, behavior), 256.0f, 128.0f);
84     }
85
86 private:
87     typedef skiagm::GM INHERITED;
88 };
89
90 DEF_GM(return new MakeCSGM;)