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 "sk_tool_utils.h"
10 #include "SkCanvas.h"
11 #include "SkFont.h"
12 #include "SkGradientShader.h"
13 #include "SkHighContrastFilter.h"
14
15 using InvertStyle = SkHighContrastConfig::InvertStyle;
16
17 static SkScalar kSize = 200;
18 static SkColor kColor1 = SkColorSetARGB(0xff, 0xff, 0xff, 0);
19 static SkColor kColor2 = SkColorSetARGB(0xff, 0x82, 0xff, 0);
20
draw_label(SkCanvas * canvas,const SkHighContrastConfig & config)21 static void draw_label(SkCanvas* canvas, const SkHighContrastConfig& config) {
22 char labelBuffer[256];
23 const char* invertStr =
24 (config.fInvertStyle == InvertStyle::kInvertBrightness ?
25 "InvBrightness" :
26 (config.fInvertStyle == InvertStyle::kInvertLightness ?
27 "InvLightness" : "NoInvert"));
28
29 snprintf(labelBuffer, sizeof(labelBuffer), "%s%s contrast=%.1f",
30 config.fGrayscale ? "Gray " : "",
31 invertStr,
32 config.fContrast);
33
34 SkFont font;
35 font.setTypeface(sk_tool_utils::create_portable_typeface());
36 font.setSize(0.05f);
37 font.setEdging(SkFont::Edging::kAlias);
38
39 size_t len = strlen(labelBuffer);
40
41 SkScalar width = font.measureText(labelBuffer, len, kUTF8_SkTextEncoding);
42 canvas->drawSimpleText(labelBuffer, len, kUTF8_SkTextEncoding, 0.5f - width / 2, 0.16f, font, SkPaint());
43 }
44
draw_scene(SkCanvas * canvas,const SkHighContrastConfig & config)45 static void draw_scene(SkCanvas* canvas, const SkHighContrastConfig& config) {
46 SkRect bounds = SkRect::MakeLTRB(0.0f, 0.0f, 1.0f, 1.0f);
47 SkPaint xferPaint;
48 xferPaint.setColorFilter(SkHighContrastFilter::Make(config));
49 canvas->saveLayer(&bounds, &xferPaint);
50
51 SkPaint paint;
52 bounds = SkRect::MakeLTRB(0.1f, 0.2f, 0.9f, 0.4f);
53 paint.setARGB(0xff, 0x66, 0x11, 0x11);
54 canvas->drawRect(bounds, paint);
55
56 SkFont font;
57 font.setSize(0.15f);
58 font.setEdging(SkFont::Edging::kAlias);
59
60 paint.setARGB(0xff, 0xbb, 0x77, 0x77);
61 canvas->drawString("A", 0.15f, 0.35f, font, paint);
62
63 bounds = SkRect::MakeLTRB(0.1f, 0.8f, 0.9f, 1.0f);
64 paint.setARGB(0xff, 0xcc, 0xcc, 0xff);
65 canvas->drawRect(bounds, paint);
66
67 paint.setARGB(0xff, 0x88, 0x88, 0xbb);
68 canvas->drawString("Z", 0.75f, 0.95f, font, paint);
69
70 bounds = SkRect::MakeLTRB(0.1f, 0.4f, 0.9f, 0.6f);
71 SkPoint pts[] = { { 0, 0 }, { 1, 0 } };
72 SkColor colors[] = { SK_ColorWHITE, SK_ColorBLACK };
73 SkScalar pos[] = { 0.2f, 0.8f };
74 paint.setShader(SkGradientShader::MakeLinear(
75 pts, colors, pos,
76 SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
77 canvas->drawRect(bounds, paint);
78
79 bounds = SkRect::MakeLTRB(0.1f, 0.6f, 0.9f, 0.8f);
80 SkColor colors2[] = { SK_ColorGREEN, SK_ColorWHITE };
81 paint.setShader(SkGradientShader::MakeLinear(
82 pts, colors2, pos,
83 SK_ARRAY_COUNT(colors2), SkShader::kClamp_TileMode));
84 canvas->drawRect(bounds, paint);
85
86 canvas->restore();
87 }
88
89 class HighContrastFilterGM : public skiagm::GM {
90 public:
HighContrastFilterGM()91 HighContrastFilterGM() {
92 SkColor g1Colors[] = { kColor1, SkColorSetA(kColor1, 0x20) };
93 SkColor g2Colors[] = { kColor2, SkColorSetA(kColor2, 0x20) };
94 SkPoint g1Points[] = { { 0, 0 }, { 0, 100 } };
95 SkPoint g2Points[] = { { 0, 0 }, { kSize, 0 } };
96 SkScalar pos[] = { 0.2f, 1.0f };
97
98 SkHighContrastConfig fConfig;
99 fFilter = SkHighContrastFilter::Make(fConfig);
100 fGr1 = SkGradientShader::MakeLinear(
101 g1Points, g1Colors, pos, SK_ARRAY_COUNT(g1Colors),
102 SkShader::kClamp_TileMode);
103 fGr2 = SkGradientShader::MakeLinear(
104 g2Points, g2Colors, pos, SK_ARRAY_COUNT(g2Colors),
105 SkShader::kClamp_TileMode);
106 }
107
108 protected:
109
onShortName()110 SkString onShortName() override {
111 return SkString("highcontrastfilter");
112 }
113
onISize()114 SkISize onISize() override {
115 return SkISize::Make(600, 420);
116 }
117
onDraw(SkCanvas * canvas)118 void onDraw(SkCanvas* canvas) override {
119 SkHighContrastConfig configs[] = {
120 { false, InvertStyle::kNoInvert, 0.0f },
121 { false, InvertStyle::kInvertBrightness, 0.0f },
122 { false, InvertStyle::kInvertLightness, 0.0f },
123 { false, InvertStyle::kInvertLightness, 0.2f },
124 { true, InvertStyle::kNoInvert, 0.0f },
125 { true, InvertStyle::kInvertBrightness, 0.0f },
126 { true, InvertStyle::kInvertLightness, 0.0f },
127 { true, InvertStyle::kInvertLightness, 0.2f },
128 };
129
130 for (size_t i = 0; i < SK_ARRAY_COUNT(configs); ++i) {
131 SkScalar x = kSize * (i % 4);
132 SkScalar y = kSize * (i / 4);
133 canvas->save();
134 canvas->translate(x, y);
135 canvas->scale(kSize, kSize);
136 draw_scene(canvas, configs[i]);
137 draw_label(canvas, configs[i]);
138 canvas->restore();
139 }
140 }
141
142 private:
143 sk_sp<SkColorFilter> fFilter;
144 sk_sp<SkShader> fGr1, fGr2;
145
146 typedef skiagm::GM INHERITED;
147 };
148
149 DEF_GM(return new HighContrastFilterGM;)
150