1 /*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "gm.h"
9 #include "SkColorMatrixFilter.h"
10 #include "SkGradientShader.h"
11
12 #define WIDTH 500
13 #define HEIGHT 500
14
15 class SkOnce {
16 public:
SkOnce()17 SkOnce() : fOnce(false) {};
18
once() const19 bool once() const {
20 if (fOnce) {
21 return false;
22 }
23 fOnce = true;
24 return true;
25 }
26
27 private:
28 mutable bool fOnce;
29 };
30
setColorMatrix(SkPaint * paint,const SkColorMatrix & matrix)31 static void setColorMatrix(SkPaint* paint, const SkColorMatrix& matrix) {
32 paint->setColorFilter(SkNEW_ARGS(SkColorMatrixFilter, (matrix)))->unref();
33 }
34
setArray(SkPaint * paint,const SkScalar array[])35 static void setArray(SkPaint* paint, const SkScalar array[]) {
36 paint->setColorFilter(SkNEW_ARGS(SkColorMatrixFilter, (array)))->unref();
37 }
38
39 namespace skiagm {
40
41 class ColorMatrixGM : public GM {
42 SkOnce fOnce;
init()43 void init() {
44 if (fOnce.once()) {
45 fSolidBitmap = this->createSolidBitmap(64, 64);
46 fTransparentBitmap = this->createTransparentBitmap(64, 64);
47 }
48 }
49
50 public:
ColorMatrixGM()51 ColorMatrixGM() {
52 this->setBGColor(0xFF808080);
53 }
54
55 protected:
onShortName()56 virtual SkString onShortName() {
57 return SkString("colormatrix");
58 }
59
onISize()60 virtual SkISize onISize() {
61 return make_isize(WIDTH, HEIGHT);
62 }
63
createSolidBitmap(int width,int height)64 SkBitmap createSolidBitmap(int width, int height) {
65 SkBitmap bm;
66 bm.setConfig(SkBitmap::kARGB_8888_Config, width, height);
67 bm.allocPixels();
68 SkCanvas canvas(bm);
69 canvas.clear(0x0);
70 for (int y = 0; y < height; ++y) {
71 for (int x = 0; x < width; ++x) {
72 SkPaint paint;
73 paint.setColor(SkColorSetARGB(255, x * 255 / width, y * 255 / height, 0));
74 canvas.drawRect(SkRect::MakeXYWH(SkIntToScalar(x),
75 SkIntToScalar(y), SK_Scalar1, SK_Scalar1), paint);
76 }
77 }
78 return bm;
79 }
80
81 // creates a bitmap with shades of transparent gray.
createTransparentBitmap(int width,int height)82 SkBitmap createTransparentBitmap(int width, int height) {
83 SkBitmap bm;
84 bm.setConfig(SkBitmap::kARGB_8888_Config, width, height);
85 bm.allocPixels();
86 SkCanvas canvas(bm);
87 canvas.clear(0x0);
88
89 SkPoint pts[] = {{0, 0}, {SkIntToScalar(width), SkIntToScalar(height)}};
90 SkColor colors[] = {0x00000000, 0xFFFFFFFF};
91 SkPaint paint;
92 paint.setShader(SkGradientShader::CreateLinear(pts, colors, NULL, 2,
93 SkShader::kClamp_TileMode))->unref();
94 canvas.drawRect(SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)), paint);
95 return bm;
96 }
97
onDraw(SkCanvas * canvas)98 virtual void onDraw(SkCanvas* canvas) {
99 this->init();
100
101 SkPaint paint;
102 SkColorMatrix matrix;
103
104 paint.setXfermodeMode(SkXfermode::kSrc_Mode);
105 const SkBitmap bmps[] = { fSolidBitmap, fTransparentBitmap };
106
107 for (size_t i = 0; i < SK_ARRAY_COUNT(bmps); ++i) {
108
109 matrix.setIdentity();
110 setColorMatrix(&paint, matrix);
111 canvas->drawBitmap(bmps[i], 0, 0, &paint);
112
113 matrix.setRotate(SkColorMatrix::kR_Axis, 90);
114 setColorMatrix(&paint, matrix);
115 canvas->drawBitmap(bmps[i], 80, 0, &paint);
116
117 matrix.setRotate(SkColorMatrix::kG_Axis, 90);
118 setColorMatrix(&paint, matrix);
119 canvas->drawBitmap(bmps[i], 160, 0, &paint);
120
121 matrix.setRotate(SkColorMatrix::kB_Axis, 90);
122 setColorMatrix(&paint, matrix);
123 canvas->drawBitmap(bmps[i], 240, 0, &paint);
124
125 matrix.setSaturation(0.0f);
126 setColorMatrix(&paint, matrix);
127 canvas->drawBitmap(bmps[i], 0, 80, &paint);
128
129 matrix.setSaturation(0.5f);
130 setColorMatrix(&paint, matrix);
131 canvas->drawBitmap(bmps[i], 80, 80, &paint);
132
133 matrix.setSaturation(1.0f);
134 setColorMatrix(&paint, matrix);
135 canvas->drawBitmap(bmps[i], 160, 80, &paint);
136
137 matrix.setSaturation(2.0f);
138 setColorMatrix(&paint, matrix);
139 canvas->drawBitmap(bmps[i], 240, 80, &paint);
140
141 matrix.setRGB2YUV();
142 setColorMatrix(&paint, matrix);
143 canvas->drawBitmap(bmps[i], 0, 160, &paint);
144
145 matrix.setYUV2RGB();
146 setColorMatrix(&paint, matrix);
147 canvas->drawBitmap(bmps[i], 80, 160, &paint);
148
149 SkScalar s1 = SK_Scalar1;
150 SkScalar s255 = SkIntToScalar(255);
151 // Move red into alpha, set color to white
152 SkScalar data[20] = {
153 0, 0, 0, 0, s255,
154 0, 0, 0, 0, s255,
155 0, 0, 0, 0, s255,
156 s1, 0, 0, 0, 0,
157 };
158
159 setArray(&paint, data);
160 canvas->drawBitmap(bmps[i], 160, 160, &paint);
161
162 canvas->translate(0, 240);
163 }
164 }
165
166 private:
167 SkBitmap fSolidBitmap;
168 SkBitmap fTransparentBitmap;
169 typedef GM INHERITED;
170 };
171
172 //////////////////////////////////////////////////////////////////////////////
173
MyFactory(void *)174 static GM* MyFactory(void*) { return new ColorMatrixGM; }
175 static GMRegistry reg(MyFactory);
176
177 }
178