• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 SkSGText_DEFINED
9 #define SkSGText_DEFINED
10 
11 #include "modules/sksg/include/SkSGGeometryNode.h"
12 
13 #include "include/core/SkFont.h"
14 #include "include/core/SkPoint.h"
15 #include "include/core/SkString.h"
16 #include "include/core/SkTextBlob.h"
17 #include "include/utils/SkTextUtils.h"
18 
19 class SkCanvas;
20 class SkPaint;
21 class SkTypeface;
22 
23 namespace sksg {
24 
25 /**
26  * Concrete Geometry node, wrapping a (shaped) SkTextBlob.
27  */
28 class Text final : public GeometryNode {
29 public:
30     static sk_sp<Text> Make(sk_sp<SkTypeface> tf, const SkString& text);
31     ~Text() override;
32 
33     SG_ATTRIBUTE(Typeface, sk_sp<SkTypeface> , fTypeface)
34     SG_ATTRIBUTE(Text    , SkString          , fText    )
35     SG_ATTRIBUTE(Position, SkPoint           , fPosition)
36     SG_ATTRIBUTE(Size    , SkScalar          , fSize    )
37     SG_ATTRIBUTE(ScaleX  , SkScalar          , fScaleX  )
38     SG_ATTRIBUTE(SkewX   , SkScalar          , fSkewX   )
39     SG_ATTRIBUTE(Align   , SkTextUtils::Align, fAlign   )
40     SG_ATTRIBUTE(Edging  , SkFont::Edging    , fEdging  )
41     SG_ATTRIBUTE(Hinting , SkFontHinting     , fHinting )
42 
43     // TODO: add shaping functionality.
44 
45 protected:
46     void onClip(SkCanvas*, bool antiAlias) const override;
47     void onDraw(SkCanvas*, const SkPaint&) const override;
48     bool onContains(const SkPoint&)        const override;
49 
50     SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
51     SkPath onAsPath() const override;
52 
53 private:
54     Text(sk_sp<SkTypeface>, const SkString&);
55 
56     SkPoint alignedPosition(SkScalar advance) const;
57 
58     sk_sp<SkTypeface> fTypeface;
59     SkString                fText;
60     SkPoint                 fPosition = SkPoint::Make(0, 0);
61     SkScalar                fSize     = 12;
62     SkScalar                fScaleX   = 1;
63     SkScalar                fSkewX    = 0;
64     SkTextUtils::Align      fAlign    = SkTextUtils::kLeft_Align;
65     SkFont::Edging          fEdging   = SkFont::Edging::kAntiAlias;
66     SkFontHinting           fHinting  = SkFontHinting::kNormal;
67 
68     sk_sp<SkTextBlob> fBlob; // cached text blob
69 
70     using INHERITED = GeometryNode;
71 };
72 
73 /**
74  * Concrete Geometry node, wrapping an external SkTextBlob.
75  */
76 class TextBlob final : public GeometryNode {
77 public:
78     static sk_sp<TextBlob> Make(sk_sp<SkTextBlob> = nullptr);
79     ~TextBlob() override;
80 
81     SG_ATTRIBUTE(Blob    , sk_sp<SkTextBlob>, fBlob    )
82     SG_ATTRIBUTE(Position, SkPoint          , fPosition)
83 
84 protected:
85     void onClip(SkCanvas*, bool antiAlias) const override;
86     void onDraw(SkCanvas*, const SkPaint&) const override;
87     bool onContains(const SkPoint&)        const override;
88 
89     SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
90     SkPath onAsPath() const override;
91 
92 private:
93     explicit TextBlob(sk_sp<SkTextBlob>);
94 
95     sk_sp<SkTextBlob> fBlob;
96     SkPoint           fPosition = SkPoint::Make(0, 0);
97 
98     using INHERITED = GeometryNode;
99 };
100 } // namespace sksg
101 
102 #endif // SkSGText_DEFINED
103