1 /* 2 * Copyright 2016 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 "SkColor.h" 10 #include "SkColorSpace_Base.h" 11 #include "SkColorSpaceXform.h" 12 #include "SkRect.h" 13 #include "SkShader.h" 14 15 class ColorSpaceXformGM : public skiagm::GM { 16 public: 17 ColorSpaceXformGM() {} 18 19 protected: 20 void onOnceBeforeDraw() override { 21 SkColor colors[] = { 22 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorMAGENTA, SK_ColorCYAN, SK_ColorYELLOW, 23 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorMAGENTA, 24 }; 25 static_assert(kNumColors == SK_ARRAY_COUNT(colors), "Fix number of colors."); 26 27 for (int i = 0; i < kNumColors; i++) { 28 fSRGBColors[i] = SkColor4f::FromColor(colors[i]); 29 } 30 31 static constexpr float kWideGamutRGB_toXYZD50[]{ 32 0.7161046f, 0.1009296f, 0.1471858f, 33 0.2581874f, 0.7249378f, 0.0168748f, 34 0.0000000f, 0.0517813f, 0.7734287f, 35 }; 36 37 SkMatrix44 wideGamut(SkMatrix44::kUninitialized_Constructor); 38 wideGamut.set3x3RowMajorf(kWideGamutRGB_toXYZD50); 39 40 // Test BGRA input. 41 sk_sp<SkColorSpace> srcSpace = SkColorSpace::MakeSRGB(); 42 sk_sp<SkColorSpace> dstSpace = 43 SkColorSpace::MakeRGB(SkColorSpace::kLinear_RenderTargetGamma, wideGamut); 44 std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New(srcSpace.get(), 45 dstSpace.get()); 46 xform->apply(SkColorSpaceXform::kRGBA_F32_ColorFormat, fWideGamutColors0, 47 SkColorSpaceXform::kBGRA_8888_ColorFormat, colors, kNumColors, 48 kOpaque_SkAlphaType); 49 50 // Test F32 input. 51 srcSpace = as_CSB(srcSpace)->makeLinearGamma(); 52 xform = SkColorSpaceXform::New(srcSpace.get(), dstSpace.get()); 53 xform->apply(SkColorSpaceXform::kRGBA_F32_ColorFormat, fWideGamutColors1, 54 SkColorSpaceXform::kRGBA_F32_ColorFormat, fSRGBColors, kNumColors, 55 kOpaque_SkAlphaType); 56 } 57 58 SkString onShortName() override { 59 return SkString("colorspacexform"); 60 } 61 62 SkISize onISize() override { 63 return SkISize::Make(500, 300); 64 } 65 66 void onDraw(SkCanvas* canvas) override { 67 auto drawColors = [canvas](SkColor4f* colors) { 68 SkRect r = SkRect::MakeXYWH(0.0f, 0.0f, 50.0f, 100.0f); 69 70 canvas->save(); 71 for (int i = 0; i < kNumColors; i++) { 72 auto space = SkColorSpace::MakeSRGBLinear(); 73 sk_sp<SkShader> s = SkShader::MakeColorShader(colors[i], space); 74 SkPaint paint; 75 paint.setShader(s); 76 canvas->drawRect(r, paint); 77 canvas->translate(50.0f, 0.0f); 78 } 79 canvas->restore(); 80 }; 81 82 // Wide gamut colors should appear darker - we are simulating a more intense display. 83 drawColors(fSRGBColors); 84 canvas->translate(0.0f, 100.0f); 85 drawColors(fWideGamutColors0); 86 canvas->translate(0.0f, 100.0f); 87 drawColors(fWideGamutColors1); 88 } 89 90 private: 91 static constexpr int kNumColors = 10; 92 93 SkColor4f fSRGBColors[kNumColors]; 94 SkColor4f fWideGamutColors0[kNumColors]; 95 SkColor4f fWideGamutColors1[kNumColors]; 96 97 typedef skiagm::GM INHERITED; 98 }; 99 100 DEF_GM(return new ColorSpaceXformGM;) 101