xref: /aosp_15_r20/external/skia/gm/emptyshader.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2024 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/shaders/SkEmptyShader.h"
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm {
16*c8dee2aaSAndroid Build Coastguard Worker 
17*c8dee2aaSAndroid Build Coastguard Worker namespace {
18*c8dee2aaSAndroid Build Coastguard Worker 
empty(SkRect r)19*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkShader> empty(SkRect r) { return sk_make_sp<SkEmptyShader>(); }
20*c8dee2aaSAndroid Build Coastguard Worker 
degen_sweep(SkRect r)21*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkShader> degen_sweep(SkRect r) {
22*c8dee2aaSAndroid Build Coastguard Worker     // A too small angle between start and end falls back to an empty shader
23*c8dee2aaSAndroid Build Coastguard Worker     const float startAngle = 0.0f;
24*c8dee2aaSAndroid Build Coastguard Worker     const float endAngle = nextafter(startAngle, 360.0f);
25*c8dee2aaSAndroid Build Coastguard Worker     const SkColor colors[2] = { SK_ColorRED, SK_ColorGREEN };
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker     return SkGradientShader::MakeSweep(r.centerX(), r.centerY(),
28*c8dee2aaSAndroid Build Coastguard Worker                                        colors,
29*c8dee2aaSAndroid Build Coastguard Worker                                        /* pos= */ nullptr,
30*c8dee2aaSAndroid Build Coastguard Worker                                        std::size(colors),
31*c8dee2aaSAndroid Build Coastguard Worker                                        SkTileMode::kDecal,
32*c8dee2aaSAndroid Build Coastguard Worker                                        startAngle, endAngle,
33*c8dee2aaSAndroid Build Coastguard Worker                                        /* flags= */ 0,
34*c8dee2aaSAndroid Build Coastguard Worker                                        /* localMatrix= */ nullptr);
35*c8dee2aaSAndroid Build Coastguard Worker }
36*c8dee2aaSAndroid Build Coastguard Worker 
degen_linear(SkRect r)37*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkShader> degen_linear(SkRect r) {
38*c8dee2aaSAndroid Build Coastguard Worker     // Having the two positions be the same causes a fallback to an empty shader
39*c8dee2aaSAndroid Build Coastguard Worker     const SkPoint pts[2] = { r.center(), r.center() };
40*c8dee2aaSAndroid Build Coastguard Worker     const SkColor colors[2] = { SK_ColorRED, SK_ColorGREEN };
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker     return SkGradientShader::MakeLinear(pts,
43*c8dee2aaSAndroid Build Coastguard Worker                                         colors,
44*c8dee2aaSAndroid Build Coastguard Worker                                         /* pos= */ nullptr,
45*c8dee2aaSAndroid Build Coastguard Worker                                         std::size(colors),
46*c8dee2aaSAndroid Build Coastguard Worker                                         SkTileMode::kDecal);
47*c8dee2aaSAndroid Build Coastguard Worker }
48*c8dee2aaSAndroid Build Coastguard Worker 
degen_radial(SkRect r)49*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkShader> degen_radial(SkRect r) {
50*c8dee2aaSAndroid Build Coastguard Worker     const SkColor colors[2] = { SK_ColorRED, SK_ColorGREEN };
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker     // Having a radius of 0.0 causes a fallback to an empty shader
53*c8dee2aaSAndroid Build Coastguard Worker     return SkGradientShader::MakeRadial(r.center(),
54*c8dee2aaSAndroid Build Coastguard Worker                                         /* radius= */ 0.0f,
55*c8dee2aaSAndroid Build Coastguard Worker                                         colors,
56*c8dee2aaSAndroid Build Coastguard Worker                                         /* pos= */ nullptr,
57*c8dee2aaSAndroid Build Coastguard Worker                                         std::size(colors),
58*c8dee2aaSAndroid Build Coastguard Worker                                         SkTileMode::kDecal);
59*c8dee2aaSAndroid Build Coastguard Worker }
60*c8dee2aaSAndroid Build Coastguard Worker 
degen_conical(SkRect r)61*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkShader> degen_conical(SkRect r) {
62*c8dee2aaSAndroid Build Coastguard Worker     const SkColor colors[2] = {SK_ColorRED, SK_ColorGREEN};
63*c8dee2aaSAndroid Build Coastguard Worker 
64*c8dee2aaSAndroid Build Coastguard Worker     // Having the start and end radii be the same causes a fallback to an empty shader
65*c8dee2aaSAndroid Build Coastguard Worker     return SkGradientShader::MakeTwoPointConical(r.center(), /* startRadius= */ 0.0f,
66*c8dee2aaSAndroid Build Coastguard Worker                                                  r.center(), /* endRadius= */ 0.0f,
67*c8dee2aaSAndroid Build Coastguard Worker                                                  colors,
68*c8dee2aaSAndroid Build Coastguard Worker                                                  /* pos= */ nullptr,
69*c8dee2aaSAndroid Build Coastguard Worker                                                  std::size(colors),
70*c8dee2aaSAndroid Build Coastguard Worker                                                  SkTileMode::kDecal);
71*c8dee2aaSAndroid Build Coastguard Worker }
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker } // anonymous namespace
74*c8dee2aaSAndroid Build Coastguard Worker 
75*c8dee2aaSAndroid Build Coastguard Worker class EmptyShaderGM : public GM {
76*c8dee2aaSAndroid Build Coastguard Worker public:
EmptyShaderGM()77*c8dee2aaSAndroid Build Coastguard Worker     EmptyShaderGM() {
78*c8dee2aaSAndroid Build Coastguard Worker         this->setBGColor(0xFFCCCCCC);
79*c8dee2aaSAndroid Build Coastguard Worker     }
80*c8dee2aaSAndroid Build Coastguard Worker 
81*c8dee2aaSAndroid Build Coastguard Worker protected:
getName() const82*c8dee2aaSAndroid Build Coastguard Worker     SkString getName() const override { return SkString("emptyshader"); }
83*c8dee2aaSAndroid Build Coastguard Worker 
getISize()84*c8dee2aaSAndroid Build Coastguard Worker     SkISize getISize() override { return SkISize::Make(128, 88); }
85*c8dee2aaSAndroid Build Coastguard Worker 
onDraw(SkCanvas * canvas)86*c8dee2aaSAndroid Build Coastguard Worker     void onDraw(SkCanvas* canvas) override {
87*c8dee2aaSAndroid Build Coastguard Worker         SkPaint stroke;
88*c8dee2aaSAndroid Build Coastguard Worker         stroke.setStyle(SkPaint::kStroke_Style);
89*c8dee2aaSAndroid Build Coastguard Worker 
90*c8dee2aaSAndroid Build Coastguard Worker         int left = kPad, top = kPad;
91*c8dee2aaSAndroid Build Coastguard Worker         for (auto f : { empty, degen_sweep, degen_linear, degen_radial, degen_conical }) {
92*c8dee2aaSAndroid Build Coastguard Worker             SkRect r = SkRect::MakeXYWH(left, top, kSize, kSize);
93*c8dee2aaSAndroid Build Coastguard Worker 
94*c8dee2aaSAndroid Build Coastguard Worker             SkPaint p;
95*c8dee2aaSAndroid Build Coastguard Worker             p.setColor(SK_ColorBLUE);
96*c8dee2aaSAndroid Build Coastguard Worker             p.setShader(f(r));
97*c8dee2aaSAndroid Build Coastguard Worker 
98*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(r, p);
99*c8dee2aaSAndroid Build Coastguard Worker             canvas->drawRect(r, stroke);
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker             left += kSize + kPad;
102*c8dee2aaSAndroid Build Coastguard Worker             if (left >= this->getISize().width()) {
103*c8dee2aaSAndroid Build Coastguard Worker                 left = kPad;
104*c8dee2aaSAndroid Build Coastguard Worker                 top += kSize + kPad;
105*c8dee2aaSAndroid Build Coastguard Worker             }
106*c8dee2aaSAndroid Build Coastguard Worker         }
107*c8dee2aaSAndroid Build Coastguard Worker     }
108*c8dee2aaSAndroid Build Coastguard Worker 
109*c8dee2aaSAndroid Build Coastguard Worker private:
110*c8dee2aaSAndroid Build Coastguard Worker     static constexpr int kPad = 8;
111*c8dee2aaSAndroid Build Coastguard Worker     static constexpr int kSize = 32;
112*c8dee2aaSAndroid Build Coastguard Worker };
113*c8dee2aaSAndroid Build Coastguard Worker 
114*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
115*c8dee2aaSAndroid Build Coastguard Worker 
116*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new EmptyShaderGM;)
117*c8dee2aaSAndroid Build Coastguard Worker 
118*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skiagm
119