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