2 * Copyright 2012 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
9 #include "SkColorFilter.h"
10 #include "SkGradientShader.h"
17 // Using gradients because GPU doesn't currently have an implementation of SkColorShader (duh!)
18 static sk_sp<SkShader> make_color_shader(SkColor color) {
19 constexpr SkPoint kPts[] = {{0, 0}, {1, 1}};
20 SkColor colors[] = {color, color};
22 return SkGradientShader::MakeLinear(kPts, colors, nullptr, 2, SkShader::kClamp_TileMode);
25 static sk_sp<SkShader> make_solid_shader() {
26 return make_color_shader(SkColorSetARGB(0xFF, 0x42, 0x82, 0x21));
29 static sk_sp<SkShader> make_transparent_shader() {
30 return make_color_shader(SkColorSetARGB(0x80, 0x10, 0x70, 0x20));
33 static sk_sp<SkShader> make_trans_black_shader() {
34 return make_color_shader(0x0);
37 // draws a background behind each test rect to see transparency
38 static sk_sp<SkShader> make_bg_shader(int checkSize) {
40 bmp.allocN32Pixels(2 * checkSize, 2 * checkSize);
42 canvas.clear(sk_tool_utils::color_to_565(0xFF800000));
44 paint.setColor(sk_tool_utils::color_to_565(0xFF000080));
45 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);
51 return SkShader::MakeBitmapShader(bmp, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);
54 class ModeColorFilterGM : public GM {
57 this->setBGColor(sk_tool_utils::color_to_565(0xFF303030));
61 SkString onShortName() override {
62 return SkString("modecolorfilters");
65 SkISize onISize() override {
66 return SkISize::Make(WIDTH, HEIGHT);
69 void onDraw(SkCanvas* canvas) override {
70 // size of rect for each test case
71 constexpr int kRectWidth = 20;
72 constexpr int kRectHeight = 20;
74 constexpr int kCheckSize = 10;
77 fBmpShader = make_bg_shader(kCheckSize);
80 bgPaint.setShader(fBmpShader);
81 bgPaint.setBlendMode(SkBlendMode::kSrc);
83 sk_sp<SkShader> shaders[] = {
84 nullptr, // use a paint color instead of a shader
86 make_transparent_shader(),
87 make_trans_black_shader(),
90 // used without shader
92 SkColorSetARGB(0xFF, 0xFF, 0xFF, 0xFF),
93 SkColorSetARGB(0xFF, 0x00, 0x00, 0x00),
94 SkColorSetARGB(0x00, 0x00, 0x00, 0x00),
95 SkColorSetARGB(0xFF, 0x10, 0x20, 0x42),
96 SkColorSetARGB(0xA0, 0x20, 0x30, 0x90),
100 SkColor alphas[] = {0xFFFFFFFF, 0x80808080};
102 SkXfermode::Mode modes[] = { // currently just doing the Modes expressible as Coeffs
103 SkXfermode::kClear_Mode,
104 SkXfermode::kSrc_Mode,
105 SkXfermode::kDst_Mode,
106 SkXfermode::kSrcOver_Mode,
107 SkXfermode::kDstOver_Mode,
108 SkXfermode::kSrcIn_Mode,
109 SkXfermode::kDstIn_Mode,
110 SkXfermode::kSrcOut_Mode,
111 SkXfermode::kDstOut_Mode,
112 SkXfermode::kSrcATop_Mode,
113 SkXfermode::kDstATop_Mode,
114 SkXfermode::kXor_Mode,
115 SkXfermode::kPlus_Mode,
116 SkXfermode::kModulate_Mode,
121 const int kRectsPerRow = SkMax32(this->getISize().fWidth / kRectWidth, 1);
122 for (size_t cfm = 0; cfm < SK_ARRAY_COUNT(modes); ++cfm) {
123 for (size_t cfc = 0; cfc < SK_ARRAY_COUNT(colors); ++cfc) {
124 paint.setColorFilter(SkColorFilter::MakeModeFilter(colors[cfc], modes[cfm]));
125 for (size_t s = 0; s < SK_ARRAY_COUNT(shaders); ++s) {
126 paint.setShader(shaders[s]);
127 bool hasShader = nullptr == paint.getShader();
128 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,
135 SkIntToScalar(kRectWidth),
136 SkIntToScalar(kRectHeight));
137 canvas->saveLayer(&rect, nullptr);
138 canvas->drawRect(rect, bgPaint);
139 canvas->drawRect(rect, paint);
149 sk_sp<SkShader> fBmpShader;
150 typedef GM INHERITED;
153 //////////////////////////////////////////////////////////////////////////////
155 static GM* MyFactory(void*) { return new ModeColorFilterGM; }
156 static GMRegistry reg(MyFactory);