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 "SkImage.h" 12 #include "SkImagePriv.h" 13 14 sk_sp<SkImage> make_raster_image(const char* path, SkTransferFunctionBehavior behavior) { 15 sk_sp<SkData> resourceData = GetResourceAsData(path); 16 std::unique_ptr<SkCodec> codec = SkCodec::MakeFromData(resourceData); 17 18 SkBitmap bitmap; 19 bitmap.allocPixels(codec->getInfo()); 20 21 SkCodec::Options opts; 22 opts.fPremulBehavior = behavior; 23 codec->getPixels(codec->getInfo(), bitmap.getPixels(), bitmap.rowBytes(), &opts); 24 return SkImage::MakeFromBitmap(bitmap); 25 } 26 27 sk_sp<SkImage> make_color_space(sk_sp<SkImage> orig, sk_sp<SkColorSpace> colorSpace, 28 SkTransferFunctionBehavior behavior) { 29 sk_sp<SkImage> xform = orig->makeColorSpace(colorSpace, behavior); 30 31 // Assign an sRGB color space on the xformed image, so we can see the effects of the xform 32 // when we draw. 33 sk_sp<SkColorSpace> srgb = SkColorSpace::MakeSRGB(); 34 if (colorSpace->gammaIsLinear()) { 35 srgb = SkColorSpace::MakeSRGBLinear(); 36 } 37 return SkImageMakeRasterCopyAndAssignColorSpace(xform.get(), srgb.get()); 38 } 39 40 class MakeCSGM : public skiagm::GM { 41 public: 42 MakeCSGM() {} 43 44 protected: 45 SkString onShortName() override { 46 return SkString("makecolorspace"); 47 } 48 49 SkISize onISize() override { 50 return SkISize::Make(128*3, 128*4); 51 } 52 53 void onDraw(SkCanvas* canvas) override { 54 SkTransferFunctionBehavior behavior = canvas->imageInfo().colorSpace() ? 55 SkTransferFunctionBehavior::kRespect : SkTransferFunctionBehavior::kIgnore; 56 57 sk_sp<SkColorSpace> wideGamut = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma, 58 SkColorSpace::kAdobeRGB_Gamut); 59 sk_sp<SkColorSpace> wideGamutLinear = wideGamut->makeLinearGamma(); 60 61 // Lazy images 62 sk_sp<SkImage> opaqueImage = GetResourceAsImage("images/mandrill_128.png"); 63 sk_sp<SkImage> premulImage = GetResourceAsImage("images/color_wheel.png"); 64 canvas->drawImage(opaqueImage, 0.0f, 0.0f); 65 canvas->drawImage(make_color_space(opaqueImage, wideGamut, behavior), 128.0f, 0.0f); 66 canvas->drawImage(make_color_space(opaqueImage, wideGamutLinear, behavior), 256.0f, 0.0f); 67 canvas->drawImage(premulImage, 0.0f, 128.0f); 68 canvas->drawImage(make_color_space(premulImage, wideGamut, behavior), 128.0f, 128.0f); 69 canvas->drawImage(make_color_space(premulImage, wideGamutLinear, behavior), 256.0f, 128.0f); 70 canvas->translate(0.0f, 256.0f); 71 72 // Raster images 73 opaqueImage = make_raster_image("images/mandrill_128.png", behavior); 74 premulImage = make_raster_image("images/color_wheel.png", behavior); 75 canvas->drawImage(opaqueImage, 0.0f, 0.0f); 76 canvas->drawImage(make_color_space(opaqueImage, wideGamut, behavior), 128.0f, 0.0f); 77 canvas->drawImage(make_color_space(opaqueImage, wideGamutLinear, behavior), 256.0f, 0.0f); 78 canvas->drawImage(premulImage, 0.0f, 128.0f); 79 canvas->drawImage(make_color_space(premulImage, wideGamut, behavior), 128.0f, 128.0f); 80 canvas->drawImage(make_color_space(premulImage, wideGamutLinear, behavior), 256.0f, 128.0f); 81 } 82 83 private: 84 typedef skiagm::GM INHERITED; 85 }; 86 87 DEF_GM(return new MakeCSGM;) 88