blob: 5856f87f66de158b765a309396fae12a8870faef [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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 */
reed@android.com048522d2009-06-23 12:19:41 +00008#include "gm.h"
9
10namespace skiagm {
11
12static void make_bm(SkBitmap* bm) {
bungeman@google.com2ed67e82011-05-18 18:54:23 +000013 const SkColor colors[4] = {
reed@android.com048522d2009-06-23 12:19:41 +000014 SK_ColorRED, SK_ColorGREEN,
15 SK_ColorBLUE, SK_ColorWHITE
16 };
bungeman@google.com2ed67e82011-05-18 18:54:23 +000017 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
reed@android.com048522d2009-06-23 12:19:41 +000023 bm->setConfig(SkBitmap::kIndex8_Config, 2, 2);
24 bm->allocPixels(ctable);
25 ctable->unref();
bungeman@google.com2ed67e82011-05-18 18:54:23 +000026
reed@android.com048522d2009-06-23 12:19:41 +000027 *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
33static 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
39static SkScalar draw_set(SkCanvas* c, const SkBitmap& bm, SkScalar x,
40 SkPaint* p) {
41 x += draw_bm(c, bm, x, 0, p);
reed@google.com44699382013-10-31 17:28:30 +000042 p->setFilterLevel(SkPaint::kLow_FilterLevel);
reed@android.com048522d2009-06-23 12:19:41 +000043 x += draw_bm(c, bm, x, 0, p);
44 p->setDither(true);
45 return x + draw_bm(c, bm, x, 0, p);
46}
47
48static const char* gConfigNames[] = {
49 "unknown config",
reed@android.com048522d2009-06-23 12:19:41 +000050 "A8",
51 "Index8",
52 "565",
53 "4444",
54 "8888"
55};
56
57static SkScalar draw_row(SkCanvas* canvas, const SkBitmap& bm) {
58 SkAutoCanvasRestore acr(canvas, true);
59
60 SkPaint paint;
61 SkScalar x = 0;
62 const int scale = 32;
63
64 paint.setAntiAlias(true);
65 const char* name = gConfigNames[bm.config()];
66 canvas->drawText(name, strlen(name), x, SkIntToScalar(bm.height())*scale*5/8,
67 paint);
68 canvas->translate(SkIntToScalar(48), 0);
69
70 canvas->scale(SkIntToScalar(scale), SkIntToScalar(scale));
bungeman@google.com2ed67e82011-05-18 18:54:23 +000071
reed@android.com048522d2009-06-23 12:19:41 +000072 x += draw_set(canvas, bm, 0, &paint);
73 paint.reset();
74 paint.setAlpha(0x80);
75 draw_set(canvas, bm, x, &paint);
76 return x * scale / 3;
77}
78
79class FilterGM : public GM {
reed@google.com26b73d32012-03-08 22:13:04 +000080 bool fOnce;
81 void init() {
82 if (fOnce) {
83 return;
84 }
85 fOnce = true;
reed@android.com048522d2009-06-23 12:19:41 +000086 make_bm(&fBM8);
87 fBM8.copyTo(&fBM4444, SkBitmap::kARGB_4444_Config);
88 fBM8.copyTo(&fBM16, SkBitmap::kRGB_565_Config);
89 fBM8.copyTo(&fBM32, SkBitmap::kARGB_8888_Config);
reed@google.com26b73d32012-03-08 22:13:04 +000090 }
91public:
92 SkBitmap fBM8, fBM4444, fBM16, fBM32;
93
rmistry@google.comd6176b02012-08-23 18:14:13 +000094 FilterGM() : fOnce(false) {
bsalomon@google.com48dd1a22011-10-31 14:18:20 +000095 this->setBGColor(0xFFDDDDDD);
reed@android.com048522d2009-06-23 12:19:41 +000096 }
97
98protected:
99 virtual SkString onShortName() {
100 return SkString("bitmapfilters");
101 }
102
rmistry@google.comd6176b02012-08-23 18:14:13 +0000103 virtual SkISize onISize() {
reed@android.com048522d2009-06-23 12:19:41 +0000104 return make_isize(540, 330);
105 }
106
107 virtual void onDraw(SkCanvas* canvas) {
reed@google.com26b73d32012-03-08 22:13:04 +0000108 this->init();
reed@android.com048522d2009-06-23 12:19:41 +0000109
110 SkScalar x = SkIntToScalar(10);
111 SkScalar y = SkIntToScalar(10);
bungeman@google.com2ed67e82011-05-18 18:54:23 +0000112
reed@android.com048522d2009-06-23 12:19:41 +0000113 canvas->translate(x, y);
114 y = draw_row(canvas, fBM8);
115 canvas->translate(0, y);
116 y = draw_row(canvas, fBM4444);
117 canvas->translate(0, y);
118 y = draw_row(canvas, fBM16);
119 canvas->translate(0, y);
120 draw_row(canvas, fBM32);
121 }
bungeman@google.com2ed67e82011-05-18 18:54:23 +0000122
reed@android.com048522d2009-06-23 12:19:41 +0000123private:
124 typedef GM INHERITED;
125};
126
127//////////////////////////////////////////////////////////////////////////////
128
129static GM* MyFactory(void*) { return new FilterGM; }
130static GMRegistry reg(MyFactory);
131
132}