blob: 36cf8c59d2b7c1f4d568979ee7f0907b477c688e [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
commit-bot@chromium.org2ab1ba02014-01-17 17:55:02 +000015class SkDoOnce {
reed@google.com9afc6562012-03-22 14:09:28 +000016public:
commit-bot@chromium.org2ab1ba02014-01-17 17:55:02 +000017 SkDoOnce() : fOnce(false) {};
reed@google.com9afc6562012-03-22 14:09:28 +000018
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) {
commit-bot@chromium.org727a3522014-02-21 18:46:30 +000032 paint->setColorFilter(SkColorMatrixFilter::Create(matrix))->unref();
reed@google.com7b6c1932012-06-04 19:07:41 +000033}
34
35static void setArray(SkPaint* paint, const SkScalar array[]) {
commit-bot@chromium.org727a3522014-02-21 18:46:30 +000036 paint->setColorFilter(SkColorMatrixFilter::Create(array))->unref();
reed@google.com7b6c1932012-06-04 19:07:41 +000037}
38
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000039namespace skiagm {
40
41class ColorMatrixGM : public GM {
commit-bot@chromium.org2ab1ba02014-01-17 17:55:02 +000042 SkDoOnce fOnce;
reed@google.com9afc6562012-03-22 14:09:28 +000043 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() {
caryclark0bdb08b2015-06-15 05:28:00 -070052 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() {
tfarinaf5393182014-06-09 23:59:03 -070061 return SkISize::Make(WIDTH, HEIGHT);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000062 }
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;
reed@google.comeb9a46c2014-01-25 16:46:20 +000066 bm.allocN32Pixels(width, height);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000067 SkCanvas canvas(bm);
senorblanco@chromium.org50bdad82012-01-03 20:51:57 +000068 canvas.clear(0x0);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000069 for (int y = 0; y < height; ++y) {
70 for (int x = 0; x < width; ++x) {
71 SkPaint paint;
72 paint.setColor(SkColorSetARGB(255, x * 255 / width, y * 255 / height, 0));
tomhudson@google.com75589252012-04-10 17:42:21 +000073 canvas.drawRect(SkRect::MakeXYWH(SkIntToScalar(x),
74 SkIntToScalar(y), SK_Scalar1, SK_Scalar1), paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000075 }
76 }
77 return bm;
78 }
bsalomon@google.com12820092012-10-16 17:50:48 +000079
80 // creates a bitmap with shades of transparent gray.
81 SkBitmap createTransparentBitmap(int width, int height) {
82 SkBitmap bm;
reed@google.comeb9a46c2014-01-25 16:46:20 +000083 bm.allocN32Pixels(width, height);
bsalomon@google.com12820092012-10-16 17:50:48 +000084 SkCanvas canvas(bm);
85 canvas.clear(0x0);
86
87 SkPoint pts[] = {{0, 0}, {SkIntToScalar(width), SkIntToScalar(height)}};
88 SkColor colors[] = {0x00000000, 0xFFFFFFFF};
89 SkPaint paint;
90 paint.setShader(SkGradientShader::CreateLinear(pts, colors, NULL, 2,
91 SkShader::kClamp_TileMode))->unref();
92 canvas.drawRect(SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)), paint);
93 return bm;
94 }
95
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000096 virtual void onDraw(SkCanvas* canvas) {
reed@google.com9afc6562012-03-22 14:09:28 +000097 this->init();
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +000098
99 SkPaint paint;
100 SkColorMatrix matrix;
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000101
bsalomon@google.com12820092012-10-16 17:50:48 +0000102 paint.setXfermodeMode(SkXfermode::kSrc_Mode);
103 const SkBitmap bmps[] = { fSolidBitmap, fTransparentBitmap };
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000104
bsalomon@google.com12820092012-10-16 17:50:48 +0000105 for (size_t i = 0; i < SK_ARRAY_COUNT(bmps); ++i) {
bsalomon@google.com12820092012-10-16 17:50:48 +0000106 matrix.setIdentity();
107 setColorMatrix(&paint, matrix);
108 canvas->drawBitmap(bmps[i], 0, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000109
bsalomon@google.com12820092012-10-16 17:50:48 +0000110 matrix.setRotate(SkColorMatrix::kR_Axis, 90);
111 setColorMatrix(&paint, matrix);
112 canvas->drawBitmap(bmps[i], 80, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000113
bsalomon@google.com12820092012-10-16 17:50:48 +0000114 matrix.setRotate(SkColorMatrix::kG_Axis, 90);
115 setColorMatrix(&paint, matrix);
116 canvas->drawBitmap(bmps[i], 160, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000117
bsalomon@google.com12820092012-10-16 17:50:48 +0000118 matrix.setRotate(SkColorMatrix::kB_Axis, 90);
119 setColorMatrix(&paint, matrix);
120 canvas->drawBitmap(bmps[i], 240, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000121
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000122 matrix.setSaturation(0.0f);
bsalomon@google.com12820092012-10-16 17:50:48 +0000123 setColorMatrix(&paint, matrix);
124 canvas->drawBitmap(bmps[i], 0, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000125
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000126 matrix.setSaturation(0.5f);
bsalomon@google.com12820092012-10-16 17:50:48 +0000127 setColorMatrix(&paint, matrix);
128 canvas->drawBitmap(bmps[i], 80, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000129
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000130 matrix.setSaturation(1.0f);
bsalomon@google.com12820092012-10-16 17:50:48 +0000131 setColorMatrix(&paint, matrix);
132 canvas->drawBitmap(bmps[i], 160, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000133
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000134 matrix.setSaturation(2.0f);
bsalomon@google.com12820092012-10-16 17:50:48 +0000135 setColorMatrix(&paint, matrix);
136 canvas->drawBitmap(bmps[i], 240, 80, &paint);
senorblanco@chromium.orgb3a39b52012-01-05 18:28:56 +0000137
bsalomon@google.com12820092012-10-16 17:50:48 +0000138 matrix.setRGB2YUV();
139 setColorMatrix(&paint, matrix);
140 canvas->drawBitmap(bmps[i], 0, 160, &paint);
senorblanco@chromium.orgb3a39b52012-01-05 18:28:56 +0000141
bsalomon@google.com12820092012-10-16 17:50:48 +0000142 matrix.setYUV2RGB();
143 setColorMatrix(&paint, matrix);
144 canvas->drawBitmap(bmps[i], 80, 160, &paint);
145
146 SkScalar s1 = SK_Scalar1;
147 SkScalar s255 = SkIntToScalar(255);
148 // Move red into alpha, set color to white
149 SkScalar data[20] = {
150 0, 0, 0, 0, s255,
151 0, 0, 0, 0, s255,
152 0, 0, 0, 0, s255,
153 s1, 0, 0, 0, 0,
154 };
155
156 setArray(&paint, data);
157 canvas->drawBitmap(bmps[i], 160, 160, &paint);
158
159 canvas->translate(0, 240);
160 }
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000161 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000162
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000163private:
bsalomon@google.com12820092012-10-16 17:50:48 +0000164 SkBitmap fSolidBitmap;
165 SkBitmap fTransparentBitmap;
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000166 typedef GM INHERITED;
167};
168
169//////////////////////////////////////////////////////////////////////////////
170
171static GM* MyFactory(void*) { return new ColorMatrixGM; }
172static GMRegistry reg(MyFactory);
173
174}