blob: ffffa600356ee9e2a074e4e131e82184cbb0fb84 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkBitmap.h"
10#include "include/core/SkBlendMode.h"
11#include "include/core/SkCanvas.h"
12#include "include/core/SkColor.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/core/SkColorFilter.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040014#include "include/core/SkPaint.h"
15#include "include/core/SkPoint.h"
16#include "include/core/SkRect.h"
17#include "include/core/SkRefCnt.h"
18#include "include/core/SkScalar.h"
19#include "include/core/SkShader.h"
20#include "include/core/SkSize.h"
21#include "include/core/SkString.h"
22#include "include/core/SkTileMode.h"
23#include "include/core/SkTypes.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050024#include "include/effects/SkGradientShader.h"
25#include "tools/ToolUtils.h"
bsalomon@google.comc6126c12012-10-19 19:26:05 +000026
27#define WIDTH 512
28#define HEIGHT 1024
29
30namespace skiagm {
31
32// Using gradients because GPU doesn't currently have an implementation of SkColorShader (duh!)
reed1a9b9642016-03-13 14:13:58 -070033static sk_sp<SkShader> make_color_shader(SkColor color) {
mtkleindbfd7ab2016-09-01 11:24:54 -070034 constexpr SkPoint kPts[] = {{0, 0}, {1, 1}};
bsalomon@google.comc6126c12012-10-19 19:26:05 +000035 SkColor colors[] = {color, color};
36
Mike Reedfae8fce2019-04-03 10:27:45 -040037 return SkGradientShader::MakeLinear(kPts, colors, nullptr, 2, SkTileMode::kClamp);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000038}
39
reed1a9b9642016-03-13 14:13:58 -070040static sk_sp<SkShader> make_solid_shader() {
caryclark12596012015-07-29 05:27:47 -070041 return make_color_shader(SkColorSetARGB(0xFF, 0x42, 0x82, 0x21));
bsalomon@google.comc6126c12012-10-19 19:26:05 +000042}
43
reed1a9b9642016-03-13 14:13:58 -070044static sk_sp<SkShader> make_transparent_shader() {
bsalomon@google.comc6126c12012-10-19 19:26:05 +000045 return make_color_shader(SkColorSetARGB(0x80, 0x10, 0x70, 0x20));
46}
47
reed1a9b9642016-03-13 14:13:58 -070048static sk_sp<SkShader> make_trans_black_shader() {
bsalomon@google.comc6126c12012-10-19 19:26:05 +000049 return make_color_shader(0x0);
50}
51
52// draws a background behind each test rect to see transparency
reed1a9b9642016-03-13 14:13:58 -070053static sk_sp<SkShader> make_bg_shader(int checkSize) {
bsalomon@google.comc6126c12012-10-19 19:26:05 +000054 SkBitmap bmp;
reed@google.comeb9a46c2014-01-25 16:46:20 +000055 bmp.allocN32Pixels(2 * checkSize, 2 * checkSize);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000056 SkCanvas canvas(bmp);
Mike Kleinea3f0142019-03-20 11:12:10 -050057 canvas.clear(ToolUtils::color_to_565(0xFF800000));
bsalomon@google.comc6126c12012-10-19 19:26:05 +000058 SkPaint paint;
Mike Kleinea3f0142019-03-20 11:12:10 -050059 paint.setColor(ToolUtils::color_to_565(0xFF000080));
bsalomon@google.comc6126c12012-10-19 19:26:05 +000060 SkRect rect0 = SkRect::MakeXYWH(0, 0,
61 SkIntToScalar(checkSize), SkIntToScalar(checkSize));
62 SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(checkSize), SkIntToScalar(checkSize),
63 SkIntToScalar(checkSize), SkIntToScalar(checkSize));
64 canvas.drawRect(rect1, paint);
65 canvas.drawRect(rect0, paint);
Mike Reed50acf8f2019-04-08 13:20:23 -040066 return bmp.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000067}
68
69class ModeColorFilterGM : public GM {
70public:
71 ModeColorFilterGM() {
Mike Kleind46dce32018-08-16 10:17:03 -040072 this->setBGColor(0xFF303030);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000073 }
74
75protected:
reed1a9b9642016-03-13 14:13:58 -070076 SkString onShortName() override {
bsalomon@google.comc6126c12012-10-19 19:26:05 +000077 return SkString("modecolorfilters");
78 }
79
reed1a9b9642016-03-13 14:13:58 -070080 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070081 return SkISize::Make(WIDTH, HEIGHT);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000082 }
83
reed1a9b9642016-03-13 14:13:58 -070084 void onDraw(SkCanvas* canvas) override {
bsalomon@google.comc6126c12012-10-19 19:26:05 +000085 // size of rect for each test case
mtkleindbfd7ab2016-09-01 11:24:54 -070086 constexpr int kRectWidth = 20;
87 constexpr int kRectHeight = 20;
bsalomon@google.comc6126c12012-10-19 19:26:05 +000088
mtkleindbfd7ab2016-09-01 11:24:54 -070089 constexpr int kCheckSize = 10;
bsalomon@google.comc6126c12012-10-19 19:26:05 +000090
91 if (!fBmpShader) {
reed1a9b9642016-03-13 14:13:58 -070092 fBmpShader = make_bg_shader(kCheckSize);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000093 }
94 SkPaint bgPaint;
95 bgPaint.setShader(fBmpShader);
reed374772b2016-10-05 17:33:02 -070096 bgPaint.setBlendMode(SkBlendMode::kSrc);
bsalomon@google.comc6126c12012-10-19 19:26:05 +000097
reed1a9b9642016-03-13 14:13:58 -070098 sk_sp<SkShader> shaders[] = {
halcanary96fcdcc2015-08-27 07:41:13 -070099 nullptr, // use a paint color instead of a shader
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000100 make_solid_shader(),
101 make_transparent_shader(),
102 make_trans_black_shader(),
103 };
104
105 // used without shader
106 SkColor colors[] = {
107 SkColorSetARGB(0xFF, 0xFF, 0xFF, 0xFF),
108 SkColorSetARGB(0xFF, 0x00, 0x00, 0x00),
109 SkColorSetARGB(0x00, 0x00, 0x00, 0x00),
caryclark12596012015-07-29 05:27:47 -0700110 SkColorSetARGB(0xFF, 0x10, 0x20, 0x42),
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000111 SkColorSetARGB(0xA0, 0x20, 0x30, 0x90),
112 };
113
114 // used with shaders
115 SkColor alphas[] = {0xFFFFFFFF, 0x80808080};
skia.committer@gmail.com24c29d92012-10-20 02:01:23 +0000116
Mike Reed7d954ad2016-10-28 15:42:34 -0400117 const SkBlendMode modes[] = { // currently just doing the Modes expressible as Coeffs
118 SkBlendMode::kClear,
119 SkBlendMode::kSrc,
120 SkBlendMode::kDst,
121 SkBlendMode::kSrcOver,
122 SkBlendMode::kDstOver,
123 SkBlendMode::kSrcIn,
124 SkBlendMode::kDstIn,
125 SkBlendMode::kSrcOut,
126 SkBlendMode::kDstOut,
127 SkBlendMode::kSrcATop,
128 SkBlendMode::kDstATop,
129 SkBlendMode::kXor,
130 SkBlendMode::kPlus,
131 SkBlendMode::kModulate,
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000132 };
133
134 SkPaint paint;
135 int idx = 0;
Brian Osman7f364052020-02-06 11:25:43 -0500136 const int kRectsPerRow = std::max(this->getISize().fWidth / kRectWidth, 1);
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000137 for (size_t cfm = 0; cfm < SK_ARRAY_COUNT(modes); ++cfm) {
robertphillips@google.com93f03322012-12-03 17:35:19 +0000138 for (size_t cfc = 0; cfc < SK_ARRAY_COUNT(colors); ++cfc) {
Mike Reedb286bc22019-04-08 16:23:20 -0400139 paint.setColorFilter(SkColorFilters::Blend(colors[cfc], modes[cfm]));
robertphillips@google.com93f03322012-12-03 17:35:19 +0000140 for (size_t s = 0; s < SK_ARRAY_COUNT(shaders); ++s) {
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000141 paint.setShader(shaders[s]);
halcanary96fcdcc2015-08-27 07:41:13 -0700142 bool hasShader = nullptr == paint.getShader();
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000143 int paintColorCnt = hasShader ? SK_ARRAY_COUNT(alphas) : SK_ARRAY_COUNT(colors);
144 SkColor* paintColors = hasShader ? alphas : colors;
145 for (int pc = 0; pc < paintColorCnt; ++pc) {
146 paint.setColor(paintColors[pc]);
147 SkScalar x = SkIntToScalar(idx % kRectsPerRow);
148 SkScalar y = SkIntToScalar(idx / kRectsPerRow);
149 SkRect rect = SkRect::MakeXYWH(x * kRectWidth, y * kRectHeight,
skia.committer@gmail.com306ab9d2012-12-13 02:01:33 +0000150 SkIntToScalar(kRectWidth),
robertphillips@google.comca47aae2012-12-12 15:58:25 +0000151 SkIntToScalar(kRectHeight));
halcanary96fcdcc2015-08-27 07:41:13 -0700152 canvas->saveLayer(&rect, nullptr);
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000153 canvas->drawRect(rect, bgPaint);
154 canvas->drawRect(rect, paint);
vandebo@chromium.org8d8d9a52013-03-14 17:24:16 +0000155 canvas->restore();
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000156 ++idx;
157 }
158 }
159 }
160 }
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000161 }
162
163private:
reed1a9b9642016-03-13 14:13:58 -0700164 sk_sp<SkShader> fBmpShader;
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000165 typedef GM INHERITED;
166};
167
168//////////////////////////////////////////////////////////////////////////////
169
Hal Canarye964c182019-01-23 10:22:01 -0500170DEF_GM( return new ModeColorFilterGM; )
bsalomon@google.comc6126c12012-10-19 19:26:05 +0000171
172}