23#if !defined(SK_DISABLE_LEGACY_SKSHAPER_FUNCTIONS)
25#if defined(SK_SHAPER_HARFBUZZ_AVAILABLE)
29#if defined(SK_SHAPER_CORETEXT_AVAILABLE)
35#if !defined(SK_DISABLE_LEGACY_SKSHAPER_FUNCTIONS)
37#if defined(SK_SHAPER_HARFBUZZ_AVAILABLE) && defined(SK_SHAPER_UNICODE_AVAILABLE)
38 std::unique_ptr<SkShaper> shaper = MakeShapeThenWrap(std::move(fallback));
42#elif defined(SK_SHAPER_CORETEXT_AVAILABLE)
47 return SkShapers::Primitive::PrimitiveText();
51#if defined(SK_SHAPER_HARFBUZZ_AVAILABLE) && defined(SK_SHAPER_UNICODE_AVAILABLE)
56std::unique_ptr<SkShaper::BiDiRunIterator>
58#if defined(SK_SHAPER_UNICODE_AVAILABLE)
59 std::unique_ptr<SkShaper::BiDiRunIterator> bidi = MakeIcuBiDiRunIterator(utf8, utf8Bytes, bidiLevel);
64 return std::make_unique<SkShaper::TrivialBiDiRunIterator>(bidiLevel, utf8Bytes);
67std::unique_ptr<SkShaper::ScriptRunIterator>
69#if defined(SK_SHAPER_HARFBUZZ_AVAILABLE) && defined(SK_SHAPER_UNICODE_AVAILABLE)
70 std::unique_ptr<SkShaper::ScriptRunIterator> script =
76 return std::make_unique<SkShaper::TrivialScriptRunIterator>(scriptTag, utf8Bytes);
86 return val < 0 ? 0xFFFD : val;
95 : fCurrent(utf8), fBegin(utf8), fEnd(fCurrent + utf8Bytes)
96 , fFallbackMgr(
std::move(fallbackMgr))
98 , fFallbackFont(fFont)
99 , fCurrentFont(nullptr)
100 , fRequestName(requestName)
101 , fRequestStyle(requestStyle)
112 nullptr, font.getTypeface()->fontStyle(), nullptr)
121 fCurrentFont = &fFont;
124 fCurrentFont = &fFallbackFont;
127 const char* language = fLanguage ? fLanguage->
currentLanguage() :
nullptr;
128 int languageCount = fLanguage ? 1 : 0;
130 fRequestName, fRequestStyle, &language, languageCount, u));
133 fCurrentFont = &fFallbackFont;
135 fCurrentFont = &fFont;
139 while (fCurrent < fEnd) {
140 const char*
prev = fCurrent;
151 const char* language = fLanguage ? fLanguage->
currentLanguage() :
nullptr;
152 int languageCount = fLanguage ? 1 : 0;
154 fRequestName, fRequestStyle, &language, languageCount, u));
163 return fCurrent - fBegin;
166 return fCurrent == fEnd;
170 return *fCurrentFont;
174 char const * fCurrent;
175 char const *
const fBegin;
176 char const *
const fEnd;
181 char const *
const fRequestName;
186std::unique_ptr<SkShaper::FontRunIterator>
190 return std::make_unique<FontMgrRunIterator>(utf8, utf8Bytes, font, std::move(fallback));
193std::unique_ptr<SkShaper::FontRunIterator>
199 return std::make_unique<FontMgrRunIterator>(utf8, utf8Bytes, font, std::move(fallback),
200 requestName, requestStyle, language);
203std::unique_ptr<SkShaper::LanguageRunIterator>
205 return std::make_unique<TrivialLanguageRunIterator>(std::locale().
name().c_str(), utf8Bytes);
209 fCurrentPosition = fOffset;
216 info.fFont.getMetrics(&metrics);
217 fMaxRunAscent = std::min(fMaxRunAscent, metrics.
fAscent);
218 fMaxRunDescent = std::max(fMaxRunDescent, metrics.
fDescent);
219 fMaxRunLeading = std::max(fMaxRunLeading, metrics.
fLeading);
223 fCurrentPosition.
fY -= fMaxRunAscent;
227 int glyphCount = SkTFitsIn<int>(
info.glyphCount) ?
info.glyphCount : INT_MAX;
228 int utf8RangeSize = SkTFitsIn<int>(
info.utf8Range.size()) ?
info.utf8Range.size() : INT_MAX;
232 memcpy(
runBuffer.utf8text, fUtf8Text +
info.utf8Range.begin(), utf8RangeSize);
235 fGlyphCount = glyphCount;
236 fClusterOffset =
info.utf8Range.begin();
247 for (
int i = 0; i < fGlyphCount; ++i) {
248 SkASSERT(fClusters[i] >= (
unsigned)fClusterOffset);
249 fClusters[i] -= fClusterOffset;
251 fCurrentPosition +=
info.fAdvance;
254 fOffset += { 0, fMaxRunDescent + fMaxRunLeading - fMaxRunAscent };
258 return fBuilder.
make();
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
static float prev(float f)
static SkUnichar utf8_next(const char **ptr, const char *end)
size_t endOfCurrentRun() const override
FontMgrRunIterator(const char *utf8, size_t utf8Bytes, const SkFont &font, sk_sp< SkFontMgr > fallbackMgr)
const SkFont & currentFont() const override
FontMgrRunIterator(const char *utf8, size_t utf8Bytes, const SkFont &font, sk_sp< SkFontMgr > fallbackMgr, const char *requestName, SkFontStyle requestStyle, const SkShaper::LanguageRunIterator *lang)
bool atEnd() const override
sk_sp< SkTypeface > matchFamilyStyleCharacter(const char familyName[], const SkFontStyle &, const char *bcp47[], int bcp47Count, SkUnichar character) const
SkTypeface * getTypeface() const
void setTypeface(sk_sp< SkTypeface > tf)
SkGlyphID unicharToGlyph(SkUnichar uni) const
virtual const char * currentLanguage() const =0
virtual size_t endOfCurrentRun() const =0
static std::unique_ptr< SkShaper > Make(sk_sp< SkFontMgr > fallback=nullptr)
static std::unique_ptr< ScriptRunIterator > MakeScriptRunIterator(const char *utf8, size_t utf8Bytes, SkFourByteTag script)
static std::unique_ptr< FontRunIterator > MakeFontMgrRunIterator(const char *utf8, size_t utf8Bytes, const SkFont &font, sk_sp< SkFontMgr > fallback)
static std::unique_ptr< LanguageRunIterator > MakeStdLanguageRunIterator(const char *utf8, size_t utf8Bytes)
static void PurgeCaches()
static std::unique_ptr< BiDiRunIterator > MakeBiDiRunIterator(const char *utf8, size_t utf8Bytes, uint8_t bidiLevel)
void commitLine() override
void beginLine() override
void commitRunInfo() override
void runInfo(const RunInfo &) override
Buffer runBuffer(const RunInfo &) override
void commitRunBuffer(const RunInfo &) override
sk_sp< SkTextBlob > makeBlob()
sk_sp< SkTextBlob > make()
const RunBuffer & allocRunTextPos(const SkFont &font, int count, int textByteCount, const SkRect *bounds=nullptr)
SKSHAPER_API std::unique_ptr< SkShaper > CoreText()
SKSHAPER_API void PurgeCaches()
SKSHAPER_API std::unique_ptr< SkShaper::ScriptRunIterator > ScriptRunIterator(const char *utf8, size_t utf8Bytes)
SK_SPI SkUnichar NextUTF8(const char **ptr, const char *end)
SkScalar fLeading
distance to add between lines, typically positive or zero
SkScalar fAscent
distance to reserve above baseline, typically negative
SkScalar fDescent
distance to reserve below baseline, typically positive