1a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org/*
2a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org * Copyright 2011 Google Inc.
3a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org *
4a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be
5a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org * found in the LICENSE file.
6a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org */
7a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
8a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "gm.h"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
10a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkCanvas.h"
11c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez#include "SkColorFilterImageFilter.h"
12a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkGradientShader.h"
13a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkTableColorFilter.h"
14a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
151a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> make_shader0(int w, int h) {
16db873d8677a2d4ecfe38a794a5d868301bdeeabereed    SkPoint pts[] = { {0, 0}, {SkIntToScalar(w), SkIntToScalar(h)} };
17db873d8677a2d4ecfe38a794a5d868301bdeeabereed    SkColor colors[] = {
18db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SK_ColorBLACK, SK_ColorGREEN, SK_ColorCYAN,
19db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SK_ColorRED, 0, SK_ColorBLUE, SK_ColorWHITE
20db873d8677a2d4ecfe38a794a5d868301bdeeabereed    };
211a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeLinear(pts, colors, nullptr, SK_ARRAY_COUNT(colors),
221a9b9640843a64af8d9d90337ec3b3fea663196areed                                        SkShader::kClamp_TileMode);
23db873d8677a2d4ecfe38a794a5d868301bdeeabereed}
24a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_bm0(SkBitmap* bm) {
25a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    int W = 120;
26a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    int H = 120;
27eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    bm->allocN32Pixels(W, H);
28dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    bm->eraseColor(SK_ColorTRANSPARENT);
29d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
30a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkCanvas canvas(*bm);
31a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkPaint paint;
321a9b9640843a64af8d9d90337ec3b3fea663196areed    paint.setShader(make_shader0(W, H));
33db873d8677a2d4ecfe38a794a5d868301bdeeabereed    canvas.drawPaint(paint);
34db873d8677a2d4ecfe38a794a5d868301bdeeabereed}
351a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> make_shader1(int w, int h) {
36db873d8677a2d4ecfe38a794a5d868301bdeeabereed    SkScalar cx = SkIntToScalar(w)/2;
37db873d8677a2d4ecfe38a794a5d868301bdeeabereed    SkScalar cy = SkIntToScalar(h)/2;
38a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkColor colors[] = {
39db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE,
40a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    };
411a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeRadial(SkPoint::Make(cx, cy), cx, colors, nullptr,
421a9b9640843a64af8d9d90337ec3b3fea663196areed                                        SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode);
43a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
44a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_bm1(SkBitmap* bm) {
45a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    int W = 120;
46a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    int H = 120;
47db873d8677a2d4ecfe38a794a5d868301bdeeabereed    SkScalar cx = SkIntToScalar(W)/2;
48db873d8677a2d4ecfe38a794a5d868301bdeeabereed    SkScalar cy = SkIntToScalar(H)/2;
49eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    bm->allocN32Pixels(W, H);
50dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    bm->eraseColor(SK_ColorTRANSPARENT);
51d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
52a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkCanvas canvas(*bm);
53a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkPaint paint;
541a9b9640843a64af8d9d90337ec3b3fea663196areed    paint.setShader(make_shader1(W, H));
55a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    paint.setAntiAlias(true);
56a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    canvas.drawCircle(cx, cy, cx, paint);
57a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
58a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
59a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_table0(uint8_t table[]) {
60a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    for (int i = 0; i < 256; ++i) {
61a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        int n = i >> 5;
62a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        table[i] = (n << 5) | (n << 2) | (n >> 1);
63a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
64a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
65a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_table1(uint8_t table[]) {
66a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    for (int i = 0; i < 256; ++i) {
67a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        table[i] = i * i / 255;
68a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
69a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
70a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_table2(uint8_t table[]) {
71a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    for (int i = 0; i < 256; ++i) {
72a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        float fi = i / 255.0f;
736853e808a464ca75ff1328338d1eb55ff27c4337robertphillips@google.com        table[i] = static_cast<uint8_t>(sqrtf(fi) * 255);
74a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
75a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
76a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
77d053ce9c54d4e5937a142278359e5a4cde18095ereedstatic sk_sp<SkColorFilter> make_null_cf() {
7896fcdcc219d2a0d3579719b84b28bede76efba64halcanary    return nullptr;
79c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez}
80c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
81d053ce9c54d4e5937a142278359e5a4cde18095ereedstatic sk_sp<SkColorFilter> make_cf0() {
82a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table[256]; make_table0(table);
83d053ce9c54d4e5937a142278359e5a4cde18095ereed    return SkTableColorFilter::Make(table);
84a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
85d053ce9c54d4e5937a142278359e5a4cde18095ereedstatic sk_sp<SkColorFilter> make_cf1() {
86a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table[256]; make_table1(table);
87d053ce9c54d4e5937a142278359e5a4cde18095ereed    return SkTableColorFilter::Make(table);
88a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
89d053ce9c54d4e5937a142278359e5a4cde18095ereedstatic sk_sp<SkColorFilter> make_cf2() {
90a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table[256]; make_table2(table);
91d053ce9c54d4e5937a142278359e5a4cde18095ereed    return SkTableColorFilter::Make(table);
92a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
93d053ce9c54d4e5937a142278359e5a4cde18095ereedstatic sk_sp<SkColorFilter> make_cf3() {
94a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table0[256]; make_table0(table0);
95a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table1[256]; make_table1(table1);
96a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table2[256]; make_table2(table2);
97d053ce9c54d4e5937a142278359e5a4cde18095ereed    return SkTableColorFilter::MakeARGB(nullptr, table0, table1, table2);
98a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
99a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
100a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgclass TableColorFilterGM : public skiagm::GM {
101a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgpublic:
102a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    TableColorFilterGM() {}
103d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
104a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgprotected:
105a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    virtual SkString onShortName() {
106a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        return SkString("tablecolorfilter");
107a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
108d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
109a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    virtual SkISize onISize() {
110c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        return SkISize::Make(700, 1650);
111a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
112d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
113a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    virtual void onDraw(SkCanvas* canvas) {
114125960152dfd7f2aba4c2239131bdf75d9ac2705caryclark        canvas->drawColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
115a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        canvas->translate(20, 20);
116d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
117d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
118d053ce9c54d4e5937a142278359e5a4cde18095ereed        static sk_sp<SkColorFilter> (*gColorFilterMakers[])() = {
119d053ce9c54d4e5937a142278359e5a4cde18095ereed            make_null_cf, make_cf0, make_cf1, make_cf2, make_cf3
120d053ce9c54d4e5937a142278359e5a4cde18095ereed        };
121c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        static void (*gBitmapMakers[])(SkBitmap*) = { make_bm0, make_bm1 };
122c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
123c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        // This test will be done once for each bitmap with the results stacked vertically.
124c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        // For a single bitmap the resulting image will be the following:
125c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  - A first line with the original bitmap, followed by the image drawn once
126c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  with each of the N color filters
127c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  - N lines of the bitmap drawn N times, this will cover all N*N combinations of
128c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  pair of color filters in order to test the collpsing of consecutive table
129c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  color filters.
130c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //
131c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  Here is a graphical representation of the result for 2 bitmaps and 2 filters
132c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  with the number corresponding to the number of filters the bitmap goes through:
133c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //
134c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  --bitmap1
135c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  011
136c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  22
137c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  22
138c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  --bitmap2
139c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  011
140c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  22
141c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  22
142c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
143c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        SkScalar x = 0, y = 0;
144c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        for (size_t bitmapMaker = 0; bitmapMaker < SK_ARRAY_COUNT(gBitmapMakers); ++bitmapMaker) {
145a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            SkBitmap bm;
146c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            gBitmapMakers[bitmapMaker](&bm);
147d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
148c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            SkScalar xOffset = SkScalar(bm.width() * 9 / 8);
149c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            SkScalar yOffset = SkScalar(bm.height() * 9 / 8);
150c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
151c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            // Draw the first element of the first line
152a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            x = 0;
153c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            SkPaint paint;
154a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            canvas->drawBitmap(bm, x, y, &paint);
155d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
156c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            // Draws the rest of the first line for this bitmap
157c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            // each draw being at xOffset of the previous one
158c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            for (unsigned i = 1; i < SK_ARRAY_COUNT(gColorFilterMakers); ++i) {
159c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                x += xOffset;
160d053ce9c54d4e5937a142278359e5a4cde18095ereed                paint.setColorFilter(gColorFilterMakers[i]());
161c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                canvas->drawBitmap(bm, x, y, &paint);
162c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            }
163c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
16496fcdcc219d2a0d3579719b84b28bede76efba64halcanary            paint.setColorFilter(nullptr);
165c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
166c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            for (unsigned i = 0; i < SK_ARRAY_COUNT(gColorFilterMakers); ++i) {
1675605b56afa5bd89f3148b397318b616fccfd4004robertphillips                sk_sp<SkColorFilter> colorFilter1(gColorFilterMakers[i]());
1685605b56afa5bd89f3148b397318b616fccfd4004robertphillips                sk_sp<SkImageFilter> imageFilter1(SkColorFilterImageFilter::Make(
1695605b56afa5bd89f3148b397318b616fccfd4004robertphillips                            std::move(colorFilter1), nullptr));
170c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
171c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                // Move down to the next line and draw it
172c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                // each draw being at xOffset of the previous one
173c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                y += yOffset;
174c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                x = 0;
175c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                for (unsigned j = 1; j < SK_ARRAY_COUNT(gColorFilterMakers); ++j) {
1765605b56afa5bd89f3148b397318b616fccfd4004robertphillips                    sk_sp<SkColorFilter> colorFilter2(gColorFilterMakers[j]());
1775605b56afa5bd89f3148b397318b616fccfd4004robertphillips                    sk_sp<SkImageFilter> imageFilter2(SkColorFilterImageFilter::Make(
1785605b56afa5bd89f3148b397318b616fccfd4004robertphillips                                std::move(colorFilter2), imageFilter1, nullptr));
1795605b56afa5bd89f3148b397318b616fccfd4004robertphillips                    paint.setImageFilter(std::move(imageFilter2));
180c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                    canvas->drawBitmap(bm, x, y, &paint);
181c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                    x += xOffset;
182c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                }
183c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            }
184c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
185c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            // Move down one line to the beginning of the block for next bitmap
186c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            y += yOffset;
187a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        }
188a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
189d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
190a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgprivate:
191a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    typedef GM INHERITED;
192a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org};
193db873d8677a2d4ecfe38a794a5d868301bdeeabereedDEF_GM( return new TableColorFilterGM; )
194a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
195a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org//////////////////////////////////////////////////////////////////////////////
196a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
197db873d8677a2d4ecfe38a794a5d868301bdeeabereedclass ComposeColorFilterGM : public skiagm::GM {
198cff10b21a9934afc540d121b493b204335829589reed    enum {
199cff10b21a9934afc540d121b493b204335829589reed        COLOR_COUNT = 3,
200cff10b21a9934afc540d121b493b204335829589reed        MODE_COUNT = 4,
201cff10b21a9934afc540d121b493b204335829589reed    };
2027d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    const SkColor*      fColors;
2037d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    const SkBlendMode*  fModes;
2047d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    SkString            fName;
205cff10b21a9934afc540d121b493b204335829589reed
206db873d8677a2d4ecfe38a794a5d868301bdeeabereedpublic:
2077d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    ComposeColorFilterGM(const SkColor colors[], const SkBlendMode modes[],
208cff10b21a9934afc540d121b493b204335829589reed                         const char suffix[])
209cff10b21a9934afc540d121b493b204335829589reed        : fColors(colors), fModes(modes)
210cff10b21a9934afc540d121b493b204335829589reed    {
211cff10b21a9934afc540d121b493b204335829589reed        fName.printf("colorcomposefilter_%s", suffix);
212cff10b21a9934afc540d121b493b204335829589reed    }
2139d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary
214db873d8677a2d4ecfe38a794a5d868301bdeeabereedprotected:
215db873d8677a2d4ecfe38a794a5d868301bdeeabereed    virtual SkString onShortName() {
216cff10b21a9934afc540d121b493b204335829589reed        return fName;
217db873d8677a2d4ecfe38a794a5d868301bdeeabereed    }
2189d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary
219db873d8677a2d4ecfe38a794a5d868301bdeeabereed    virtual SkISize onISize() {
220cff10b21a9934afc540d121b493b204335829589reed        return SkISize::Make(790, 790);
221db873d8677a2d4ecfe38a794a5d868301bdeeabereed    }
222db873d8677a2d4ecfe38a794a5d868301bdeeabereed
223db873d8677a2d4ecfe38a794a5d868301bdeeabereed    virtual void onDraw(SkCanvas* canvas) {
224db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SkBitmap bm;
225db873d8677a2d4ecfe38a794a5d868301bdeeabereed        make_bm1(&bm);
226db873d8677a2d4ecfe38a794a5d868301bdeeabereed
227125960152dfd7f2aba4c2239131bdf75d9ac2705caryclark        canvas->drawColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
228db873d8677a2d4ecfe38a794a5d868301bdeeabereed
229cff10b21a9934afc540d121b493b204335829589reed        const int MODES = MODE_COUNT * COLOR_COUNT;
230d053ce9c54d4e5937a142278359e5a4cde18095ereed        sk_sp<SkColorFilter> filters[MODES];
231db873d8677a2d4ecfe38a794a5d868301bdeeabereed        int index = 0;
232cff10b21a9934afc540d121b493b204335829589reed        for (int i = 0; i < MODE_COUNT; ++i) {
233cff10b21a9934afc540d121b493b204335829589reed            for (int j = 0; j < COLOR_COUNT; ++j) {
234d053ce9c54d4e5937a142278359e5a4cde18095ereed                filters[index++] = SkColorFilter::MakeModeFilter(fColors[j], fModes[i]);
235db873d8677a2d4ecfe38a794a5d868301bdeeabereed            }
236db873d8677a2d4ecfe38a794a5d868301bdeeabereed        }
237db873d8677a2d4ecfe38a794a5d868301bdeeabereed
238db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SkPaint paint;
2391a9b9640843a64af8d9d90337ec3b3fea663196areed        paint.setShader(make_shader1(50, 50));
240db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SkRect r = SkRect::MakeWH(50, 50);
241db873d8677a2d4ecfe38a794a5d868301bdeeabereed        const SkScalar spacer = 10;
242db873d8677a2d4ecfe38a794a5d868301bdeeabereed
243db873d8677a2d4ecfe38a794a5d868301bdeeabereed        canvas->translate(spacer, spacer);
244db873d8677a2d4ecfe38a794a5d868301bdeeabereed
245cff10b21a9934afc540d121b493b204335829589reed        canvas->drawRect(r, paint); // orig
246cff10b21a9934afc540d121b493b204335829589reed
247cff10b21a9934afc540d121b493b204335829589reed        for (int i = 0; i < MODES; ++i) {
248cff10b21a9934afc540d121b493b204335829589reed            paint.setColorFilter(filters[i]);
249cff10b21a9934afc540d121b493b204335829589reed
250cff10b21a9934afc540d121b493b204335829589reed            canvas->save();
251cff10b21a9934afc540d121b493b204335829589reed            canvas->translate((i + 1) * (r.width() + spacer), 0);
252cff10b21a9934afc540d121b493b204335829589reed            canvas->drawRect(r, paint);
253cff10b21a9934afc540d121b493b204335829589reed            canvas->restore();
254cff10b21a9934afc540d121b493b204335829589reed
255cff10b21a9934afc540d121b493b204335829589reed            canvas->save();
256cff10b21a9934afc540d121b493b204335829589reed            canvas->translate(0, (i + 1) * (r.width() + spacer));
257cff10b21a9934afc540d121b493b204335829589reed            canvas->drawRect(r, paint);
258cff10b21a9934afc540d121b493b204335829589reed            canvas->restore();
259cff10b21a9934afc540d121b493b204335829589reed        }
260cff10b21a9934afc540d121b493b204335829589reed
261cff10b21a9934afc540d121b493b204335829589reed        canvas->translate(r.width() + spacer, r.width() + spacer);
262cff10b21a9934afc540d121b493b204335829589reed
263cff10b21a9934afc540d121b493b204335829589reed        for (int y = 0; y < MODES; ++y) {
264db873d8677a2d4ecfe38a794a5d868301bdeeabereed            canvas->save();
265cff10b21a9934afc540d121b493b204335829589reed            for (int x = 0; x < MODES; ++x) {
26619d7bd65045e88724ad59a8d7066a9092754c7e4Mike Reed                paint.setColorFilter(filters[y]->makeComposed(filters[x]));
267db873d8677a2d4ecfe38a794a5d868301bdeeabereed                canvas->drawRect(r, paint);
268db873d8677a2d4ecfe38a794a5d868301bdeeabereed                canvas->translate(r.width() + spacer, 0);
269db873d8677a2d4ecfe38a794a5d868301bdeeabereed            }
270db873d8677a2d4ecfe38a794a5d868301bdeeabereed            canvas->restore();
271db873d8677a2d4ecfe38a794a5d868301bdeeabereed            canvas->translate(0, r.height() + spacer);
272db873d8677a2d4ecfe38a794a5d868301bdeeabereed        }
273db873d8677a2d4ecfe38a794a5d868301bdeeabereed    }
2749d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary
275db873d8677a2d4ecfe38a794a5d868301bdeeabereedprivate:
276db873d8677a2d4ecfe38a794a5d868301bdeeabereed    typedef GM INHERITED;
277db873d8677a2d4ecfe38a794a5d868301bdeeabereed};
278db873d8677a2d4ecfe38a794a5d868301bdeeabereed
279cff10b21a9934afc540d121b493b204335829589reedconst SkColor gColors0[] = { SK_ColorCYAN, SK_ColorMAGENTA, SK_ColorYELLOW };
2807d954ad797176afedb9262fdea4507d0fc60eb9dMike Reedconst SkBlendMode gModes0[] = {
2817d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    SkBlendMode::kOverlay,
2827d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    SkBlendMode::kDarken,
2837d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    SkBlendMode::kColorBurn,
2847d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    SkBlendMode::kExclusion,
285cff10b21a9934afc540d121b493b204335829589reed};
286cff10b21a9934afc540d121b493b204335829589reedDEF_GM( return new ComposeColorFilterGM(gColors0, gModes0, "wacky"); )
287cff10b21a9934afc540d121b493b204335829589reed
288cff10b21a9934afc540d121b493b204335829589reedconst SkColor gColors1[] = { 0x80FF0000, 0x8000FF00, 0x800000FF };
2897d954ad797176afedb9262fdea4507d0fc60eb9dMike Reedconst SkBlendMode gModes1[] = {
2907d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    SkBlendMode::kSrcOver,
2917d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    SkBlendMode::kXor,
2927d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    SkBlendMode::kDstOut,
2937d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    SkBlendMode::kSrcATop,
294cff10b21a9934afc540d121b493b204335829589reed};
295cff10b21a9934afc540d121b493b204335829589reedDEF_GM( return new ComposeColorFilterGM(gColors1, gModes1, "alpha"); )
296