8#ifndef SkShaper_DEFINED
9#define SkShaper_DEFINED
27#if !defined(SKSHAPER_IMPLEMENTATION)
28 #define SKSHAPER_IMPLEMENTATION 0
31#if !defined(SKSHAPER_API)
32 #if defined(SKSHAPER_DLL)
34 #if SKSHAPER_IMPLEMENTATION
35 #define SKSHAPER_API __declspec(dllexport)
37 #define SKSHAPER_API __declspec(dllimport)
40 #define SKSHAPER_API __attribute__((visibility("default")))
49#if !defined(SK_DISABLE_LEGACY_SKSHAPER_FUNCTIONS)
50 static std::unique_ptr<SkShaper> MakePrimitive();
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();
58#if defined(SK_SHAPER_CORETEXT_AVAILABLE)
59 static std::unique_ptr<SkShaper> MakeCoreText();
63 static void PurgeCaches();
106 template <
typename RunIteratorSub
class>
107 class TrivialRunIterator :
public RunIteratorSubclass {
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; }
120 static std::unique_ptr<FontRunIterator>
121 MakeFontMgrRunIterator(
const char* utf8,
size_t utf8Bytes,
123 static std::unique_ptr<SkShaper::FontRunIterator>
124 MakeFontMgrRunIterator(
const char* utf8,
size_t utf8Bytes,
131 : TrivialRunIterator(utf8Bytes), fFont(font) {}
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);
149 : TrivialRunIterator(utf8Bytes), fBidiLevel(bidiLevel) {}
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);
164 static std::unique_ptr<ScriptRunIterator>
165 MakeHbIcuScriptRunIterator(
const char* utf8,
size_t utf8Bytes);
172 : TrivialRunIterator(utf8Bytes), fScript(script) {}
178 static std::unique_ptr<LanguageRunIterator>
179 MakeStdLanguageRunIterator(
const char* utf8,
size_t utf8Bytes);
183 : TrivialRunIterator(utf8Bytes), fLanguage(language) {}
194 constexpr Range() : fBegin(0), fSize(0) {}
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; }
221 virtual void beginLine() = 0;
224 virtual void runInfo(
const RunInfo&) = 0;
227 virtual void commitRunInfo() = 0;
233 virtual void commitRunBuffer(
const RunInfo&) = 0;
236 virtual void commitLine() = 0;
239#if !defined(SK_DISABLE_LEGACY_SKSHAPER_FUNCTIONS)
240 virtual void shape(
const char* utf8,
size_t utf8Bytes,
246 virtual void shape(
const char* utf8,
size_t utf8Bytes,
254 virtual void shape(
const char* utf8,
276 : fUtf8Text(utf8Text)
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;
290 char const *
const fUtf8Text;
304SKSHAPER_API std::unique_ptr<SkShaper::BiDiRunIterator> TrivialBiDiRunIterator
305 (
size_t utf8Bytes, uint8_t bidiLevel);
306SKSHAPER_API std::unique_ptr<SkShaper::ScriptRunIterator> TrivialScriptRunIterator
static std::unique_ptr< SkEncoder > Make(SkWStream *dst, const SkPixmap *src, const SkYUVAPixmaps *srcYUVA, const SkColorSpace *srcYUVAColorSpace, const SkJpegEncoder::Options &options)
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 size_t endOfCurrentRun() const =0
virtual ~RunIterator()=default
virtual SkFourByteTag currentScript() const =0
TrivialBiDiRunIterator(uint8_t bidiLevel, size_t utf8Bytes)
uint8_t currentLevel() const override
const SkFont & currentFont() const override
TrivialFontRunIterator(const SkFont &font, size_t utf8Bytes)
TrivialLanguageRunIterator(const char *language, size_t utf8Bytes)
const char * currentLanguage() const override
SkFourByteTag currentScript() const override
TrivialScriptRunIterator(SkFourByteTag script, size_t utf8Bytes)
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)
static const char * begin(const StringSlice &s)
constexpr size_t size() const
constexpr size_t begin() const
constexpr size_t end() const
constexpr Range(size_t begin, size_t size)