OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2013 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 "SkColorSpaceXform.h" | |
11 #include "SkRect.h" | |
12 | |
13 class ColorSpaceXformGM : public skiagm::GM { | |
14 public: | |
15 ColorSpaceXformGM() {} | |
16 | |
17 protected: | |
18 void onOnceBeforeDraw() override { | |
19 SkColor colors[] = { | |
20 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorMAGENTA, SK_ColorC
YAN, SK_ColorYELLOW, | |
21 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorMAGENTA, | |
22 }; | |
23 static_assert(kNumColors == SK_ARRAY_COUNT(colors), "Fix number of color
s."); | |
24 | |
25 for (int i = 0; i < kNumColors; i++) { | |
26 fSRGBColors[i] = SkColor4f::FromColor(colors[i]); | |
27 | |
28 // FIXME (msarett): SkColorSpaceXform does not support BGRA. | |
29 colors[i] = SkSwizzle_RB(colors[i]); | |
30 } | |
31 | |
32 static constexpr float kWideGamutRGB_toXYZD50[]{ | |
33 0.7161046f, 0.1009296f, 0.1471858f, | |
34 0.2581874f, 0.7249378f, 0.0168748f, | |
35 0.0000000f, 0.0517813f, 0.7734287f, | |
36 }; | |
37 | |
38 SkMatrix44 wideGamut(SkMatrix44::kUninitialized_Constructor); | |
39 wideGamut.set3x3RowMajorf(kWideGamutRGB_toXYZD50); | |
40 std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New( | |
41 SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named), | |
42 SkColorSpace::NewRGB(SkColorSpace::kLinear_RenderTargetGamma, wi
deGamut)); | |
43 | |
44 xform->apply(fWideGamutColors, colors, kNumColors, | |
45 SkColorSpaceXform::kRGBA_F32_ColorFormat, kOpaque_SkAlphaTy
pe); | |
46 } | |
47 | |
48 SkString onShortName() override { | |
49 return SkString("colorspacexform"); | |
50 } | |
51 | |
52 SkISize onISize() override { | |
53 return SkISize::Make(500, 200); | |
54 } | |
55 | |
56 void onDraw(SkCanvas* canvas) override { | |
57 auto drawColors = [canvas](SkColor4f* colors) { | |
58 SkRect r = SkRect::MakeXYWH(0.0f, 0.0f, 50.0f, 100.0f); | |
59 | |
60 canvas->save(); | |
61 for (int i = 0; i < kNumColors; i++) { | |
62 sk_sp<SkColorSpace> space = | |
63 SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named)->makeL
inearGamma(); | |
64 sk_sp<SkShader> s = SkShader::MakeColorShader(colors[i], space); | |
65 SkPaint paint; | |
66 paint.setShader(s); | |
67 canvas->drawRect(r, paint); | |
68 canvas->translate(50.0f, 0.0f); | |
69 } | |
70 canvas->restore(); | |
71 }; | |
72 | |
73 // Wide gamut colors should appear darker - we are simulating a more int
ense display. | |
74 drawColors(fSRGBColors); | |
75 canvas->translate(0.0f, 100.0f); | |
76 drawColors(fWideGamutColors); | |
77 } | |
78 | |
79 private: | |
80 static constexpr int kNumColors = 10; | |
81 | |
82 SkColor4f fSRGBColors[kNumColors]; | |
83 SkColor4f fWideGamutColors[kNumColors]; | |
84 | |
85 typedef skiagm::GM INHERITED; | |
86 }; | |
87 | |
88 DEF_GM(return new ColorSpaceXformGM;) | |
OLD | NEW |