xref: /aosp_15_r20/external/skia/modules/skshaper/include/SkShaper.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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