tablecolorfilter.cpp revision dbfac8a72393eaf01670aeb3244de0e18d8faf98
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"
10a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkGradientShader.h"
11a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org#include "SkTableColorFilter.h"
12a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
13a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_bm0(SkBitmap* bm) {
14a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    int W = 120;
15a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    int H = 120;
16a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    bm->setConfig(SkBitmap::kARGB_8888_Config, W, H);
17a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    bm->allocPixels();
18dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    bm->eraseColor(SK_ColorTRANSPARENT);
19d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
20a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkCanvas canvas(*bm);
21a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkPaint paint;
22cadbcb8e536f89babb4e165bfdca18384e97d582bsalomon@google.com    SkPoint pts[] = { {0, 0}, {SkIntToScalar(W), SkIntToScalar(H)} };
23a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkColor colors[] = {
24a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        SK_ColorBLACK, SK_ColorGREEN, SK_ColorCYAN,
25a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        SK_ColorRED, 0, SK_ColorBLUE, SK_ColorWHITE
26a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    };
27a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, SK_ARRAY_COUNT(colors),
28a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org                                                 SkShader::kClamp_TileMode);
29a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    paint.setShader(s)->unref();
30a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    canvas.drawPaint(paint);
31a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
32a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_bm1(SkBitmap* bm) {
33a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    int W = 120;
34a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    int H = 120;
35a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    bm->setConfig(SkBitmap::kARGB_8888_Config, W, H);
36a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    bm->allocPixels();
37dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com    bm->eraseColor(SK_ColorTRANSPARENT);
38d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
39a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkCanvas canvas(*bm);
40a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkPaint paint;
41a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkScalar cx = SkIntToScalar(W)/2;
42a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkScalar cy = SkIntToScalar(H)/2;
43a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkColor colors[] = {
44a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE,
45a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    };
46a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    SkShader* s = SkGradientShader::CreateRadial(SkPoint::Make(SkIntToScalar(W)/2,
47a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org                                                               SkIntToScalar(H)/2),
48a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org                                                 SkIntToScalar(W)/2, colors, NULL, SK_ARRAY_COUNT(colors),
49a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org                                                 SkShader::kClamp_TileMode);
50a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    paint.setShader(s)->unref();
51a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    paint.setAntiAlias(true);
52a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    canvas.drawCircle(cx, cy, cx, paint);
53a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
54a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
55a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_table0(uint8_t table[]) {
56a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    for (int i = 0; i < 256; ++i) {
57a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        int n = i >> 5;
58a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        table[i] = (n << 5) | (n << 2) | (n >> 1);
59a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
60a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
61a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_table1(uint8_t table[]) {
62a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    for (int i = 0; i < 256; ++i) {
63a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        table[i] = i * i / 255;
64a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
65a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
66a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic void make_table2(uint8_t table[]) {
67a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    for (int i = 0; i < 256; ++i) {
68a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        float fi = i / 255.0f;
696853e808a464ca75ff1328338d1eb55ff27c4337robertphillips@google.com        table[i] = static_cast<uint8_t>(sqrtf(fi) * 255);
70a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
71a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
72a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
73a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic SkColorFilter* make_cf0() {
74a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table[256]; make_table0(table);
75a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    return SkTableColorFilter::Create(table);
76a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
77a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic SkColorFilter* make_cf1() {
78a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table[256]; make_table1(table);
79a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    return SkTableColorFilter::Create(table);
80a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
81a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic SkColorFilter* make_cf2() {
82a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table[256]; make_table2(table);
83a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    return SkTableColorFilter::Create(table);
84a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
85a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic SkColorFilter* make_cf3() {
86a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table0[256]; make_table0(table0);
87a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table1[256]; make_table1(table1);
88a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    uint8_t table2[256]; make_table2(table2);
89a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    return SkTableColorFilter::CreateARGB(NULL, table0, table1, table2);
90a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org}
91a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
92a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgclass TableColorFilterGM : public skiagm::GM {
93a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgpublic:
94a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    TableColorFilterGM() {}
95d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
96a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgprotected:
97a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    virtual SkString onShortName() {
98a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        return SkString("tablecolorfilter");
99a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
100d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
101a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    virtual SkISize onISize() {
1026b2f7ea7f470bd50dc69d331097a647ec03f8070reed@google.com        return SkISize::Make(700, 300);
103a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
104d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
105a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    virtual void onDraw(SkCanvas* canvas) {
106a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        canvas->drawColor(0xFFDDDDDD);
107a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        canvas->translate(20, 20);
108d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
109a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        SkScalar x = 0, y = 0;
110d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
111a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        static void (*gMakers[])(SkBitmap*) = { make_bm0, make_bm1 };
112a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        for (size_t maker = 0; maker < SK_ARRAY_COUNT(gMakers); ++maker) {
113a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            SkBitmap bm;
114a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            gMakers[maker](&bm);
115d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
116a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            SkPaint paint;
117a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            x = 0;
118a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            canvas->drawBitmap(bm, x, y, &paint);
119a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            paint.setColorFilter(make_cf0())->unref();  x += bm.width() * 9 / 8;
120a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            canvas->drawBitmap(bm, x, y, &paint);
121a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            paint.setColorFilter(make_cf1())->unref();  x += bm.width() * 9 / 8;
122a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            canvas->drawBitmap(bm, x, y, &paint);
123a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            paint.setColorFilter(make_cf2())->unref();  x += bm.width() * 9 / 8;
124a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            canvas->drawBitmap(bm, x, y, &paint);
125a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            paint.setColorFilter(make_cf3())->unref();  x += bm.width() * 9 / 8;
126a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            canvas->drawBitmap(bm, x, y, &paint);
127d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
128a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org            y += bm.height() * 9 / 8;
129a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org        }
130a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    }
131d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
132a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgprivate:
133a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org    typedef GM INHERITED;
134a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org};
135a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
136a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org//////////////////////////////////////////////////////////////////////////////
137a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.org
138a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic skiagm::GM* MyFactory(void*) { return new TableColorFilterGM; }
139a69b48c29dff7338c3dbc2f2262ef28719483be1mike@reedtribe.orgstatic skiagm::GMRegistry reg(MyFactory);
140