xref: /aosp_15_r20/external/skia/modules/sksg/include/SkSGPaint.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2017 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 SkSGPaint_DEFINED
9 #define SkSGPaint_DEFINED
10 
11 #include "include/core/SkBlendMode.h"
12 #include "include/core/SkColor.h"
13 #include "include/core/SkPaint.h"
14 #include "include/core/SkRect.h"
15 #include "include/core/SkRefCnt.h"
16 #include "include/core/SkScalar.h"
17 #include "modules/sksg/include/SkSGNode.h"
18 
19 class SkMatrix;
20 
21 namespace skottie::internal {
22 class AnimationBuilder;
23 } // namespace skottie::internal
24 
25 namespace sksg {
26 class InvalidationController;
27 class Shader;
28 
29 /**
30  * Base class for nodes which provide a 'paint' (as opposed to geometry) for
31  * drawing (e.g. colors, gradients, patterns).
32  *
33  * Roughly equivalent to Skia's SkPaint.
34  */
35 class PaintNode : public Node {
36 public:
37     SkPaint makePaint() const;
38 
39     SG_ATTRIBUTE(AntiAlias  , bool          , fAntiAlias  )
40     SG_ATTRIBUTE(Opacity    , SkScalar      , fOpacity    )
41     SG_ATTRIBUTE(BlendMode  , SkBlendMode   , fBlendMode  )
42     SG_ATTRIBUTE(StrokeWidth, SkScalar      , fStrokeWidth)
43     SG_ATTRIBUTE(StrokeMiter, SkScalar      , fStrokeMiter)
44     SG_ATTRIBUTE(Style      , SkPaint::Style, fStyle      )
45     SG_ATTRIBUTE(StrokeJoin , SkPaint::Join , fStrokeJoin )
46     SG_ATTRIBUTE(StrokeCap  , SkPaint::Cap  , fStrokeCap  )
47 
48 protected:
49     PaintNode();
50 
51     virtual void onApplyToPaint(SkPaint*) const = 0;
52 
53 private:
54     SkScalar       fOpacity     = 1,
55                    fStrokeWidth = 1,
56                    fStrokeMiter = 4;
57     bool           fAntiAlias   = false;
58     SkBlendMode    fBlendMode   = SkBlendMode::kSrcOver;
59     SkPaint::Style fStyle       = SkPaint::kFill_Style;
60     SkPaint::Join  fStrokeJoin  = SkPaint::kMiter_Join;
61     SkPaint::Cap   fStrokeCap   = SkPaint::kButt_Cap;
62 
63     using INHERITED = Node;
64 };
65 
66 /**
67  * Concrete Paint node, wrapping an SkColor.
68  */
69 class Color : public PaintNode {
70 public:
71     static sk_sp<Color> Make(SkColor c);
72 
73     SG_ATTRIBUTE(Color, SkColor, fColor)
74 
75 protected:
76     SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
77 
78     void onApplyToPaint(SkPaint*) const override;
79 
80 private:
81     explicit Color(SkColor);
82 
83     SkColor fColor;
84 
85     friend class skottie::internal::AnimationBuilder;
86 };
87 
88 /**
89  * Shader-based paint.
90  */
91 class ShaderPaint final : public PaintNode {
92 public:
93     ~ShaderPaint() override;
94 
95     static sk_sp<ShaderPaint> Make(sk_sp<Shader>);
96 
97 protected:
98     SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
99 
100     void onApplyToPaint(SkPaint*) const override;
101 
102 private:
103     explicit ShaderPaint(sk_sp<Shader>);
104 
105     const sk_sp<Shader> fShader;
106 
107     using INHERITED = PaintNode;
108 };
109 
110 }  // namespace sksg
111 
112 #endif // SkSGPaint_DEFINED
113