xref: /aosp_15_r20/external/skia/modules/sksg/include/SkSGGradient.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2018 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkSGGradient_DEFINED
9 #define SkSGGradient_DEFINED
10 
11 #include "include/core/SkColor.h"
12 #include "include/core/SkPoint.h"
13 #include "include/core/SkRefCnt.h"
14 #include "include/core/SkScalar.h"
15 #include "include/core/SkTileMode.h"
16 #include "modules/sksg/include/SkSGNode.h"
17 #include "modules/sksg/include/SkSGRenderEffect.h"
18 
19 #include <vector>
20 
21 class SkShader;
22 
23 namespace sksg {
24 
25 /**
26  * Gradient base class.
27  */
28 class Gradient : public Shader {
29 public:
30     struct ColorStop {
31         SkScalar  fPosition;
32         SkColor4f fColor;
33 
34         bool operator==(const ColorStop& other) const {
35             return fPosition == other.fPosition && fColor == other.fColor;
36         }
37     };
38 
39     SG_ATTRIBUTE(ColorStops, std::vector<ColorStop>, fColorStops)
40     SG_ATTRIBUTE(TileMode  , SkTileMode            , fTileMode  )
41 
42 protected:
43     sk_sp<SkShader> onRevalidateShader() final;
44 
45     virtual sk_sp<SkShader> onMakeShader(const std::vector<SkColor4f>& colors,
46                                          const std::vector<SkScalar >& positions) const = 0;
47 
48 protected:
49     Gradient() = default;
50 
51 private:
52     std::vector<ColorStop> fColorStops;
53     SkTileMode             fTileMode = SkTileMode::kClamp;
54 
55     using INHERITED = Shader;
56 };
57 
58 class LinearGradient final : public Gradient {
59 public:
Make()60     static sk_sp<LinearGradient> Make() {
61         return sk_sp<LinearGradient>(new LinearGradient());
62     }
63 
64     SG_ATTRIBUTE(StartPoint, SkPoint, fStartPoint)
65     SG_ATTRIBUTE(EndPoint  , SkPoint, fEndPoint  )
66 
67 protected:
68     sk_sp<SkShader> onMakeShader(const std::vector<SkColor4f>&,
69                                  const std::vector<SkScalar >&) const override;
70 
71 private:
72     LinearGradient() = default;
73 
74     SkPoint fStartPoint = SkPoint::Make(0, 0),
75             fEndPoint   = SkPoint::Make(0, 0);
76 
77     using INHERITED = Gradient;
78 };
79 
80 class RadialGradient final : public Gradient {
81 public:
Make()82     static sk_sp<RadialGradient> Make() {
83         return sk_sp<RadialGradient>(new RadialGradient());
84     }
85 
86     SG_ATTRIBUTE(StartCenter, SkPoint , fStartCenter)
87     SG_ATTRIBUTE(EndCenter  , SkPoint , fEndCenter  )
88     SG_ATTRIBUTE(StartRadius, SkScalar, fStartRadius)
89     SG_ATTRIBUTE(EndRadius  , SkScalar, fEndRadius  )
90 
91 protected:
92     sk_sp<SkShader> onMakeShader(const std::vector<SkColor4f>&,
93                                  const std::vector<SkScalar >&) const override;
94 
95 private:
96     RadialGradient() = default;
97 
98     SkPoint  fStartCenter = SkPoint::Make(0, 0),
99              fEndCenter   = SkPoint::Make(0, 0);
100     SkScalar fStartRadius = 0,
101              fEndRadius   = 0;
102 
103     using INHERITED = Gradient;
104 };
105 
106 } // namespace sksg
107 
108 #endif // SkSGGradient_DEFINED
109