1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7c3b3266b7db2f1a41d41ecac010c766b7ad8eebcreed
8048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com#include "gm.h"
9c3b3266b7db2f1a41d41ecac010c766b7ad8eebcreed#include "sk_tool_utils.h"
10048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
11048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comnamespace skiagm {
12048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
13048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comstatic void make_bm(SkBitmap* bm) {
142ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com    const SkColor colors[4] = {
15048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        SK_ColorRED, SK_ColorGREEN,
16048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        SK_ColorBLUE, SK_ColorWHITE
17048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    };
182ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com    SkPMColor colorsPM[4];
192ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com    for (size_t i = 0; i < SK_ARRAY_COUNT(colors); ++i) {
202ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com        colorsPM[i] = SkPreMultiplyColor(colors[i]);
212ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com    }
222ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com    SkColorTable* ctable = new SkColorTable(colorsPM, 4);
232ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com
24dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org    bm->allocPixels(SkImageInfo::Make(2, 2, kIndex_8_SkColorType,
25dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org                                      kPremul_SkAlphaType),
26dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org                    NULL, ctable);
27048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    ctable->unref();
282ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com
29048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    *bm->getAddr8(0, 0) = 0;
30048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    *bm->getAddr8(1, 0) = 1;
31048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    *bm->getAddr8(0, 1) = 2;
32048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    *bm->getAddr8(1, 1) = 3;
33048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com}
34048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
35048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comstatic SkScalar draw_bm(SkCanvas* canvas, const SkBitmap& bm,
36048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com                        SkScalar x, SkScalar y, SkPaint* paint) {
37048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    canvas->drawBitmap(bm, x, y, paint);
38048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    return SkIntToScalar(bm.width()) * 5/4;
39048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com}
40048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
41048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comstatic SkScalar draw_set(SkCanvas* c, const SkBitmap& bm, SkScalar x,
42048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com                         SkPaint* p) {
43048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    x += draw_bm(c, bm, x, 0, p);
444469938e92d779dff05e745559e67907bbf21e78reed@google.com    p->setFilterLevel(SkPaint::kLow_FilterLevel);
45048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    x += draw_bm(c, bm, x, 0, p);
46048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    p->setDither(true);
47048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    return x + draw_bm(c, bm, x, 0, p);
48048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com}
49048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
50048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comstatic SkScalar draw_row(SkCanvas* canvas, const SkBitmap& bm) {
51048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    SkAutoCanvasRestore acr(canvas, true);
52048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
53048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    SkPaint paint;
54048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    SkScalar x = 0;
55048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    const int scale = 32;
56048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
57048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    paint.setAntiAlias(true);
585fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    sk_tool_utils::set_portable_typeface(&paint);
59c3b3266b7db2f1a41d41ecac010c766b7ad8eebcreed    const char* name = sk_tool_utils::colortype_name(bm.colorType());
60048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    canvas->drawText(name, strlen(name), x, SkIntToScalar(bm.height())*scale*5/8,
61048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com                     paint);
62048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    canvas->translate(SkIntToScalar(48), 0);
63048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
64048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    canvas->scale(SkIntToScalar(scale), SkIntToScalar(scale));
652ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com
66048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    x += draw_set(canvas, bm, 0, &paint);
67048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    paint.reset();
68048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    paint.setAlpha(0x80);
69048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    draw_set(canvas, bm, x, &paint);
70048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    return x * scale / 3;
71048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com}
72048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
73048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comclass FilterGM : public GM {
7426b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com    bool fOnce;
7526b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com    void init() {
7626b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com        if (fOnce) {
7726b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com            return;
7826b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com        }
7926b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com        fOnce = true;
80048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        make_bm(&fBM8);
818a2ad3cae710f05cca57e48dd1732d575dba2dc7commit-bot@chromium.org        fBM8.copyTo(&fBM4444, kARGB_4444_SkColorType);
828a2ad3cae710f05cca57e48dd1732d575dba2dc7commit-bot@chromium.org        fBM8.copyTo(&fBM16, kRGB_565_SkColorType);
8328fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org        fBM8.copyTo(&fBM32, kN32_SkColorType);
8426b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com    }
8526b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.compublic:
8626b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com    SkBitmap    fBM8, fBM4444, fBM16, fBM32;
8726b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com
88d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    FilterGM() : fOnce(false) {
8948dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com        this->setBGColor(0xFFDDDDDD);
90048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    }
91048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
92048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comprotected:
93048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    virtual SkString onShortName() {
94048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        return SkString("bitmapfilters");
95048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    }
96048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
97d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    virtual SkISize onISize() {
98f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(540, 330);
99048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    }
100048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
101048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    virtual void onDraw(SkCanvas* canvas) {
10226b73d31282aa13f476fa140cb82bd624b31d4bbreed@google.com        this->init();
103048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
104048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        SkScalar x = SkIntToScalar(10);
105048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        SkScalar y = SkIntToScalar(10);
1062ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com
107048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        canvas->translate(x, y);
108048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        y = draw_row(canvas, fBM8);
109048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        canvas->translate(0, y);
110048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        y = draw_row(canvas, fBM4444);
111048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        canvas->translate(0, y);
112048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        y = draw_row(canvas, fBM16);
113048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        canvas->translate(0, y);
114048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com        draw_row(canvas, fBM32);
115048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    }
1162ed67e83c806e7f65a6810fdbb8aa4b844da3170bungeman@google.com
117048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comprivate:
118048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com    typedef GM INHERITED;
119048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com};
120048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
121048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com//////////////////////////////////////////////////////////////////////////////
122048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
123048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comstatic GM* MyFactory(void*) { return new FilterGM; }
124048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.comstatic GMRegistry reg(MyFactory);
125048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com
126048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com}
127