1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkShaper_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkShaper_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFourByteTag.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTextBlob.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 21*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 22*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 23*c8dee2aaSAndroid Build Coastguard Worker #include <type_traits> 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker class SkFontStyle; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DISABLE_LEGACY_SKSHAPER_FUNCTIONS) 28*c8dee2aaSAndroid Build Coastguard Worker class SkFontMgr; 29*c8dee2aaSAndroid Build Coastguard Worker #else 30*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontMgr.h" 31*c8dee2aaSAndroid Build Coastguard Worker #endif 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SKSHAPER_IMPLEMENTATION) 34*c8dee2aaSAndroid Build Coastguard Worker #define SKSHAPER_IMPLEMENTATION 0 35*c8dee2aaSAndroid Build Coastguard Worker #endif 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SKSHAPER_API) 38*c8dee2aaSAndroid Build Coastguard Worker #if defined(SKSHAPER_DLL) 39*c8dee2aaSAndroid Build Coastguard Worker #if defined(_MSC_VER) 40*c8dee2aaSAndroid Build Coastguard Worker #if SKSHAPER_IMPLEMENTATION 41*c8dee2aaSAndroid Build Coastguard Worker #define SKSHAPER_API __declspec(dllexport) 42*c8dee2aaSAndroid Build Coastguard Worker #else 43*c8dee2aaSAndroid Build Coastguard Worker #define SKSHAPER_API __declspec(dllimport) 44*c8dee2aaSAndroid Build Coastguard Worker #endif 45*c8dee2aaSAndroid Build Coastguard Worker #else 46*c8dee2aaSAndroid Build Coastguard Worker #define SKSHAPER_API __attribute__((visibility("default"))) 47*c8dee2aaSAndroid Build Coastguard Worker #endif 48*c8dee2aaSAndroid Build Coastguard Worker #else 49*c8dee2aaSAndroid Build Coastguard Worker #define SKSHAPER_API 50*c8dee2aaSAndroid Build Coastguard Worker #endif 51*c8dee2aaSAndroid Build Coastguard Worker #endif 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker class SKSHAPER_API SkShaper { 54*c8dee2aaSAndroid Build Coastguard Worker public: 55*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_DISABLE_LEGACY_SKSHAPER_FUNCTIONS) 56*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SkShaper> MakePrimitive(); 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_SHAPER_HARFBUZZ_AVAILABLE) 59*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SkShaper> MakeShaperDrivenWrapper(sk_sp<SkFontMgr> fallback); 60*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SkShaper> MakeShapeThenWrap(sk_sp<SkFontMgr> fallback); 61*c8dee2aaSAndroid Build Coastguard Worker static void PurgeHarfBuzzCache(); 62*c8dee2aaSAndroid Build Coastguard Worker #endif 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_SHAPER_CORETEXT_AVAILABLE) 65*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SkShaper> MakeCoreText(); 66*c8dee2aaSAndroid Build Coastguard Worker #endif 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SkShaper> Make(sk_sp<SkFontMgr> fallback = nullptr); 69*c8dee2aaSAndroid Build Coastguard Worker static void PurgeCaches(); 70*c8dee2aaSAndroid Build Coastguard Worker #endif // !defined(SK_DISABLE_LEGACY_SKSHAPER_FUNCTIONS) 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker SkShaper(); 73*c8dee2aaSAndroid Build Coastguard Worker virtual ~SkShaper(); 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker class RunIterator { 76*c8dee2aaSAndroid Build Coastguard Worker public: 77*c8dee2aaSAndroid Build Coastguard Worker virtual ~RunIterator() = default; 78*c8dee2aaSAndroid Build Coastguard Worker /** Set state to that of current run and move iterator to end of that run. */ 79*c8dee2aaSAndroid Build Coastguard Worker virtual void consume() = 0; 80*c8dee2aaSAndroid Build Coastguard Worker /** Offset to one past the last (utf8) element in the current run. */ 81*c8dee2aaSAndroid Build Coastguard Worker virtual size_t endOfCurrentRun() const = 0; 82*c8dee2aaSAndroid Build Coastguard Worker /** Return true if consume should no longer be called. */ 83*c8dee2aaSAndroid Build Coastguard Worker virtual bool atEnd() const = 0; 84*c8dee2aaSAndroid Build Coastguard Worker }; 85*c8dee2aaSAndroid Build Coastguard Worker class FontRunIterator : public RunIterator { 86*c8dee2aaSAndroid Build Coastguard Worker public: 87*c8dee2aaSAndroid Build Coastguard Worker virtual const SkFont& currentFont() const = 0; 88*c8dee2aaSAndroid Build Coastguard Worker }; 89*c8dee2aaSAndroid Build Coastguard Worker class BiDiRunIterator : public RunIterator { 90*c8dee2aaSAndroid Build Coastguard Worker public: 91*c8dee2aaSAndroid Build Coastguard Worker /** The unicode bidi embedding level (even ltr, odd rtl) */ 92*c8dee2aaSAndroid Build Coastguard Worker virtual uint8_t currentLevel() const = 0; 93*c8dee2aaSAndroid Build Coastguard Worker }; 94*c8dee2aaSAndroid Build Coastguard Worker class ScriptRunIterator : public RunIterator { 95*c8dee2aaSAndroid Build Coastguard Worker public: 96*c8dee2aaSAndroid Build Coastguard Worker /** Should be iso15924 codes. */ 97*c8dee2aaSAndroid Build Coastguard Worker virtual SkFourByteTag currentScript() const = 0; 98*c8dee2aaSAndroid Build Coastguard Worker }; 99*c8dee2aaSAndroid Build Coastguard Worker class LanguageRunIterator : public RunIterator { 100*c8dee2aaSAndroid Build Coastguard Worker public: 101*c8dee2aaSAndroid Build Coastguard Worker /** Should be BCP-47, c locale names may also work. */ 102*c8dee2aaSAndroid Build Coastguard Worker virtual const char* currentLanguage() const = 0; 103*c8dee2aaSAndroid Build Coastguard Worker }; 104*c8dee2aaSAndroid Build Coastguard Worker struct Feature { 105*c8dee2aaSAndroid Build Coastguard Worker SkFourByteTag tag; 106*c8dee2aaSAndroid Build Coastguard Worker uint32_t value; 107*c8dee2aaSAndroid Build Coastguard Worker size_t start; // Offset to the start (utf8) element of the run. 108*c8dee2aaSAndroid Build Coastguard Worker size_t end; // Offset to one past the last (utf8) element of the run. 109*c8dee2aaSAndroid Build Coastguard Worker }; 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker private: 112*c8dee2aaSAndroid Build Coastguard Worker template <typename RunIteratorSubclass> 113*c8dee2aaSAndroid Build Coastguard Worker class TrivialRunIterator : public RunIteratorSubclass { 114*c8dee2aaSAndroid Build Coastguard Worker public: 115*c8dee2aaSAndroid Build Coastguard Worker static_assert(std::is_base_of<RunIterator, RunIteratorSubclass>::value, ""); TrivialRunIterator(size_t utf8Bytes)116*c8dee2aaSAndroid Build Coastguard Worker TrivialRunIterator(size_t utf8Bytes) : fEnd(utf8Bytes), fAtEnd(fEnd == 0) {} consume()117*c8dee2aaSAndroid Build Coastguard Worker void consume() override { SkASSERT(!fAtEnd); fAtEnd = true; } endOfCurrentRun()118*c8dee2aaSAndroid Build Coastguard Worker size_t endOfCurrentRun() const override { return fAtEnd ? fEnd : 0; } atEnd()119*c8dee2aaSAndroid Build Coastguard Worker bool atEnd() const override { return fAtEnd; } 120*c8dee2aaSAndroid Build Coastguard Worker private: 121*c8dee2aaSAndroid Build Coastguard Worker size_t fEnd; 122*c8dee2aaSAndroid Build Coastguard Worker bool fAtEnd; 123*c8dee2aaSAndroid Build Coastguard Worker }; 124*c8dee2aaSAndroid Build Coastguard Worker 125*c8dee2aaSAndroid Build Coastguard Worker public: 126*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<FontRunIterator> 127*c8dee2aaSAndroid Build Coastguard Worker MakeFontMgrRunIterator(const char* utf8, size_t utf8Bytes, 128*c8dee2aaSAndroid Build Coastguard Worker const SkFont& font, sk_sp<SkFontMgr> fallback); 129*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SkShaper::FontRunIterator> 130*c8dee2aaSAndroid Build Coastguard Worker MakeFontMgrRunIterator(const char* utf8, size_t utf8Bytes, 131*c8dee2aaSAndroid Build Coastguard Worker const SkFont& font, sk_sp<SkFontMgr> fallback, 132*c8dee2aaSAndroid Build Coastguard Worker const char* requestName, SkFontStyle requestStyle, 133*c8dee2aaSAndroid Build Coastguard Worker const SkShaper::LanguageRunIterator*); 134*c8dee2aaSAndroid Build Coastguard Worker class TrivialFontRunIterator : public TrivialRunIterator<FontRunIterator> { 135*c8dee2aaSAndroid Build Coastguard Worker public: TrivialFontRunIterator(const SkFont & font,size_t utf8Bytes)136*c8dee2aaSAndroid Build Coastguard Worker TrivialFontRunIterator(const SkFont& font, size_t utf8Bytes) 137*c8dee2aaSAndroid Build Coastguard Worker : TrivialRunIterator(utf8Bytes), fFont(font) {} currentFont()138*c8dee2aaSAndroid Build Coastguard Worker const SkFont& currentFont() const override { return fFont; } 139*c8dee2aaSAndroid Build Coastguard Worker private: 140*c8dee2aaSAndroid Build Coastguard Worker SkFont fFont; 141*c8dee2aaSAndroid Build Coastguard Worker }; 142*c8dee2aaSAndroid Build Coastguard Worker 143*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_DISABLE_LEGACY_SKSHAPER_FUNCTIONS) 144*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<BiDiRunIterator> 145*c8dee2aaSAndroid Build Coastguard Worker MakeBiDiRunIterator(const char* utf8, size_t utf8Bytes, uint8_t bidiLevel); 146*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_SHAPER_UNICODE_AVAILABLE) 147*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<BiDiRunIterator> 148*c8dee2aaSAndroid Build Coastguard Worker MakeIcuBiDiRunIterator(const char* utf8, size_t utf8Bytes, uint8_t bidiLevel); 149*c8dee2aaSAndroid Build Coastguard Worker #endif // defined(SK_SHAPER_UNICODE_AVAILABLE) 150*c8dee2aaSAndroid Build Coastguard Worker #endif // !defined(SK_DISABLE_LEGACY_SKSHAPER_FUNCTIONS) 151*c8dee2aaSAndroid Build Coastguard Worker 152*c8dee2aaSAndroid Build Coastguard Worker class TrivialBiDiRunIterator : public TrivialRunIterator<BiDiRunIterator> { 153*c8dee2aaSAndroid Build Coastguard Worker public: TrivialBiDiRunIterator(uint8_t bidiLevel,size_t utf8Bytes)154*c8dee2aaSAndroid Build Coastguard Worker TrivialBiDiRunIterator(uint8_t bidiLevel, size_t utf8Bytes) 155*c8dee2aaSAndroid Build Coastguard Worker : TrivialRunIterator(utf8Bytes), fBidiLevel(bidiLevel) {} currentLevel()156*c8dee2aaSAndroid Build Coastguard Worker uint8_t currentLevel() const override { return fBidiLevel; } 157*c8dee2aaSAndroid Build Coastguard Worker private: 158*c8dee2aaSAndroid Build Coastguard Worker uint8_t fBidiLevel; 159*c8dee2aaSAndroid Build Coastguard Worker }; 160*c8dee2aaSAndroid Build Coastguard Worker 161*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_DISABLE_LEGACY_SKSHAPER_FUNCTIONS) 162*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<ScriptRunIterator> 163*c8dee2aaSAndroid Build Coastguard Worker MakeScriptRunIterator(const char* utf8, size_t utf8Bytes, SkFourByteTag script); 164*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_SHAPER_HARFBUZZ_AVAILABLE) 165*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<ScriptRunIterator> 166*c8dee2aaSAndroid Build Coastguard Worker MakeSkUnicodeHbScriptRunIterator(const char* utf8, size_t utf8Bytes); 167*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<ScriptRunIterator> 168*c8dee2aaSAndroid Build Coastguard Worker MakeSkUnicodeHbScriptRunIterator(const char* utf8, size_t utf8Bytes, SkFourByteTag script); 169*c8dee2aaSAndroid Build Coastguard Worker // Still used in some cases 170*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<ScriptRunIterator> 171*c8dee2aaSAndroid Build Coastguard Worker MakeHbIcuScriptRunIterator(const char* utf8, size_t utf8Bytes); 172*c8dee2aaSAndroid Build Coastguard Worker #endif // defined(SK_SHAPER_HARFBUZZ_AVAILABLE) 173*c8dee2aaSAndroid Build Coastguard Worker #endif // !defined(SK_DISABLE_LEGACY_SKSHAPER_FUNCTIONS) 174*c8dee2aaSAndroid Build Coastguard Worker 175*c8dee2aaSAndroid Build Coastguard Worker class TrivialScriptRunIterator : public TrivialRunIterator<ScriptRunIterator> { 176*c8dee2aaSAndroid Build Coastguard Worker public: TrivialScriptRunIterator(SkFourByteTag script,size_t utf8Bytes)177*c8dee2aaSAndroid Build Coastguard Worker TrivialScriptRunIterator(SkFourByteTag script, size_t utf8Bytes) 178*c8dee2aaSAndroid Build Coastguard Worker : TrivialRunIterator(utf8Bytes), fScript(script) {} currentScript()179*c8dee2aaSAndroid Build Coastguard Worker SkFourByteTag currentScript() const override { return fScript; } 180*c8dee2aaSAndroid Build Coastguard Worker private: 181*c8dee2aaSAndroid Build Coastguard Worker SkFourByteTag fScript; 182*c8dee2aaSAndroid Build Coastguard Worker }; 183*c8dee2aaSAndroid Build Coastguard Worker 184*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<LanguageRunIterator> 185*c8dee2aaSAndroid Build Coastguard Worker MakeStdLanguageRunIterator(const char* utf8, size_t utf8Bytes); 186*c8dee2aaSAndroid Build Coastguard Worker class TrivialLanguageRunIterator : public TrivialRunIterator<LanguageRunIterator> { 187*c8dee2aaSAndroid Build Coastguard Worker public: TrivialLanguageRunIterator(const char * language,size_t utf8Bytes)188*c8dee2aaSAndroid Build Coastguard Worker TrivialLanguageRunIterator(const char* language, size_t utf8Bytes) 189*c8dee2aaSAndroid Build Coastguard Worker : TrivialRunIterator(utf8Bytes), fLanguage(language) {} currentLanguage()190*c8dee2aaSAndroid Build Coastguard Worker const char* currentLanguage() const override { return fLanguage.c_str(); } 191*c8dee2aaSAndroid Build Coastguard Worker private: 192*c8dee2aaSAndroid Build Coastguard Worker SkString fLanguage; 193*c8dee2aaSAndroid Build Coastguard Worker }; 194*c8dee2aaSAndroid Build Coastguard Worker 195*c8dee2aaSAndroid Build Coastguard Worker class RunHandler { 196*c8dee2aaSAndroid Build Coastguard Worker public: 197*c8dee2aaSAndroid Build Coastguard Worker virtual ~RunHandler() = default; 198*c8dee2aaSAndroid Build Coastguard Worker 199*c8dee2aaSAndroid Build Coastguard Worker struct Range { RangeRange200*c8dee2aaSAndroid Build Coastguard Worker constexpr Range() : fBegin(0), fSize(0) {} RangeRange201*c8dee2aaSAndroid Build Coastguard Worker constexpr Range(size_t begin, size_t size) : fBegin(begin), fSize(size) {} 202*c8dee2aaSAndroid Build Coastguard Worker size_t fBegin; 203*c8dee2aaSAndroid Build Coastguard Worker size_t fSize; beginRange204*c8dee2aaSAndroid Build Coastguard Worker constexpr size_t begin() const { return fBegin; } endRange205*c8dee2aaSAndroid Build Coastguard Worker constexpr size_t end() const { return begin() + size(); } sizeRange206*c8dee2aaSAndroid Build Coastguard Worker constexpr size_t size() const { return fSize; } 207*c8dee2aaSAndroid Build Coastguard Worker }; 208*c8dee2aaSAndroid Build Coastguard Worker 209*c8dee2aaSAndroid Build Coastguard Worker struct RunInfo { 210*c8dee2aaSAndroid Build Coastguard Worker const SkFont& fFont; 211*c8dee2aaSAndroid Build Coastguard Worker uint8_t fBidiLevel; 212*c8dee2aaSAndroid Build Coastguard Worker SkVector fAdvance; 213*c8dee2aaSAndroid Build Coastguard Worker size_t glyphCount; 214*c8dee2aaSAndroid Build Coastguard Worker Range utf8Range; 215*c8dee2aaSAndroid Build Coastguard Worker }; 216*c8dee2aaSAndroid Build Coastguard Worker 217*c8dee2aaSAndroid Build Coastguard Worker struct Buffer { 218*c8dee2aaSAndroid Build Coastguard Worker SkGlyphID* glyphs; // required 219*c8dee2aaSAndroid Build Coastguard Worker SkPoint* positions; // required, if (!offsets) put glyphs[i] at positions[i] 220*c8dee2aaSAndroid Build Coastguard Worker // if ( offsets) positions[i+1]-positions[i] are advances 221*c8dee2aaSAndroid Build Coastguard Worker SkPoint* offsets; // optional, if ( offsets) put glyphs[i] at positions[i]+offsets[i] 222*c8dee2aaSAndroid Build Coastguard Worker uint32_t* clusters; // optional, utf8+clusters[i] starts run which produced glyphs[i] 223*c8dee2aaSAndroid Build Coastguard Worker SkPoint point; // offset to add to all positions 224*c8dee2aaSAndroid Build Coastguard Worker }; 225*c8dee2aaSAndroid Build Coastguard Worker 226*c8dee2aaSAndroid Build Coastguard Worker /** Called when beginning a line. */ 227*c8dee2aaSAndroid Build Coastguard Worker virtual void beginLine() = 0; 228*c8dee2aaSAndroid Build Coastguard Worker 229*c8dee2aaSAndroid Build Coastguard Worker /** Called once for each run in a line. Can compute baselines and offsets. */ 230*c8dee2aaSAndroid Build Coastguard Worker virtual void runInfo(const RunInfo&) = 0; 231*c8dee2aaSAndroid Build Coastguard Worker 232*c8dee2aaSAndroid Build Coastguard Worker /** Called after all runInfo calls for a line. */ 233*c8dee2aaSAndroid Build Coastguard Worker virtual void commitRunInfo() = 0; 234*c8dee2aaSAndroid Build Coastguard Worker 235*c8dee2aaSAndroid Build Coastguard Worker /** Called for each run in a line after commitRunInfo. The buffer will be filled out. */ 236*c8dee2aaSAndroid Build Coastguard Worker virtual Buffer runBuffer(const RunInfo&) = 0; 237*c8dee2aaSAndroid Build Coastguard Worker 238*c8dee2aaSAndroid Build Coastguard Worker /** Called after each runBuffer is filled out. */ 239*c8dee2aaSAndroid Build Coastguard Worker virtual void commitRunBuffer(const RunInfo&) = 0; 240*c8dee2aaSAndroid Build Coastguard Worker 241*c8dee2aaSAndroid Build Coastguard Worker /** Called when ending a line. */ 242*c8dee2aaSAndroid Build Coastguard Worker virtual void commitLine() = 0; 243*c8dee2aaSAndroid Build Coastguard Worker }; 244*c8dee2aaSAndroid Build Coastguard Worker 245*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_DISABLE_LEGACY_SKSHAPER_FUNCTIONS) 246*c8dee2aaSAndroid Build Coastguard Worker virtual void shape(const char* utf8, size_t utf8Bytes, 247*c8dee2aaSAndroid Build Coastguard Worker const SkFont& srcFont, 248*c8dee2aaSAndroid Build Coastguard Worker bool leftToRight, 249*c8dee2aaSAndroid Build Coastguard Worker SkScalar width, 250*c8dee2aaSAndroid Build Coastguard Worker RunHandler*) const = 0; 251*c8dee2aaSAndroid Build Coastguard Worker 252*c8dee2aaSAndroid Build Coastguard Worker virtual void shape(const char* utf8, size_t utf8Bytes, 253*c8dee2aaSAndroid Build Coastguard Worker FontRunIterator&, 254*c8dee2aaSAndroid Build Coastguard Worker BiDiRunIterator&, 255*c8dee2aaSAndroid Build Coastguard Worker ScriptRunIterator&, 256*c8dee2aaSAndroid Build Coastguard Worker LanguageRunIterator&, 257*c8dee2aaSAndroid Build Coastguard Worker SkScalar width, 258*c8dee2aaSAndroid Build Coastguard Worker RunHandler*) const = 0; 259*c8dee2aaSAndroid Build Coastguard Worker #endif 260*c8dee2aaSAndroid Build Coastguard Worker virtual void shape(const char* utf8, 261*c8dee2aaSAndroid Build Coastguard Worker size_t utf8Bytes, 262*c8dee2aaSAndroid Build Coastguard Worker FontRunIterator&, 263*c8dee2aaSAndroid Build Coastguard Worker BiDiRunIterator&, 264*c8dee2aaSAndroid Build Coastguard Worker ScriptRunIterator&, 265*c8dee2aaSAndroid Build Coastguard Worker LanguageRunIterator&, 266*c8dee2aaSAndroid Build Coastguard Worker const Feature* features, 267*c8dee2aaSAndroid Build Coastguard Worker size_t featuresSize, 268*c8dee2aaSAndroid Build Coastguard Worker SkScalar width, 269*c8dee2aaSAndroid Build Coastguard Worker RunHandler*) const = 0; 270*c8dee2aaSAndroid Build Coastguard Worker 271*c8dee2aaSAndroid Build Coastguard Worker private: 272*c8dee2aaSAndroid Build Coastguard Worker SkShaper(const SkShaper&) = delete; 273*c8dee2aaSAndroid Build Coastguard Worker SkShaper& operator=(const SkShaper&) = delete; 274*c8dee2aaSAndroid Build Coastguard Worker }; 275*c8dee2aaSAndroid Build Coastguard Worker 276*c8dee2aaSAndroid Build Coastguard Worker /** 277*c8dee2aaSAndroid Build Coastguard Worker * Helper for shaping text directly into a SkTextBlob. 278*c8dee2aaSAndroid Build Coastguard Worker */ 279*c8dee2aaSAndroid Build Coastguard Worker class SKSHAPER_API SkTextBlobBuilderRunHandler final : public SkShaper::RunHandler { 280*c8dee2aaSAndroid Build Coastguard Worker public: SkTextBlobBuilderRunHandler(const char * utf8Text,SkPoint offset)281*c8dee2aaSAndroid Build Coastguard Worker SkTextBlobBuilderRunHandler(const char* utf8Text, SkPoint offset) 282*c8dee2aaSAndroid Build Coastguard Worker : fUtf8Text(utf8Text) 283*c8dee2aaSAndroid Build Coastguard Worker , fOffset(offset) {} 284*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkTextBlob> makeBlob(); endPoint()285*c8dee2aaSAndroid Build Coastguard Worker SkPoint endPoint() { return fOffset; } 286*c8dee2aaSAndroid Build Coastguard Worker 287*c8dee2aaSAndroid Build Coastguard Worker void beginLine() override; 288*c8dee2aaSAndroid Build Coastguard Worker void runInfo(const RunInfo&) override; 289*c8dee2aaSAndroid Build Coastguard Worker void commitRunInfo() override; 290*c8dee2aaSAndroid Build Coastguard Worker Buffer runBuffer(const RunInfo&) override; 291*c8dee2aaSAndroid Build Coastguard Worker void commitRunBuffer(const RunInfo&) override; 292*c8dee2aaSAndroid Build Coastguard Worker void commitLine() override; 293*c8dee2aaSAndroid Build Coastguard Worker 294*c8dee2aaSAndroid Build Coastguard Worker private: 295*c8dee2aaSAndroid Build Coastguard Worker SkTextBlobBuilder fBuilder; 296*c8dee2aaSAndroid Build Coastguard Worker char const * const fUtf8Text; 297*c8dee2aaSAndroid Build Coastguard Worker uint32_t* fClusters; 298*c8dee2aaSAndroid Build Coastguard Worker int fClusterOffset; 299*c8dee2aaSAndroid Build Coastguard Worker int fGlyphCount; 300*c8dee2aaSAndroid Build Coastguard Worker SkScalar fMaxRunAscent; 301*c8dee2aaSAndroid Build Coastguard Worker SkScalar fMaxRunDescent; 302*c8dee2aaSAndroid Build Coastguard Worker SkScalar fMaxRunLeading; 303*c8dee2aaSAndroid Build Coastguard Worker SkPoint fCurrentPosition; 304*c8dee2aaSAndroid Build Coastguard Worker SkPoint fOffset; 305*c8dee2aaSAndroid Build Coastguard Worker }; 306*c8dee2aaSAndroid Build Coastguard Worker 307*c8dee2aaSAndroid Build Coastguard Worker namespace SkShapers::Primitive { 308*c8dee2aaSAndroid Build Coastguard Worker SKSHAPER_API std::unique_ptr<SkShaper> PrimitiveText(); 309*c8dee2aaSAndroid Build Coastguard Worker 310*c8dee2aaSAndroid Build Coastguard Worker SKSHAPER_API std::unique_ptr<SkShaper::BiDiRunIterator> TrivialBiDiRunIterator 311*c8dee2aaSAndroid Build Coastguard Worker (size_t utf8Bytes, uint8_t bidiLevel); 312*c8dee2aaSAndroid Build Coastguard Worker SKSHAPER_API std::unique_ptr<SkShaper::ScriptRunIterator> TrivialScriptRunIterator 313*c8dee2aaSAndroid Build Coastguard Worker (size_t utf8Bytes, SkFourByteTag scriptTag); 314*c8dee2aaSAndroid Build Coastguard Worker } // namespace SkShapers 315*c8dee2aaSAndroid Build Coastguard Worker 316*c8dee2aaSAndroid Build Coastguard Worker #endif // SkShaper_DEFINED 317