blob: 2ea9170858e1c3b64d091ae8d3ca8aed088e183e [file] [log] [blame]
Hal Canary6c8422c2020-01-10 15:22:09 -05001// Copyright 2020 Google LLC.
2// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3#include "tools/fiddle/examples.h"
4REG_FIDDLE(BlendModes, 256, 4352, false, 0) {
5void drawBG(SkCanvas* canvas) {
6 SkColor radColors[] = {0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF};
7 auto rad = SkGradientShader::MakeRadial(SkPoint::Make(128, 128), 128, radColors, nullptr, 3,
8 SkTileMode::kClamp);
9
10 SkMatrix rotMtx;
11 rotMtx.setRotate(-90, 128, 128);
12 SkColor sweepColors[] = {0xFFFF00FF, 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00,
13 0xFF00FFFF, 0xFF0000FF, 0xFFFF00FF};
14 auto sweep = SkGradientShader::MakeSweep(128, 128, sweepColors, nullptr, 7, 0, &rotMtx);
15
16 auto comp = SkShaders::Blend(SkBlendMode::kModulate, std::move(rad), std::move(sweep));
17 SkPaint p;
18 p.setShader(std::move(comp));
19
20 canvas->drawPaint(p);
21}
22
23void draw(SkCanvas* canvas) {
24 SkBlendMode blendModes[] = {
25 SkBlendMode::kDst,
26 SkBlendMode::kSrc,
27 SkBlendMode::kSrcOver,
28 SkBlendMode::kDstOver,
29 SkBlendMode::kSrcIn,
30 SkBlendMode::kDstIn,
31 SkBlendMode::kSrcOut,
32 SkBlendMode::kDstOut,
33 SkBlendMode::kSrcATop,
34 SkBlendMode::kDstATop,
35 SkBlendMode::kXor,
36 SkBlendMode::kPlus,
37 SkBlendMode::kModulate,
38 SkBlendMode::kScreen,
39 SkBlendMode::kOverlay,
40 SkBlendMode::kDarken,
41 SkBlendMode::kLighten,
42 };
43
44 SkPaint labelPaint;
45 labelPaint.setAntiAlias(true);
46 SkFont font(nullptr, 12);
47
48 for (auto mode : blendModes) {
49 SkPaint layerPaint;
50 layerPaint.setBlendMode(mode);
51
52 canvas->save();
53 canvas->clipRect(SkRect::MakeWH(256, 256));
54
55 drawBG(canvas);
56
57 canvas->saveLayer(nullptr, &layerPaint);
58 const SkScalar r = 80;
59 SkPaint discP;
60 discP.setAntiAlias(true);
61 discP.setBlendMode(SkBlendMode::kPlus);
62 discP.setColor(SK_ColorGREEN); canvas->drawCircle(128, r, r, discP);
63 discP.setColor(SK_ColorRED); canvas->drawCircle(r, 256 - r, r, discP);
64 discP.setColor(SK_ColorBLUE); canvas->drawCircle(256 - r, 256 - r, r, discP);
65 canvas->restore();
66
67 canvas->drawSimpleText(SkBlendMode_Name(mode), strlen(SkBlendMode_Name(mode)),
68 SkTextEncoding::kUTF8, 10, 10, font, labelPaint);
69 canvas->restore();
70 canvas->translate(0, 256);
71 }
72}
73} // END FIDDLE