blob: 16086f0346ba7dedd893245c4d3964a2e8d33880 [file] [log] [blame]
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +00001/*
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"
bsalomon@google.com12820092012-10-16 17:50:48 +000010#include "SkGradientShader.h"
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000011
12#define WIDTH 500
13#define HEIGHT 500
14
reed@google.com9afc6562012-03-22 14:09:28 +000015class SkOnce {
16public:
17 SkOnce() : fOnce(false) {};
18
19 bool once() const {
20 if (fOnce) {
21 return false;
22 }
23 fOnce = true;
24 return true;
25 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000026
reed@google.com9afc6562012-03-22 14:09:28 +000027private:
28 mutable bool fOnce;
29};
30
reed@google.com7b6c1932012-06-04 19:07:41 +000031static void setColorMatrix(SkPaint* paint, const SkColorMatrix& matrix) {
32 paint->setColorFilter(SkNEW_ARGS(SkColorMatrixFilter, (matrix)))->unref();
33}
34
35static void setArray(SkPaint* paint, const SkScalar array[]) {
36 paint->setColorFilter(SkNEW_ARGS(SkColorMatrixFilter, (array)))->unref();
37}
38
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000039namespace skiagm {
40
41class ColorMatrixGM : public GM {
reed@google.com9afc6562012-03-22 14:09:28 +000042 SkOnce fOnce;
43 void init() {
44 if (fOnce.once()) {
bsalomon@google.com12820092012-10-16 17:50:48 +000045 fSolidBitmap = this->createSolidBitmap(64, 64);
46 fTransparentBitmap = this->createTransparentBitmap(64, 64);
reed@google.com9afc6562012-03-22 14:09:28 +000047 }
48 }
49
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000050public:
51 ColorMatrixGM() {
52 this->setBGColor(0xFF808080);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000053 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000054
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000055protected:
56 virtual SkString onShortName() {
57 return SkString("colormatrix");
58 }
59
60 virtual SkISize onISize() {
61 return make_isize(WIDTH, HEIGHT);
62 }
63
bsalomon@google.com12820092012-10-16 17:50:48 +000064 SkBitmap createSolidBitmap(int width, int height) {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000065 SkBitmap bm;
66 bm.setConfig(SkBitmap::kARGB_8888_Config, width, height);
67 bm.allocPixels();
68 SkCanvas canvas(bm);
senorblanco@chromium.org50bdad82012-01-03 20:51:57 +000069 canvas.clear(0x0);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000070 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));
tomhudson@google.com75589252012-04-10 17:42:21 +000074 canvas.drawRect(SkRect::MakeXYWH(SkIntToScalar(x),
75 SkIntToScalar(y), SK_Scalar1, SK_Scalar1), paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000076 }
77 }
78 return bm;
79 }
bsalomon@google.com12820092012-10-16 17:50:48 +000080
81 // creates a bitmap with shades of transparent gray.
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
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000098 virtual void onDraw(SkCanvas* canvas) {
reed@google.com9afc6562012-03-22 14:09:28 +000099 this->init();
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000100
101 SkPaint paint;
102 SkColorMatrix matrix;
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000103
bsalomon@google.com12820092012-10-16 17:50:48 +0000104 paint.setXfermodeMode(SkXfermode::kSrc_Mode);
105 const SkBitmap bmps[] = { fSolidBitmap, fTransparentBitmap };
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000106
bsalomon@google.com12820092012-10-16 17:50:48 +0000107 for (size_t i = 0; i < SK_ARRAY_COUNT(bmps); ++i) {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000108
bsalomon@google.com12820092012-10-16 17:50:48 +0000109 matrix.setIdentity();
110 setColorMatrix(&paint, matrix);
111 canvas->drawBitmap(bmps[i], 0, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000112
bsalomon@google.com12820092012-10-16 17:50:48 +0000113 matrix.setRotate(SkColorMatrix::kR_Axis, 90);
114 setColorMatrix(&paint, matrix);
115 canvas->drawBitmap(bmps[i], 80, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000116
bsalomon@google.com12820092012-10-16 17:50:48 +0000117 matrix.setRotate(SkColorMatrix::kG_Axis, 90);
118 setColorMatrix(&paint, matrix);
119 canvas->drawBitmap(bmps[i], 160, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000120
bsalomon@google.com12820092012-10-16 17:50:48 +0000121 matrix.setRotate(SkColorMatrix::kB_Axis, 90);
122 setColorMatrix(&paint, matrix);
123 canvas->drawBitmap(bmps[i], 240, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000124
bsalomon@google.com12820092012-10-16 17:50:48 +0000125 matrix.setSaturation(SkFloatToScalar(0.0f));
126 setColorMatrix(&paint, matrix);
127 canvas->drawBitmap(bmps[i], 0, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000128
bsalomon@google.com12820092012-10-16 17:50:48 +0000129 matrix.setSaturation(SkFloatToScalar(0.5f));
130 setColorMatrix(&paint, matrix);
131 canvas->drawBitmap(bmps[i], 80, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000132
bsalomon@google.com12820092012-10-16 17:50:48 +0000133 matrix.setSaturation(SkFloatToScalar(1.0f));
134 setColorMatrix(&paint, matrix);
135 canvas->drawBitmap(bmps[i], 160, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000136
bsalomon@google.com12820092012-10-16 17:50:48 +0000137 matrix.setSaturation(SkFloatToScalar(2.0f));
138 setColorMatrix(&paint, matrix);
139 canvas->drawBitmap(bmps[i], 240, 80, &paint);
senorblanco@chromium.orgb3a39b52012-01-05 18:28:56 +0000140
bsalomon@google.com12820092012-10-16 17:50:48 +0000141 matrix.setRGB2YUV();
142 setColorMatrix(&paint, matrix);
143 canvas->drawBitmap(bmps[i], 0, 160, &paint);
senorblanco@chromium.orgb3a39b52012-01-05 18:28:56 +0000144
bsalomon@google.com12820092012-10-16 17:50:48 +0000145 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 }
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000164 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000165
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000166private:
bsalomon@google.com12820092012-10-16 17:50:48 +0000167 SkBitmap fSolidBitmap;
168 SkBitmap fTransparentBitmap;
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000169 typedef GM INHERITED;
170};
171
172//////////////////////////////////////////////////////////////////////////////
173
174static GM* MyFactory(void*) { return new ColorMatrixGM; }
175static GMRegistry reg(MyFactory);
176
177}