1
2 /*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8 #include "gm.h"
9
10 namespace skiagm {
11
make_bm(SkBitmap * bm)12 static void make_bm(SkBitmap* bm) {
13 const SkColor colors[4] = {
14 SK_ColorRED, SK_ColorGREEN,
15 SK_ColorBLUE, SK_ColorWHITE
16 };
17 SkPMColor colorsPM[4];
18 for (size_t i = 0; i < SK_ARRAY_COUNT(colors); ++i) {
19 colorsPM[i] = SkPreMultiplyColor(colors[i]);
20 }
21 SkColorTable* ctable = new SkColorTable(colorsPM, 4);
22
23 bm->setConfig(SkBitmap::kIndex8_Config, 2, 2);
24 bm->allocPixels(ctable);
25 ctable->unref();
26
27 *bm->getAddr8(0, 0) = 0;
28 *bm->getAddr8(1, 0) = 1;
29 *bm->getAddr8(0, 1) = 2;
30 *bm->getAddr8(1, 1) = 3;
31 }
32
draw_bm(SkCanvas * canvas,const SkBitmap & bm,SkScalar x,SkScalar y,SkPaint * paint)33 static SkScalar draw_bm(SkCanvas* canvas, const SkBitmap& bm,
34 SkScalar x, SkScalar y, SkPaint* paint) {
35 canvas->drawBitmap(bm, x, y, paint);
36 return SkIntToScalar(bm.width()) * 5/4;
37 }
38
draw_set(SkCanvas * c,const SkBitmap & bm,SkScalar x,SkPaint * p)39 static SkScalar draw_set(SkCanvas* c, const SkBitmap& bm, SkScalar x,
40 SkPaint* p) {
41 x += draw_bm(c, bm, x, 0, p);
42 p->setFilterBitmap(true);
43 x += draw_bm(c, bm, x, 0, p);
44 p->setDither(true);
45 return x + draw_bm(c, bm, x, 0, p);
46 }
47
48 static const char* gConfigNames[] = {
49 "unknown config",
50 "A1",
51 "A8",
52 "Index8",
53 "565",
54 "4444",
55 "8888"
56 };
57
draw_row(SkCanvas * canvas,const SkBitmap & bm)58 static SkScalar draw_row(SkCanvas* canvas, const SkBitmap& bm) {
59 SkAutoCanvasRestore acr(canvas, true);
60
61 SkPaint paint;
62 SkScalar x = 0;
63 const int scale = 32;
64
65 paint.setAntiAlias(true);
66 const char* name = gConfigNames[bm.config()];
67 canvas->drawText(name, strlen(name), x, SkIntToScalar(bm.height())*scale*5/8,
68 paint);
69 canvas->translate(SkIntToScalar(48), 0);
70
71 canvas->scale(SkIntToScalar(scale), SkIntToScalar(scale));
72
73 x += draw_set(canvas, bm, 0, &paint);
74 paint.reset();
75 paint.setAlpha(0x80);
76 draw_set(canvas, bm, x, &paint);
77 return x * scale / 3;
78 }
79
80 class FilterGM : public GM {
81 bool fOnce;
init()82 void init() {
83 if (fOnce) {
84 return;
85 }
86 fOnce = true;
87 make_bm(&fBM8);
88 fBM8.copyTo(&fBM4444, SkBitmap::kARGB_4444_Config);
89 fBM8.copyTo(&fBM16, SkBitmap::kRGB_565_Config);
90 fBM8.copyTo(&fBM32, SkBitmap::kARGB_8888_Config);
91 }
92 public:
93 SkBitmap fBM8, fBM4444, fBM16, fBM32;
94
FilterGM()95 FilterGM() : fOnce(false) {
96 this->setBGColor(0xFFDDDDDD);
97 }
98
99 protected:
onShortName()100 virtual SkString onShortName() {
101 return SkString("bitmapfilters");
102 }
103
onISize()104 virtual SkISize onISize() {
105 return make_isize(540, 330);
106 }
107
onDraw(SkCanvas * canvas)108 virtual void onDraw(SkCanvas* canvas) {
109 this->init();
110
111 SkScalar x = SkIntToScalar(10);
112 SkScalar y = SkIntToScalar(10);
113
114 canvas->translate(x, y);
115 y = draw_row(canvas, fBM8);
116 canvas->translate(0, y);
117 y = draw_row(canvas, fBM4444);
118 canvas->translate(0, y);
119 y = draw_row(canvas, fBM16);
120 canvas->translate(0, y);
121 draw_row(canvas, fBM32);
122 }
123
124 private:
125 typedef GM INHERITED;
126 };
127
128 //////////////////////////////////////////////////////////////////////////////
129
MyFactory(void *)130 static GM* MyFactory(void*) { return new FilterGM; }
131 static GMRegistry reg(MyFactory);
132
133 }
134