diff --git a/third_party/txt/src/minikin/FontCollection.cpp b/third_party/txt/src/minikin/FontCollection.cpp index f4d18c0296252..812e1fd31a8c0 100644 --- a/third_party/txt/src/minikin/FontCollection.cpp +++ b/third_party/txt/src/minikin/FontCollection.cpp @@ -302,8 +302,7 @@ const std::shared_ptr& FontCollection::getFamilyForChar( // libtxt: check if the fallback font provider can match this character if (mFallbackFontProvider) { const std::shared_ptr& fallback = - mFallbackFontProvider->matchFallbackFont(ch, - GetFontLocale(langListId)); + findFallbackFont(ch, vs, langListId); if (fallback) { return fallback; } @@ -340,8 +339,7 @@ const std::shared_ptr& FontCollection::getFamilyForChar( // libtxt: check if the fallback font provider can match this character if (mFallbackFontProvider) { const std::shared_ptr& fallback = - mFallbackFontProvider->matchFallbackFont(ch, - GetFontLocale(langListId)); + findFallbackFont(ch, vs, langListId); if (fallback) { return fallback; } @@ -365,6 +363,30 @@ const std::shared_ptr& FontCollection::getFamilyForChar( : mFamilies[bestFamilyIndex]; } +const std::shared_ptr& FontCollection::findFallbackFont( + uint32_t ch, + uint32_t vs, + uint32_t langListId) const { + std::string locale = GetFontLocale(langListId); + + const auto it = mCachedFallbackFamilies.find(locale); + if (it != mCachedFallbackFamilies.end()) { + for (const auto& fallbackFamily : it->second) { + if (calcCoverageScore(ch, vs, fallbackFamily)) { + return fallbackFamily; + } + } + } + + const std::shared_ptr& fallback = + mFallbackFontProvider->matchFallbackFont(ch, GetFontLocale(langListId)); + + if (fallback) { + mCachedFallbackFamilies[locale].push_back(fallback); + } + return fallback; +} + const uint32_t NBSP = 0x00A0; const uint32_t SOFT_HYPHEN = 0x00AD; const uint32_t ZWJ = 0x200C; diff --git a/third_party/txt/src/minikin/FontCollection.h b/third_party/txt/src/minikin/FontCollection.h index 48365a64ac841..f79c24ba6fa06 100644 --- a/third_party/txt/src/minikin/FontCollection.h +++ b/third_party/txt/src/minikin/FontCollection.h @@ -17,6 +17,7 @@ #ifndef MINIKIN_FONT_COLLECTION_H #define MINIKIN_FONT_COLLECTION_H +#include #include #include #include @@ -100,6 +101,9 @@ class FontCollection { uint32_t langListId, int variant) const; + const std::shared_ptr& + findFallbackFont(uint32_t ch, uint32_t vs, uint32_t langListId) const; + uint32_t calcFamilyScore(uint32_t ch, uint32_t vs, int variant, @@ -148,6 +152,11 @@ class FontCollection { // libtxt extension: Fallback font provider. std::unique_ptr mFallbackFontProvider; + + // libtxt extension: Fallback fonts discovered after this font collection + // was constructed. + mutable std::map>> + mCachedFallbackFamilies; }; } // namespace minikin