blob: cc54e7623f46f9a06c1056fddb6a6052d824e430 [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"
bsalomon@google.comc6126c12012-10-19 19:26:05 +00009#include "SkColorFilter.h"
10#include "SkGradientShader.h"
11
12#define WIDTH 512
13#define HEIGHT 1024
14
15namespace skiagm {
16
17// Using gradients because GPU doesn't currently have an implementation of SkColorShader (duh!)
reed1a9b9642016-03-13 14:13:58 -070018static sk_sp<SkShader> make_color_shader(SkColor color) {
mtkleindbfd7ab2016-09-01 11:24:54 -070019 constexpr SkPoint kPts[] = {{0, 0}, {1, 1}};
bsalomon@google.comc6126c12012-10-19 19:26:05 +000020 SkColor colors[] = {color, color};
21
reed1a9b9642016-03-13 14:13:58 -070022 return SkGradientShader::MakeLinear(kPts, colors, nullptr, 2, SkShader::kClamp_TileMode);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000023}
24
reed1a9b9642016-03-13 14:13:58 -070025static sk_sp<SkShader> make_solid_shader() {
caryclark12596012015-07-29 05:27:47 -070026 return make_color_shader(SkColorSetARGB(0xFF, 0x42, 0x82, 0x21));
bsalomon@google.comc6126c12012-10-19 19:26:05 +000027}
28
reed1a9b9642016-03-13 14:13:58 -070029static sk_sp<SkShader> make_transparent_shader() {
bsalomon@google.comc6126c12012-10-19 19:26:05 +000030 return make_color_shader(SkColorSetARGB(0x80, 0x10, 0x70, 0x20));
31}
32
reed1a9b9642016-03-13 14:13:58 -070033static sk_sp<SkShader> make_trans_black_shader() {
bsalomon@google.comc6126c12012-10-19 19:26:05 +000034 return make_color_shader(0x0);
35}
36
37// draws a background behind each test rect to see transparency
reed1a9b9642016-03-13 14:13:58 -070038static sk_sp<SkShader> make_bg_shader(int checkSize) {
bsalomon@google.comc6126c12012-10-19 19:26:05 +000039 SkBitmap bmp;
reed@google.comeb9a46c2014-01-25 16:46:20 +000040 bmp.allocN32Pixels(2 * checkSize, 2 * checkSize);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000041 SkCanvas canvas(bmp);
caryclark12596012015-07-29 05:27:47 -070042 canvas.clear(sk_tool_utils::color_to_565(0xFF800000));
bsalomon@google.comc6126c12012-10-19 19:26:05 +000043 SkPaint paint;
caryclark12596012015-07-29 05:27:47 -070044 paint.setColor(sk_tool_utils::color_to_565(0xFF000080));
bsalomon@google.comc6126c12012-10-19 19:26:05 +000045 SkRect rect0 = SkRect::MakeXYWH(0, 0,
46 SkIntToScalar(checkSize), SkIntToScalar(checkSize));
47 SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(checkSize), SkIntToScalar(checkSize),
48 SkIntToScalar(checkSize), SkIntToScalar(checkSize));
49 canvas.drawRect(rect1, paint);
50 canvas.drawRect(rect0, paint);
reed1a9b9642016-03-13 14:13:58 -070051 return SkShader::MakeBitmapShader(bmp, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000052}
53
54class ModeColorFilterGM : public GM {
55public:
56 ModeColorFilterGM() {
caryclark65cdba62015-06-15 06:51:08 -070057 this->setBGColor(sk_tool_utils::color_to_565(0xFF303030));
bsalomon@google.comc6126c12012-10-19 19:26:05 +000058 }
59
60protected:
reed1a9b9642016-03-13 14:13:58 -070061 SkString onShortName() override {
bsalomon@google.comc6126c12012-10-19 19:26:05 +000062 return SkString("modecolorfilters");
63 }
64
reed1a9b9642016-03-13 14:13:58 -070065 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070066 return SkISize::Make(WIDTH, HEIGHT);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000067 }
68
reed1a9b9642016-03-13 14:13:58 -070069 void onDraw(SkCanvas* canvas) override {
bsalomon@google.comc6126c12012-10-19 19:26:05 +000070 // size of rect for each test case
mtkleindbfd7ab2016-09-01 11:24:54 -070071 constexpr int kRectWidth = 20;
72 constexpr int kRectHeight = 20;
bsalomon@google.comc6126c12012-10-19 19:26:05 +000073
mtkleindbfd7ab2016-09-01 11:24:54 -070074 constexpr int kCheckSize = 10;
bsalomon@google.comc6126c12012-10-19 19:26:05 +000075
76 if (!fBmpShader) {
reed1a9b9642016-03-13 14:13:58 -070077 fBmpShader = make_bg_shader(kCheckSize);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000078 }
79 SkPaint bgPaint;
80 bgPaint.setShader(fBmpShader);
reed374772b2016-10-05 17:33:02 -070081 bgPaint.setBlendMode(SkBlendMode::kSrc);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000082
reed1a9b9642016-03-13 14:13:58 -070083 sk_sp<SkShader> shaders[] = {
halcanary96fcdcc2015-08-27 07:41:13 -070084 nullptr, // use a paint color instead of a shader
bsalomon@google.comc6126c12012-10-19 19:26:05 +000085 make_solid_shader(),
86 make_transparent_shader(),
87 make_trans_black_shader(),
88 };
89
90 // used without shader
91 SkColor colors[] = {
92 SkColorSetARGB(0xFF, 0xFF, 0xFF, 0xFF),
93 SkColorSetARGB(0xFF, 0x00, 0x00, 0x00),
94 SkColorSetARGB(0x00, 0x00, 0x00, 0x00),
caryclark12596012015-07-29 05:27:47 -070095 SkColorSetARGB(0xFF, 0x10, 0x20, 0x42),
bsalomon@google.comc6126c12012-10-19 19:26:05 +000096 SkColorSetARGB(0xA0, 0x20, 0x30, 0x90),
97 };
98
99 // used with shaders
100 SkColor alphas[] = {0xFFFFFFFF, 0x80808080};
skia.committer@gmail.com24c29d92012-10-20 02:01:23 +0000101
Mike Reed7d954ad2016-10-28 15:42:34 -0400102 const SkBlendMode modes[] = { // currently just doing the Modes expressible as Coeffs
103 SkBlendMode::kClear,
104 SkBlendMode::kSrc,
105 SkBlendMode::kDst,
106 SkBlendMode::kSrcOver,
107 SkBlendMode::kDstOver,
108 SkBlendMode::kSrcIn,
109 SkBlendMode::kDstIn,
110 SkBlendMode::kSrcOut,
111 SkBlendMode::kDstOut,
112 SkBlendMode::kSrcATop,
113 SkBlendMode::kDstATop,
114 SkBlendMode::kXor,
115 SkBlendMode::kPlus,
116 SkBlendMode::kModulate,
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000117 };
118
119 SkPaint paint;
120 int idx = 0;
mtkleindbfd7ab2016-09-01 11:24:54 -0700121 const int kRectsPerRow = SkMax32(this->getISize().fWidth / kRectWidth, 1);
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000122 for (size_t cfm = 0; cfm < SK_ARRAY_COUNT(modes); ++cfm) {
robertphillips@google.com93f03322012-12-03 17:35:19 +0000123 for (size_t cfc = 0; cfc < SK_ARRAY_COUNT(colors); ++cfc) {
reedd053ce92016-03-22 10:17:23 -0700124 paint.setColorFilter(SkColorFilter::MakeModeFilter(colors[cfc], modes[cfm]));
robertphillips@google.com93f03322012-12-03 17:35:19 +0000125 for (size_t s = 0; s < SK_ARRAY_COUNT(shaders); ++s) {
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000126 paint.setShader(shaders[s]);
halcanary96fcdcc2015-08-27 07:41:13 -0700127 bool hasShader = nullptr == paint.getShader();
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000128 int paintColorCnt = hasShader ? SK_ARRAY_COUNT(alphas) : SK_ARRAY_COUNT(colors);
129 SkColor* paintColors = hasShader ? alphas : colors;
130 for (int pc = 0; pc < paintColorCnt; ++pc) {
131 paint.setColor(paintColors[pc]);
132 SkScalar x = SkIntToScalar(idx % kRectsPerRow);
133 SkScalar y = SkIntToScalar(idx / kRectsPerRow);
134 SkRect rect = SkRect::MakeXYWH(x * kRectWidth, y * kRectHeight,
skia.committer@gmail.com306ab9d2012-12-13 02:01:33 +0000135 SkIntToScalar(kRectWidth),
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000136 SkIntToScalar(kRectHeight));
halcanary96fcdcc2015-08-27 07:41:13 -0700137 canvas->saveLayer(&rect, nullptr);
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000138 canvas->drawRect(rect, bgPaint);
139 canvas->drawRect(rect, paint);
vandebo@chromium.org8d8d9a52013-03-14 17:24:16 +0000140 canvas->restore();
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000141 ++idx;
142 }
143 }
144 }
145 }
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000146 }
147
148private:
reed1a9b9642016-03-13 14:13:58 -0700149 sk_sp<SkShader> fBmpShader;
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000150 typedef GM INHERITED;
151};
152
153//////////////////////////////////////////////////////////////////////////////
154
155static GM* MyFactory(void*) { return new ModeColorFilterGM; }
156static GMRegistry reg(MyFactory);
157
158}