blob: 841f36a139db04742b2a9244056b3bb4ec3e6e5c [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() {
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() {
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) {
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000106
bsalomon@google.com12820092012-10-16 17:50:48 +0000107 matrix.setIdentity();
108 setColorMatrix(&paint, matrix);
109 canvas->drawBitmap(bmps[i], 0, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000110
bsalomon@google.com12820092012-10-16 17:50:48 +0000111 matrix.setRotate(SkColorMatrix::kR_Axis, 90);
112 setColorMatrix(&paint, matrix);
113 canvas->drawBitmap(bmps[i], 80, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000114
bsalomon@google.com12820092012-10-16 17:50:48 +0000115 matrix.setRotate(SkColorMatrix::kG_Axis, 90);
116 setColorMatrix(&paint, matrix);
117 canvas->drawBitmap(bmps[i], 160, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000118
bsalomon@google.com12820092012-10-16 17:50:48 +0000119 matrix.setRotate(SkColorMatrix::kB_Axis, 90);
120 setColorMatrix(&paint, matrix);
121 canvas->drawBitmap(bmps[i], 240, 0, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000122
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000123 matrix.setSaturation(0.0f);
bsalomon@google.com12820092012-10-16 17:50:48 +0000124 setColorMatrix(&paint, matrix);
125 canvas->drawBitmap(bmps[i], 0, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000126
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000127 matrix.setSaturation(0.5f);
bsalomon@google.com12820092012-10-16 17:50:48 +0000128 setColorMatrix(&paint, matrix);
129 canvas->drawBitmap(bmps[i], 80, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000130
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000131 matrix.setSaturation(1.0f);
bsalomon@google.com12820092012-10-16 17:50:48 +0000132 setColorMatrix(&paint, matrix);
133 canvas->drawBitmap(bmps[i], 160, 80, &paint);
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000134
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000135 matrix.setSaturation(2.0f);
bsalomon@google.com12820092012-10-16 17:50:48 +0000136 setColorMatrix(&paint, matrix);
137 canvas->drawBitmap(bmps[i], 240, 80, &paint);
senorblanco@chromium.orgb3a39b52012-01-05 18:28:56 +0000138
bsalomon@google.com12820092012-10-16 17:50:48 +0000139 matrix.setRGB2YUV();
140 setColorMatrix(&paint, matrix);
141 canvas->drawBitmap(bmps[i], 0, 160, &paint);
senorblanco@chromium.orgb3a39b52012-01-05 18:28:56 +0000142
bsalomon@google.com12820092012-10-16 17:50:48 +0000143 matrix.setYUV2RGB();
144 setColorMatrix(&paint, matrix);
145 canvas->drawBitmap(bmps[i], 80, 160, &paint);
146
147 SkScalar s1 = SK_Scalar1;
148 SkScalar s255 = SkIntToScalar(255);
149 // Move red into alpha, set color to white
150 SkScalar data[20] = {
151 0, 0, 0, 0, s255,
152 0, 0, 0, 0, s255,
153 0, 0, 0, 0, s255,
154 s1, 0, 0, 0, 0,
155 };
156
157 setArray(&paint, data);
158 canvas->drawBitmap(bmps[i], 160, 160, &paint);
159
160 canvas->translate(0, 240);
161 }
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000162 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000163
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000164private:
bsalomon@google.com12820092012-10-16 17:50:48 +0000165 SkBitmap fSolidBitmap;
166 SkBitmap fTransparentBitmap;
senorblanco@chromium.orge5ff3ce2011-12-20 20:58:18 +0000167 typedef GM INHERITED;
168};
169
170//////////////////////////////////////////////////////////////////////////////
171
172static GM* MyFactory(void*) { return new ColorMatrixGM; }
173static GMRegistry reg(MyFactory);
174
175}