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"
9a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkCanvas.h"
10c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez#include "SkColorFilterImageFilter.h"
11a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkGradientShader.h"
12a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkTableColorFilter.h"
13a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
14db873d8677a2d4ecfe38a794a5d868301bdeeabereedstatic SkShader* make_shader0(int w, int h) {
15db873d8677a2d4ecfe38a794a5d868301bdeeabereed    SkPoint pts[] = { {0, 0}, {SkIntToScalar(w), SkIntToScalar(h)} };
16db873d8677a2d4ecfe38a794a5d868301bdeeabereed    SkColor colors[] = {
17db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SK_ColorBLACK, SK_ColorGREEN, SK_ColorCYAN,
18db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SK_ColorRED, 0, SK_ColorBLUE, SK_ColorWHITE
19db873d8677a2d4ecfe38a794a5d868301bdeeabereed    };
20db873d8677a2d4ecfe38a794a5d868301bdeeabereed    return SkGradientShader::CreateLinear(pts, colors, NULL, SK_ARRAY_COUNT(colors),
21db873d8677a2d4ecfe38a794a5d868301bdeeabereed                                          SkShader::kClamp_TileMode);
22db873d8677a2d4ecfe38a794a5d868301bdeeabereed}
23a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_bm0(SkBitmap* bm) {
24a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    int W = 120;
25a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    int H = 120;
26eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    bm->allocN32Pixels(W, H);
27dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    bm->eraseColor(SK_ColorTRANSPARENT);
28d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
29a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkCanvas canvas(*bm);
30a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkPaint paint;
31db873d8677a2d4ecfe38a794a5d868301bdeeabereed    paint.setShader(make_shader0(W, H))->unref();
32db873d8677a2d4ecfe38a794a5d868301bdeeabereed    canvas.drawPaint(paint);
33db873d8677a2d4ecfe38a794a5d868301bdeeabereed}
34db873d8677a2d4ecfe38a794a5d868301bdeeabereedstatic SkShader* make_shader1(int w, int h) {
35db873d8677a2d4ecfe38a794a5d868301bdeeabereed    SkScalar cx = SkIntToScalar(w)/2;
36db873d8677a2d4ecfe38a794a5d868301bdeeabereed    SkScalar cy = SkIntToScalar(h)/2;
37a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkColor colors[] = {
38db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE,
39a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    };
40db873d8677a2d4ecfe38a794a5d868301bdeeabereed    return SkGradientShader::CreateRadial(SkPoint::Make(cx, cy), cx, colors, NULL,
41db873d8677a2d4ecfe38a794a5d868301bdeeabereed                                          SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode);
42a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
43a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_bm1(SkBitmap* bm) {
44a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    int W = 120;
45a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    int H = 120;
46db873d8677a2d4ecfe38a794a5d868301bdeeabereed    SkScalar cx = SkIntToScalar(W)/2;
47db873d8677a2d4ecfe38a794a5d868301bdeeabereed    SkScalar cy = SkIntToScalar(H)/2;
48eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    bm->allocN32Pixels(W, H);
49dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    bm->eraseColor(SK_ColorTRANSPARENT);
50d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
51a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkCanvas canvas(*bm);
52a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkPaint paint;
53db873d8677a2d4ecfe38a794a5d868301bdeeabereed    paint.setShader(make_shader1(W, H))->unref();
54a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    paint.setAntiAlias(true);
55a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    canvas.drawCircle(cx, cy, cx, paint);
56a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
57a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
58a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_table0(uint8_t table[]) {
59a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    for (int i = 0; i < 256; ++i) {
60a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        int n = i >> 5;
61a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        table[i] = (n << 5) | (n << 2) | (n >> 1);
62a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
63a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
64a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_table1(uint8_t table[]) {
65a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    for (int i = 0; i < 256; ++i) {
66a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        table[i] = i * i / 255;
67a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
68a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
69a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_table2(uint8_t table[]) {
70a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    for (int i = 0; i < 256; ++i) {
71a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        float fi = i / 255.0f;
726853e808a464ca75ff1328338d1eb55ff27c4337robertphillips@google.com        table[i] = static_cast<uint8_t>(sqrtf(fi) * 255);
73a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
74a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
75a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
76c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallezstatic SkColorFilter* make_null_cf() {
77c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez    return NULL;
78c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez}
79c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
80a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic SkColorFilter* make_cf0() {
81a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table[256]; make_table0(table);
82a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    return SkTableColorFilter::Create(table);
83a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
84a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic SkColorFilter* make_cf1() {
85a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table[256]; make_table1(table);
86a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    return SkTableColorFilter::Create(table);
87a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
88a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic SkColorFilter* make_cf2() {
89a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table[256]; make_table2(table);
90a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    return SkTableColorFilter::Create(table);
91a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
92a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic SkColorFilter* make_cf3() {
93a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table0[256]; make_table0(table0);
94a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table1[256]; make_table1(table1);
95a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table2[256]; make_table2(table2);
96a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    return SkTableColorFilter::CreateARGB(NULL, table0, table1, table2);
97a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
98a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
99a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgclass TableColorFilterGM : public skiagm::GM {
100a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgpublic:
101a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    TableColorFilterGM() {}
102d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
103a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgprotected:
104a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    virtual SkString onShortName() {
105a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        return SkString("tablecolorfilter");
106a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
107d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
108a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    virtual SkISize onISize() {
109c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        return SkISize::Make(700, 1650);
110a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
111d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
112a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    virtual void onDraw(SkCanvas* canvas) {
113a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        canvas->drawColor(0xFFDDDDDD);
114a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        canvas->translate(20, 20);
115d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
116d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
117c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        static SkColorFilter* (*gColorFilterMakers[])() = { make_null_cf, make_cf0, make_cf1,
118c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                                                 make_cf2, make_cf3 };
119c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        static void (*gBitmapMakers[])(SkBitmap*) = { make_bm0, make_bm1 };
120c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
121c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        // This test will be done once for each bitmap with the results stacked vertically.
122c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        // For a single bitmap the resulting image will be the following:
123c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  - A first line with the original bitmap, followed by the image drawn once
124c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  with each of the N color filters
125c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  - N lines of the bitmap drawn N times, this will cover all N*N combinations of
126c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  pair of color filters in order to test the collpsing of consecutive table
127c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  color filters.
128c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //
129c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  Here is a graphical representation of the result for 2 bitmaps and 2 filters
130c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  with the number corresponding to the number of filters the bitmap goes through:
131c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //
132c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  --bitmap1
133c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  011
134c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  22
135c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  22
136c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  --bitmap2
137c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  011
138c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  22
139c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        //  22
140c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
141c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        SkScalar x = 0, y = 0;
142c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez        for (size_t bitmapMaker = 0; bitmapMaker < SK_ARRAY_COUNT(gBitmapMakers); ++bitmapMaker) {
143a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            SkBitmap bm;
144c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            gBitmapMakers[bitmapMaker](&bm);
145d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
146c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            SkScalar xOffset = SkScalar(bm.width() * 9 / 8);
147c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            SkScalar yOffset = SkScalar(bm.height() * 9 / 8);
148c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
149c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            // Draw the first element of the first line
150a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            x = 0;
151c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            SkPaint paint;
152a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            canvas->drawBitmap(bm, x, y, &paint);
153d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
154c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            // Draws the rest of the first line for this bitmap
155c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            // each draw being at xOffset of the previous one
156c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            for (unsigned i = 1; i < SK_ARRAY_COUNT(gColorFilterMakers); ++i) {
157c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                x += xOffset;
158c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                paint.setColorFilter(gColorFilterMakers[i]())->unref();
159c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                canvas->drawBitmap(bm, x, y, &paint);
160c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            }
161c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
162c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            paint.setColorFilter(NULL);
163c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
164c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            for (unsigned i = 0; i < SK_ARRAY_COUNT(gColorFilterMakers); ++i) {
165c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                SkAutoTUnref<SkColorFilter> colorFilter1(gColorFilterMakers[i]());
166c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                SkAutoTUnref<SkImageFilter> imageFilter1(SkColorFilterImageFilter::Create(
16724e06d5244ae96e440410e1d76e039983b2efac9senorblanco                            colorFilter1, NULL, NULL));
168c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
169c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                // Move down to the next line and draw it
170c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                // each draw being at xOffset of the previous one
171c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                y += yOffset;
172c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                x = 0;
173c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                for (unsigned j = 1; j < SK_ARRAY_COUNT(gColorFilterMakers); ++j) {
174c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                    SkAutoTUnref<SkColorFilter> colorFilter2(gColorFilterMakers[j]());
175c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                    SkAutoTUnref<SkImageFilter> imageFilter2(SkColorFilterImageFilter::Create(
17624e06d5244ae96e440410e1d76e039983b2efac9senorblanco                                colorFilter2, imageFilter1, NULL));
177c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                    paint.setImageFilter(imageFilter2);
178c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                    canvas->drawBitmap(bm, x, y, &paint);
179c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                    x += xOffset;
180c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez                }
181c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            }
182c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez
183c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            // Move down one line to the beginning of the block for next bitmap
184c12b74dc413ef024b13e0ed478491c4b1bafe6b1cwallez            y += yOffset;
185a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        }
186a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
187d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
188a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgprivate:
189a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    typedef GM INHERITED;
190a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org};
191db873d8677a2d4ecfe38a794a5d868301bdeeabereedDEF_GM( return new TableColorFilterGM; )
192a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
193a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org//////////////////////////////////////////////////////////////////////////////
194a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
195db873d8677a2d4ecfe38a794a5d868301bdeeabereedclass ComposeColorFilterGM : public skiagm::GM {
196cff10b21a9934afc540d121b493b204335829589reed    enum {
197cff10b21a9934afc540d121b493b204335829589reed        COLOR_COUNT = 3,
198cff10b21a9934afc540d121b493b204335829589reed        MODE_COUNT = 4,
199cff10b21a9934afc540d121b493b204335829589reed    };
200cff10b21a9934afc540d121b493b204335829589reed    const SkColor*          fColors;
201cff10b21a9934afc540d121b493b204335829589reed    const SkXfermode::Mode* fModes;
202cff10b21a9934afc540d121b493b204335829589reed    SkString                fName;
203cff10b21a9934afc540d121b493b204335829589reed
204db873d8677a2d4ecfe38a794a5d868301bdeeabereedpublic:
205cff10b21a9934afc540d121b493b204335829589reed    ComposeColorFilterGM(const SkColor colors[], const SkXfermode::Mode modes[],
206cff10b21a9934afc540d121b493b204335829589reed                         const char suffix[])
207cff10b21a9934afc540d121b493b204335829589reed        : fColors(colors), fModes(modes)
208cff10b21a9934afc540d121b493b204335829589reed    {
209cff10b21a9934afc540d121b493b204335829589reed        fName.printf("colorcomposefilter_%s", suffix);
210cff10b21a9934afc540d121b493b204335829589reed    }
211db873d8677a2d4ecfe38a794a5d868301bdeeabereed
212db873d8677a2d4ecfe38a794a5d868301bdeeabereedprotected:
213db873d8677a2d4ecfe38a794a5d868301bdeeabereed    virtual SkString onShortName() {
214cff10b21a9934afc540d121b493b204335829589reed        return fName;
215db873d8677a2d4ecfe38a794a5d868301bdeeabereed    }
216db873d8677a2d4ecfe38a794a5d868301bdeeabereed
217db873d8677a2d4ecfe38a794a5d868301bdeeabereed    virtual SkISize onISize() {
218cff10b21a9934afc540d121b493b204335829589reed        return SkISize::Make(790, 790);
219db873d8677a2d4ecfe38a794a5d868301bdeeabereed    }
220db873d8677a2d4ecfe38a794a5d868301bdeeabereed
221db873d8677a2d4ecfe38a794a5d868301bdeeabereed    virtual void onDraw(SkCanvas* canvas) {
222db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SkBitmap bm;
223db873d8677a2d4ecfe38a794a5d868301bdeeabereed        make_bm1(&bm);
224db873d8677a2d4ecfe38a794a5d868301bdeeabereed
225db873d8677a2d4ecfe38a794a5d868301bdeeabereed        canvas->drawColor(0xFFDDDDDD);
226db873d8677a2d4ecfe38a794a5d868301bdeeabereed
227cff10b21a9934afc540d121b493b204335829589reed        const int MODES = MODE_COUNT * COLOR_COUNT;
228db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SkAutoTUnref<SkColorFilter> filters[MODES];
229db873d8677a2d4ecfe38a794a5d868301bdeeabereed        int index = 0;
230cff10b21a9934afc540d121b493b204335829589reed        for (int i = 0; i < MODE_COUNT; ++i) {
231cff10b21a9934afc540d121b493b204335829589reed            for (int j = 0; j < COLOR_COUNT; ++j) {
232cff10b21a9934afc540d121b493b204335829589reed                filters[index++].reset(SkColorFilter::CreateModeFilter(fColors[j], fModes[i]));
233db873d8677a2d4ecfe38a794a5d868301bdeeabereed            }
234db873d8677a2d4ecfe38a794a5d868301bdeeabereed        }
235db873d8677a2d4ecfe38a794a5d868301bdeeabereed
236db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SkPaint paint;
237db873d8677a2d4ecfe38a794a5d868301bdeeabereed        paint.setShader(make_shader1(50, 50))->unref();
238db873d8677a2d4ecfe38a794a5d868301bdeeabereed        SkRect r = SkRect::MakeWH(50, 50);
239db873d8677a2d4ecfe38a794a5d868301bdeeabereed        const SkScalar spacer = 10;
240db873d8677a2d4ecfe38a794a5d868301bdeeabereed
241db873d8677a2d4ecfe38a794a5d868301bdeeabereed        canvas->translate(spacer, spacer);
242db873d8677a2d4ecfe38a794a5d868301bdeeabereed
243cff10b21a9934afc540d121b493b204335829589reed        canvas->drawRect(r, paint); // orig
244cff10b21a9934afc540d121b493b204335829589reed
245cff10b21a9934afc540d121b493b204335829589reed        for (int i = 0; i < MODES; ++i) {
246cff10b21a9934afc540d121b493b204335829589reed            paint.setColorFilter(filters[i]);
247cff10b21a9934afc540d121b493b204335829589reed
248cff10b21a9934afc540d121b493b204335829589reed            canvas->save();
249cff10b21a9934afc540d121b493b204335829589reed            canvas->translate((i + 1) * (r.width() + spacer), 0);
250cff10b21a9934afc540d121b493b204335829589reed            canvas->drawRect(r, paint);
251cff10b21a9934afc540d121b493b204335829589reed            canvas->restore();
252cff10b21a9934afc540d121b493b204335829589reed
253cff10b21a9934afc540d121b493b204335829589reed            canvas->save();
254cff10b21a9934afc540d121b493b204335829589reed            canvas->translate(0, (i + 1) * (r.width() + spacer));
255cff10b21a9934afc540d121b493b204335829589reed            canvas->drawRect(r, paint);
256cff10b21a9934afc540d121b493b204335829589reed            canvas->restore();
257cff10b21a9934afc540d121b493b204335829589reed        }
258cff10b21a9934afc540d121b493b204335829589reed
259cff10b21a9934afc540d121b493b204335829589reed        canvas->translate(r.width() + spacer, r.width() + spacer);
260cff10b21a9934afc540d121b493b204335829589reed
261cff10b21a9934afc540d121b493b204335829589reed        for (int y = 0; y < MODES; ++y) {
262db873d8677a2d4ecfe38a794a5d868301bdeeabereed            canvas->save();
263cff10b21a9934afc540d121b493b204335829589reed            for (int x = 0; x < MODES; ++x) {
264db873d8677a2d4ecfe38a794a5d868301bdeeabereed                SkAutoTUnref<SkColorFilter> compose(SkColorFilter::CreateComposeFilter(filters[y],
265db873d8677a2d4ecfe38a794a5d868301bdeeabereed                                                                                       filters[x]));
266db873d8677a2d4ecfe38a794a5d868301bdeeabereed                paint.setColorFilter(compose);
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    }
274db873d8677a2d4ecfe38a794a5d868301bdeeabereed
275db873d8677a2d4ecfe38a794a5d868301bdeeabereedprivate:
276db873d8677a2d4ecfe38a794a5d868301bdeeabereed    typedef GM INHERITED;
277db873d8677a2d4ecfe38a794a5d868301bdeeabereed};
278db873d8677a2d4ecfe38a794a5d868301bdeeabereed
279cff10b21a9934afc540d121b493b204335829589reedconst SkColor gColors0[] = { SK_ColorCYAN, SK_ColorMAGENTA, SK_ColorYELLOW };
280cff10b21a9934afc540d121b493b204335829589reedconst SkXfermode::Mode gModes0[] = {
281cff10b21a9934afc540d121b493b204335829589reed    SkXfermode::kOverlay_Mode,
282cff10b21a9934afc540d121b493b204335829589reed    SkXfermode::kDarken_Mode,
283cff10b21a9934afc540d121b493b204335829589reed    SkXfermode::kColorBurn_Mode,
284cff10b21a9934afc540d121b493b204335829589reed    SkXfermode::kExclusion_Mode,
285cff10b21a9934afc540d121b493b204335829589reed};
286cff10b21a9934afc540d121b493b204335829589reedDEF_GM( return new ComposeColorFilterGM(gColors0, gModes0, "wacky"); )
287cff10b21a9934afc540d121b493b204335829589reed
288cff10b21a9934afc540d121b493b204335829589reedconst SkColor gColors1[] = { 0x80FF0000, 0x8000FF00, 0x800000FF };
289cff10b21a9934afc540d121b493b204335829589reedconst SkXfermode::Mode gModes1[] = {
290cff10b21a9934afc540d121b493b204335829589reed    SkXfermode::kSrcOver_Mode,
291cff10b21a9934afc540d121b493b204335829589reed    SkXfermode::kXor_Mode,
292cff10b21a9934afc540d121b493b204335829589reed    SkXfermode::kDstOut_Mode,
293cff10b21a9934afc540d121b493b204335829589reed    SkXfermode::kSrcATop_Mode,
294cff10b21a9934afc540d121b493b204335829589reed};
295cff10b21a9934afc540d121b493b204335829589reedDEF_GM( return new ComposeColorFilterGM(gColors1, gModes1, "alpha"); )
296