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