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