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