diff --git a/third_party/txt/src/minikin/FontCollection.cpp b/third_party/txt/src/minikin/FontCollection.cpp index f4d18c0296252..8d046227b6da1 100644 --- a/third_party/txt/src/minikin/FontCollection.cpp +++ b/third_party/txt/src/minikin/FontCollection.cpp @@ -45,6 +45,9 @@ const uint32_t TEXT_STYLE_VS = 0xFE0E; uint32_t FontCollection::sNextId = 0; +const uint32_t kMinFallbackScore = 0x20000000; +std::vector> sFallbackFamilies; + // libtxt: return a locale string for a language list ID std::string GetFontLocale(uint32_t langListId) { const FontLanguages& langs = FontLanguageListCache::getById(langListId); @@ -64,6 +67,10 @@ FontCollection::FontCollection( init(typefaces); } +FontCollection::~FontCollection() { + sFallbackFamilies.clear(); +} + void FontCollection::init( const vector>& typefaces) { std::scoped_lock _l(gMinikinLock); @@ -299,12 +306,20 @@ const std::shared_ptr& FontCollection::getFamilyForChar( uint32_t langListId, int variant) const { if (ch >= mMaxChar) { + for (size_t i = 0; i < sFallbackFamilies.size(); i++) { + const uint32_t score = + calcFamilyScore(ch, vs, variant, langListId, sFallbackFamilies[i]); + if (score >= kMinFallbackScore) { + return sFallbackFamilies[i]; + } + } // libtxt: check if the fallback font provider can match this character if (mFallbackFontProvider) { const std::shared_ptr& fallback = mFallbackFontProvider->matchFallbackFont(ch, GetFontLocale(langListId)); if (fallback) { + sFallbackFamilies.push_back(fallback); return fallback; } } @@ -337,12 +352,20 @@ const std::shared_ptr& FontCollection::getFamilyForChar( } } if (bestFamilyIndex == -1) { + for (size_t i = 0; i < sFallbackFamilies.size(); i++) { + const uint32_t score = + calcFamilyScore(ch, vs, variant, langListId, sFallbackFamilies[i]); + if (score >= kMinFallbackScore) { + return sFallbackFamilies[i]; + } + } // libtxt: check if the fallback font provider can match this character if (mFallbackFontProvider) { const std::shared_ptr& fallback = mFallbackFontProvider->matchFallbackFont(ch, GetFontLocale(langListId)); if (fallback) { + sFallbackFamilies.push_back(fallback); return fallback; } } diff --git a/third_party/txt/src/minikin/FontCollection.h b/third_party/txt/src/minikin/FontCollection.h index 48365a64ac841..142777dc87cfc 100644 --- a/third_party/txt/src/minikin/FontCollection.h +++ b/third_party/txt/src/minikin/FontCollection.h @@ -32,6 +32,8 @@ class FontCollection { const std::vector>& typefaces); explicit FontCollection(std::shared_ptr&& typeface); + ~FontCollection(); + // libtxt extension: an interface for looking up fallback fonts for characters // that do not match this collection's font families. class FallbackFontProvider {