/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkShaper_DEFINED #define SkShaper_DEFINED #include <memory> #include "SkPoint.h" #include "SkSpan.h" #include "SkTextBlob.h" #include "SkTypeface.h" class SkFont; /** Shapes text using HarfBuzz and places the shaped text into a client-managed buffer. If compiled without HarfBuzz, fall back on SkPaint::textToGlyphs. */ class SkShaper { public: static std::unique_ptr<SkShaper> MakePrimitive(); #ifdef SK_SHAPER_HARFBUZZ_AVAILABLE static std::unique_ptr<SkShaper> MakeHarfBuzz(); #endif static std::unique_ptr<SkShaper> Make(); SkShaper(); virtual ~SkShaper(); class RunHandler { public: virtual ~RunHandler() = default; struct RunInfo { SkVector fAdvance; SkScalar fAscent, fDescent, fLeading; }; struct Buffer { SkGlyphID* glyphs; // required SkPoint* positions; // required uint32_t* clusters; // optional }; // Callback per glyph run. virtual Buffer newRunBuffer(const RunInfo&, const SkFont&, int glyphCount, SkSpan<const char> utf8) = 0; // Called after run information is filled out. virtual void commitRun() = 0; // Callback per line. virtual void commitLine() = 0; }; virtual SkPoint shape(RunHandler* handler, const SkFont& srcFont, const char* utf8text, size_t textBytes, bool leftToRight, SkPoint point, SkScalar width) const = 0; private: SkShaper(const SkShaper&) = delete; SkShaper& operator=(const SkShaper&) = delete; }; /** * Helper for shaping text directly into a SkTextBlob. */ class SkTextBlobBuilderRunHandler final : public SkShaper::RunHandler { public: SkTextBlobBuilderRunHandler(const char* utf8Text) : fUtf8Text(utf8Text) {} sk_sp<SkTextBlob> makeBlob(); SkShaper::RunHandler::Buffer newRunBuffer(const RunInfo&, const SkFont&, int, SkSpan<const char>) override; void commitRun() override; void commitLine() override {} private: SkTextBlobBuilder fBuilder; char const * const fUtf8Text; uint32_t* fClusters; int fClusterOffset; int fGlyphCount; }; #endif // SkShaper_DEFINED