/* * Copyright 2019 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkSVGText_DEFINED #define SkSVGText_DEFINED #include #include "modules/svg/include/SkSVGTransformableNode.h" #include "modules/svg/include/SkSVGTypes.h" class SkSVGTextContext; // Base class for text-rendering nodes. class SkSVGTextFragment : public SkSVGTransformableNode { public: void renderText(const SkSVGRenderContext&, SkSVGTextContext*, SkSVGXmlSpace) const; protected: explicit SkSVGTextFragment(SkSVGTag t) : INHERITED(t) {} virtual void onShapeText(const SkSVGRenderContext&, SkSVGTextContext*, SkSVGXmlSpace) const = 0; // Text nodes other than the root element are not rendered directly. void onRender(const SkSVGRenderContext&) const override {} private: SkPath onAsPath(const SkSVGRenderContext&) const override; using INHERITED = SkSVGTransformableNode; }; // Base class for nestable text containers (, , etc). class SkSVGTextContainer : public SkSVGTextFragment { public: SVG_ATTR(X, std::vector, {}) SVG_ATTR(Y, std::vector, {}) SVG_ATTR(Dx, std::vector, {}) SVG_ATTR(Dy, std::vector, {}) SVG_ATTR(Rotate, std::vector, {}) SVG_ATTR(XmlSpace, SkSVGXmlSpace, SkSVGXmlSpace::kDefault) void appendChild(sk_sp) final; protected: explicit SkSVGTextContainer(SkSVGTag t) : INHERITED(t) {} void onShapeText(const SkSVGRenderContext&, SkSVGTextContext*, SkSVGXmlSpace) const override; bool parseAndSetAttribute(const char*, const char*) override; private: std::vector> fChildren; using INHERITED = SkSVGTextFragment; }; class SkSVGText final : public SkSVGTextContainer { public: static sk_sp Make() { return sk_sp(new SkSVGText()); } private: SkSVGText() : INHERITED(SkSVGTag::kText) {} void onRender(const SkSVGRenderContext&) const override; SkRect onObjectBoundingBox(const SkSVGRenderContext&) const override; SkPath onAsPath(const SkSVGRenderContext&) const override; using INHERITED = SkSVGTextContainer; }; class SkSVGTSpan final : public SkSVGTextContainer { public: static sk_sp Make() { return sk_sp(new SkSVGTSpan()); } private: SkSVGTSpan() : INHERITED(SkSVGTag::kTSpan) {} using INHERITED = SkSVGTextContainer; }; class SkSVGTextLiteral final : public SkSVGTextFragment { public: static sk_sp Make() { return sk_sp(new SkSVGTextLiteral()); } SVG_ATTR(Text, SkSVGStringType, SkSVGStringType()) private: SkSVGTextLiteral() : INHERITED(SkSVGTag::kTextLiteral) {} void onShapeText(const SkSVGRenderContext&, SkSVGTextContext*, SkSVGXmlSpace) const override; void appendChild(sk_sp) override {} using INHERITED = SkSVGTextFragment; }; class SkSVGTextPath final : public SkSVGTextContainer { public: static sk_sp Make() { return sk_sp(new SkSVGTextPath()); } SVG_ATTR(Href , SkSVGIRI , {} ) SVG_ATTR(StartOffset, SkSVGLength, SkSVGLength(0)) private: SkSVGTextPath() : INHERITED(SkSVGTag::kTextPath) {} void onShapeText(const SkSVGRenderContext&, SkSVGTextContext*, SkSVGXmlSpace) const override; bool parseAndSetAttribute(const char*, const char*) override; using INHERITED = SkSVGTextContainer; }; #endif // SkSVGText_DEFINED