blob: b5ede710f1cc2fd3293d7d93fcb51277bec548fd [file] [log] [blame]
bsalomon@google.comc6126c12012-10-19 19:26:05 +00001/*
2 * Copyright 2012 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 "SkBitmapProcShader.h"
10#include "SkColorFilter.h"
11#include "SkGradientShader.h"
12
13#define WIDTH 512
14#define HEIGHT 1024
15
16namespace skiagm {
17
18// Using gradients because GPU doesn't currently have an implementation of SkColorShader (duh!)
19static SkShader* make_color_shader(SkColor color) {
20 static const SkPoint kPts[] = {{0, 0}, {1, 1}};
21 SkColor colors[] = {color, color};
22
halcanary96fcdcc2015-08-27 07:41:13 -070023 return SkGradientShader::CreateLinear(kPts, colors, nullptr, 2, SkShader::kClamp_TileMode);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000024}
25
26static SkShader* make_solid_shader() {
caryclark12596012015-07-29 05:27:47 -070027 return make_color_shader(SkColorSetARGB(0xFF, 0x42, 0x82, 0x21));
bsalomon@google.comc6126c12012-10-19 19:26:05 +000028}
29
30static SkShader* make_transparent_shader() {
31 return make_color_shader(SkColorSetARGB(0x80, 0x10, 0x70, 0x20));
32}
33
34static SkShader* make_trans_black_shader() {
35 return make_color_shader(0x0);
36}
37
38// draws a background behind each test rect to see transparency
39static SkShader* make_bg_shader(int checkSize) {
40 SkBitmap bmp;
reed@google.comeb9a46c2014-01-25 16:46:20 +000041 bmp.allocN32Pixels(2 * checkSize, 2 * checkSize);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000042 SkCanvas canvas(bmp);
caryclark12596012015-07-29 05:27:47 -070043 canvas.clear(sk_tool_utils::color_to_565(0xFF800000));
bsalomon@google.comc6126c12012-10-19 19:26:05 +000044 SkPaint paint;
caryclark12596012015-07-29 05:27:47 -070045 paint.setColor(sk_tool_utils::color_to_565(0xFF000080));
bsalomon@google.comc6126c12012-10-19 19:26:05 +000046 SkRect rect0 = SkRect::MakeXYWH(0, 0,
47 SkIntToScalar(checkSize), SkIntToScalar(checkSize));
48 SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(checkSize), SkIntToScalar(checkSize),
49 SkIntToScalar(checkSize), SkIntToScalar(checkSize));
50 canvas.drawRect(rect1, paint);
51 canvas.drawRect(rect0, paint);
halcanary385fe4d2015-08-26 13:07:48 -070052 return new SkBitmapProcShader(bmp, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000053}
54
55class ModeColorFilterGM : public GM {
56public:
57 ModeColorFilterGM() {
caryclark65cdba62015-06-15 06:51:08 -070058 this->setBGColor(sk_tool_utils::color_to_565(0xFF303030));
bsalomon@google.comc6126c12012-10-19 19:26:05 +000059 }
60
61protected:
62 virtual SkString onShortName() {
63 return SkString("modecolorfilters");
64 }
65
66 virtual SkISize onISize() {
tfarinaf5393182014-06-09 23:59:03 -070067 return SkISize::Make(WIDTH, HEIGHT);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000068 }
69
70 virtual void onDraw(SkCanvas* canvas) {
71 // size of rect for each test case
72 static const int kRectWidth = 20;
skia.committer@gmail.com24c29d92012-10-20 02:01:23 +000073 static const int kRectHeight = 20;
bsalomon@google.comc6126c12012-10-19 19:26:05 +000074
75 static const int kCheckSize = 10;
76
77 if (!fBmpShader) {
78 fBmpShader.reset(make_bg_shader(kCheckSize));
79 }
80 SkPaint bgPaint;
81 bgPaint.setShader(fBmpShader);
82 bgPaint.setXfermodeMode(SkXfermode::kSrc_Mode);
83
84 SkShader* shaders[] = {
halcanary96fcdcc2015-08-27 07:41:13 -070085 nullptr, // use a paint color instead of a shader
bsalomon@google.comc6126c12012-10-19 19:26:05 +000086 make_solid_shader(),
87 make_transparent_shader(),
88 make_trans_black_shader(),
89 };
90
91 // used without shader
92 SkColor colors[] = {
93 SkColorSetARGB(0xFF, 0xFF, 0xFF, 0xFF),
94 SkColorSetARGB(0xFF, 0x00, 0x00, 0x00),
95 SkColorSetARGB(0x00, 0x00, 0x00, 0x00),
caryclark12596012015-07-29 05:27:47 -070096 SkColorSetARGB(0xFF, 0x10, 0x20, 0x42),
bsalomon@google.comc6126c12012-10-19 19:26:05 +000097 SkColorSetARGB(0xA0, 0x20, 0x30, 0x90),
98 };
99
100 // used with shaders
101 SkColor alphas[] = {0xFFFFFFFF, 0x80808080};
skia.committer@gmail.com24c29d92012-10-20 02:01:23 +0000102
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000103 SkXfermode::Mode modes[] = { // currently just doing the Modes expressible as Coeffs
104 SkXfermode::kClear_Mode,
105 SkXfermode::kSrc_Mode,
106 SkXfermode::kDst_Mode,
107 SkXfermode::kSrcOver_Mode,
108 SkXfermode::kDstOver_Mode,
109 SkXfermode::kSrcIn_Mode,
110 SkXfermode::kDstIn_Mode,
111 SkXfermode::kSrcOut_Mode,
112 SkXfermode::kDstOut_Mode,
113 SkXfermode::kSrcATop_Mode,
114 SkXfermode::kDstATop_Mode,
115 SkXfermode::kXor_Mode,
116 SkXfermode::kPlus_Mode,
reed@google.com8d3cd7a2013-01-30 21:36:11 +0000117 SkXfermode::kModulate_Mode,
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000118 };
119
120 SkPaint paint;
121 int idx = 0;
122 static const int kRectsPerRow = SkMax32(this->getISize().fWidth / kRectWidth, 1);
123 for (size_t cfm = 0; cfm < SK_ARRAY_COUNT(modes); ++cfm) {
robertphillips@google.com93f03322012-12-03 17:35:19 +0000124 for (size_t cfc = 0; cfc < SK_ARRAY_COUNT(colors); ++cfc) {
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000125 SkAutoTUnref<SkColorFilter> cf(SkColorFilter::CreateModeFilter(colors[cfc],
126 modes[cfm]));
127 paint.setColorFilter(cf);
robertphillips@google.com93f03322012-12-03 17:35:19 +0000128 for (size_t s = 0; s < SK_ARRAY_COUNT(shaders); ++s) {
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000129 paint.setShader(shaders[s]);
halcanary96fcdcc2015-08-27 07:41:13 -0700130 bool hasShader = nullptr == paint.getShader();
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000131 int paintColorCnt = hasShader ? SK_ARRAY_COUNT(alphas) : SK_ARRAY_COUNT(colors);
132 SkColor* paintColors = hasShader ? alphas : colors;
133 for (int pc = 0; pc < paintColorCnt; ++pc) {
134 paint.setColor(paintColors[pc]);
135 SkScalar x = SkIntToScalar(idx % kRectsPerRow);
136 SkScalar y = SkIntToScalar(idx / kRectsPerRow);
137 SkRect rect = SkRect::MakeXYWH(x * kRectWidth, y * kRectHeight,
skia.committer@gmail.com306ab9d2012-12-13 02:01:33 +0000138 SkIntToScalar(kRectWidth),
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000139 SkIntToScalar(kRectHeight));
halcanary96fcdcc2015-08-27 07:41:13 -0700140 canvas->saveLayer(&rect, nullptr);
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000141 canvas->drawRect(rect, bgPaint);
142 canvas->drawRect(rect, paint);
vandebo@chromium.org8d8d9a52013-03-14 17:24:16 +0000143 canvas->restore();
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000144 ++idx;
145 }
146 }
147 }
148 }
149
robertphillips@google.com93f03322012-12-03 17:35:19 +0000150 for (size_t i = 0; i < SK_ARRAY_COUNT(shaders); ++i) {
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000151 SkSafeUnref(shaders[i]);
152 }
153 }
154
155private:
156 SkAutoTUnref<SkShader> fBmpShader;
157 typedef GM INHERITED;
158};
159
160//////////////////////////////////////////////////////////////////////////////
161
162static GM* MyFactory(void*) { return new ModeColorFilterGM; }
163static GMRegistry reg(MyFactory);
164
165}