blob: 0710ab84dbdd198b86516d1a61abbf4bbbef8a9a [file] [log] [blame]
Florin Malitab3418102020-10-15 18:10:29 -04001/*
2 * Copyright 2019 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 SkSVGText_DEFINED
9#define SkSVGText_DEFINED
10
Florin Malitaadc68892020-12-15 10:52:26 -050011#include <vector>
12
13#include "modules/svg/include/SkSVGTransformableNode.h"
Florin Malitab3418102020-10-15 18:10:29 -040014#include "modules/svg/include/SkSVGTypes.h"
15
Florin Malitaadc68892020-12-15 10:52:26 -050016class SkSVGTextContext;
17
18// Base class for text-rendering nodes.
19class SkSVGTextFragment : public SkSVGTransformableNode {
20public:
21 void renderText(const SkSVGRenderContext&, SkSVGTextContext*, SkSVGXmlSpace) const;
22
23protected:
24 explicit SkSVGTextFragment(SkSVGTag t) : INHERITED(t) {}
25
26 virtual void onRenderText(const SkSVGRenderContext&, SkSVGTextContext*,
27 SkSVGXmlSpace) const = 0;
28
29private:
30 SkPath onAsPath(const SkSVGRenderContext&) const final;
31
32 using INHERITED = SkSVGTransformableNode;
33};
34
Florin Malita512ff752020-12-06 11:50:52 -050035// Base class for nestable text containers (<text>, <tspan>, etc).
Florin Malitaadc68892020-12-15 10:52:26 -050036class SkSVGTextContainer : public SkSVGTextFragment {
Florin Malita512ff752020-12-06 11:50:52 -050037public:
38 // TODO: these should be arrays
39 SVG_ATTR(X, SkSVGLength, SkSVGLength(0))
40 SVG_ATTR(Y, SkSVGLength, SkSVGLength(0))
Florin Malitab3418102020-10-15 18:10:29 -040041
Florin Malita9c1f1be2020-12-09 13:02:50 -050042 SVG_ATTR(XmlSpace, SkSVGXmlSpace, SkSVGXmlSpace::kDefault)
43
Florin Malita512ff752020-12-06 11:50:52 -050044protected:
45 explicit SkSVGTextContainer(SkSVGTag t) : INHERITED(t) {}
Florin Malitab3418102020-10-15 18:10:29 -040046
Florin Malita512ff752020-12-06 11:50:52 -050047private:
48 void appendChild(sk_sp<SkSVGNode>) final;
Florin Malitaadc68892020-12-15 10:52:26 -050049 void onRender(const SkSVGRenderContext&) const final;
50 void onRenderText(const SkSVGRenderContext&, SkSVGTextContext*, SkSVGXmlSpace) const final;
Florin Malitab3418102020-10-15 18:10:29 -040051
Florin Malita512ff752020-12-06 11:50:52 -050052 bool parseAndSetAttribute(const char*, const char*) override;
Florin Malitab3418102020-10-15 18:10:29 -040053
Florin Malitaadc68892020-12-15 10:52:26 -050054 std::vector<sk_sp<SkSVGTextFragment>> fChildren;
55
56 using INHERITED = SkSVGTextFragment;
Florin Malita512ff752020-12-06 11:50:52 -050057};
Florin Malitab3418102020-10-15 18:10:29 -040058
Florin Malita512ff752020-12-06 11:50:52 -050059class SkSVGText final : public SkSVGTextContainer {
60public:
61 static sk_sp<SkSVGText> Make() { return sk_sp<SkSVGText>(new SkSVGText()); }
Florin Malitab3418102020-10-15 18:10:29 -040062
Florin Malita512ff752020-12-06 11:50:52 -050063private:
64 SkSVGText() : INHERITED(SkSVGTag::kText) {}
Florin Malitab3418102020-10-15 18:10:29 -040065
Florin Malita512ff752020-12-06 11:50:52 -050066 using INHERITED = SkSVGTextContainer;
67};
Florin Malita39fe8c82020-10-20 10:43:03 -040068
Florin Malita512ff752020-12-06 11:50:52 -050069class SkSVGTSpan final : public SkSVGTextContainer {
70public:
71 static sk_sp<SkSVGTSpan> Make() { return sk_sp<SkSVGTSpan>(new SkSVGTSpan()); }
72
73private:
74 SkSVGTSpan() : INHERITED(SkSVGTag::kTSpan) {}
75
76 using INHERITED = SkSVGTextContainer;
77};
78
Florin Malitaadc68892020-12-15 10:52:26 -050079class SkSVGTextLiteral final : public SkSVGTextFragment {
Florin Malita512ff752020-12-06 11:50:52 -050080public:
Florin Malita512ff752020-12-06 11:50:52 -050081 static sk_sp<SkSVGTextLiteral> Make() {
82 return sk_sp<SkSVGTextLiteral>(new SkSVGTextLiteral());
83 }
84
85 SVG_ATTR(Text, SkSVGStringType, SkSVGStringType())
86
87private:
88 SkSVGTextLiteral() : INHERITED(SkSVGTag::kTextLiteral) {}
89
Florin Malitaadc68892020-12-15 10:52:26 -050090 void onRender(const SkSVGRenderContext&) const override {}
91 void onRenderText(const SkSVGRenderContext&, SkSVGTextContext*, SkSVGXmlSpace) const override;
Florin Malita512ff752020-12-06 11:50:52 -050092
93 void appendChild(sk_sp<SkSVGNode>) override {}
94
Florin Malitaadc68892020-12-15 10:52:26 -050095 using INHERITED = SkSVGTextFragment;
Florin Malitab3418102020-10-15 18:10:29 -040096};
97
98#endif // SkSVGText_DEFINED