1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2012 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 "SkColorFilter.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGradientShader.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define WIDTH 512
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define HEIGHT 1024
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm {
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Using gradients because GPU doesn't currently have an implementation of SkColorShader (duh!)
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> make_color_shader(SkColor color) {
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    constexpr SkPoint kPts[] = {{0, 0}, {1, 1}};
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkColor colors[] = {color, color};
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkGradientShader::MakeLinear(kPts, colors, nullptr, 2, SkShader::kClamp_TileMode);
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> make_solid_shader() {
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return make_color_shader(SkColorSetARGB(0xFF, 0x42, 0x82, 0x21));
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> make_transparent_shader() {
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return make_color_shader(SkColorSetARGB(0x80, 0x10, 0x70, 0x20));
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> make_trans_black_shader() {
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return make_color_shader(0x0);
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// draws a background behind each test rect to see transparency
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> make_bg_shader(int checkSize) {
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBitmap bmp;
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bmp.allocN32Pixels(2 * checkSize, 2 * checkSize);
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkCanvas canvas(bmp);
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas.clear(sk_tool_utils::color_to_565(0xFF800000));
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint paint;
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setColor(sk_tool_utils::color_to_565(0xFF000080));
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect rect0 = SkRect::MakeXYWH(0, 0,
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    SkIntToScalar(checkSize), SkIntToScalar(checkSize));
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(checkSize), SkIntToScalar(checkSize),
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    SkIntToScalar(checkSize), SkIntToScalar(checkSize));
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas.drawRect(rect1, paint);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas.drawRect(rect0, paint);
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkShader::MakeBitmapShader(bmp, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ModeColorFilterGM : public GM {
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ModeColorFilterGM() {
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->setBGColor(sk_tool_utils::color_to_565(0xFF303030));
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString onShortName() override  {
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkString("modecolorfilters");
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkISize onISize() override  {
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkISize::Make(WIDTH, HEIGHT);
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(SkCanvas* canvas) override {
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // size of rect for each test case
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        constexpr int kRectWidth  = 20;
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        constexpr int kRectHeight = 20;
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        constexpr int kCheckSize  = 10;
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!fBmpShader) {
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fBmpShader = make_bg_shader(kCheckSize);
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint bgPaint;
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bgPaint.setShader(fBmpShader);
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bgPaint.setBlendMode(SkBlendMode::kSrc);
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<SkShader> shaders[] = {
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            nullptr,                                   // use a paint color instead of a shader
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            make_solid_shader(),
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            make_transparent_shader(),
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            make_trans_black_shader(),
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // used without shader
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkColor colors[] = {
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkColorSetARGB(0xFF, 0xFF, 0xFF, 0xFF),
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkColorSetARGB(0xFF, 0x00, 0x00, 0x00),
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkColorSetARGB(0x00, 0x00, 0x00, 0x00),
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkColorSetARGB(0xFF, 0x10, 0x20, 0x42),
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkColorSetARGB(0xA0, 0x20, 0x30, 0x90),
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // used with shaders
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkColor alphas[] = {0xFFFFFFFF, 0x80808080};
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkBlendMode modes[]  = { // currently just doing the Modes expressible as Coeffs
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kClear,
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kSrc,
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kDst,
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kSrcOver,
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kDstOver,
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kSrcIn,
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kDstIn,
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kSrcOut,
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kDstOut,
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kSrcATop,
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kDstATop,
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kXor,
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kPlus,
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBlendMode::kModulate,
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint paint;
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int idx = 0;
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const int kRectsPerRow = SkMax32(this->getISize().fWidth / kRectWidth, 1);
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (size_t cfm = 0; cfm < SK_ARRAY_COUNT(modes); ++cfm) {
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (size_t cfc = 0; cfc < SK_ARRAY_COUNT(colors); ++cfc) {
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                paint.setColorFilter(SkColorFilter::MakeModeFilter(colors[cfc], modes[cfm]));
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (size_t s = 0; s < SK_ARRAY_COUNT(shaders); ++s) {
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    paint.setShader(shaders[s]);
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    bool hasShader = nullptr == paint.getShader();
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    int paintColorCnt = hasShader ? SK_ARRAY_COUNT(alphas) : SK_ARRAY_COUNT(colors);
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkColor* paintColors = hasShader ? alphas : colors;
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    for (int pc = 0; pc < paintColorCnt; ++pc) {
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        paint.setColor(paintColors[pc]);
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        SkScalar x = SkIntToScalar(idx % kRectsPerRow);
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        SkScalar y = SkIntToScalar(idx / kRectsPerRow);
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        SkRect rect = SkRect::MakeXYWH(x * kRectWidth, y * kRectHeight,
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                       SkIntToScalar(kRectWidth),
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                       SkIntToScalar(kRectHeight));
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        canvas->saveLayer(&rect, nullptr);
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        canvas->drawRect(rect, bgPaint);
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        canvas->drawRect(rect, paint);
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        canvas->restore();
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        ++idx;
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    }
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkShader> fBmpShader;
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef GM INHERITED;
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//////////////////////////////////////////////////////////////////////////////
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic GM* MyFactory(void*) { return new ModeColorFilterGM; }
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic GMRegistry reg(MyFactory);
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
160