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