/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkSGText_DEFINED #define SkSGText_DEFINED #include "SkSGGeometryNode.h" #include "SkFont.h" #include "SkPoint.h" #include "SkString.h" #include "SkTextBlob.h" #include "SkTextUtils.h" class SkCanvas; class SkPaint; class SkTypeface; namespace sksg { /** * Concrete Geometry node, wrapping a (shaped) SkTextBlob. */ class Text final : public GeometryNode { public: static sk_sp Make(sk_sp tf, const SkString& text); ~Text() override; SG_ATTRIBUTE(Typeface, sk_sp , fTypeface) SG_ATTRIBUTE(Text , SkString , fText ) SG_ATTRIBUTE(Position, SkPoint , fPosition) SG_ATTRIBUTE(Size , SkScalar , fSize ) SG_ATTRIBUTE(ScaleX , SkScalar , fScaleX ) SG_ATTRIBUTE(SkewX , SkScalar , fSkewX ) SG_ATTRIBUTE(Align , SkTextUtils::Align, fAlign ) SG_ATTRIBUTE(Edging , SkFont::Edging , fEdging ) SG_ATTRIBUTE(Hinting , SkFontHinting , fHinting ) // TODO: add shaping functionality. protected: void onClip(SkCanvas*, bool antiAlias) const override; void onDraw(SkCanvas*, const SkPaint&) const override; SkRect onRevalidate(InvalidationController*, const SkMatrix&) override; SkPath onAsPath() const override; private: Text(sk_sp, const SkString&); SkPoint alignedPosition(SkScalar advance) const; sk_sp fTypeface; SkString fText; SkPoint fPosition = SkPoint::Make(0, 0); SkScalar fSize = 12; SkScalar fScaleX = 1; SkScalar fSkewX = 0; SkTextUtils::Align fAlign = SkTextUtils::kLeft_Align; SkFont::Edging fEdging = SkFont::Edging::kAntiAlias; SkFontHinting fHinting = kNormal_SkFontHinting; sk_sp fBlob; // cached text blob using INHERITED = GeometryNode; }; /** * Concrete Geometry node, wrapping an external SkTextBlob. */ class TextBlob final : public GeometryNode { public: static sk_sp Make(sk_sp = nullptr); ~TextBlob() override; SG_ATTRIBUTE(Blob , sk_sp, fBlob ) SG_ATTRIBUTE(Position, SkPoint , fPosition) protected: void onClip(SkCanvas*, bool antiAlias) const override; void onDraw(SkCanvas*, const SkPaint&) const override; SkRect onRevalidate(InvalidationController*, const SkMatrix&) override; SkPath onAsPath() const override; private: explicit TextBlob(sk_sp); sk_sp fBlob; SkPoint fPosition = SkPoint::Make(0, 0); using INHERITED = GeometryNode; }; } // namespace sksg #endif // SkSGText_DEFINED