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