From 0170fa0ebec6e08ad2b6184e6fcd737b8e4dfbca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E8=8E=B9?= Date: Mon, 21 Oct 2019 20:58:12 +0800 Subject: [PATCH 1/2] fix loading fallback font-family takes too much time --- .../txt/src/minikin/FontCollection.cpp | 21 +++++++++++++++++++ third_party/txt/src/minikin/FontCollection.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/third_party/txt/src/minikin/FontCollection.cpp b/third_party/txt/src/minikin/FontCollection.cpp index f4d18c0296252..8c3ea1bed8ccc 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,19 @@ 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 +351,19 @@ 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 { From 91ea4920da052d64faadec69dad57931614adcab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E8=8E=B9?= Date: Mon, 21 Oct 2019 21:37:05 +0800 Subject: [PATCH 2/2] fix clang-format checks failure --- third_party/txt/src/minikin/FontCollection.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/third_party/txt/src/minikin/FontCollection.cpp b/third_party/txt/src/minikin/FontCollection.cpp index 8c3ea1bed8ccc..8d046227b6da1 100644 --- a/third_party/txt/src/minikin/FontCollection.cpp +++ b/third_party/txt/src/minikin/FontCollection.cpp @@ -307,7 +307,8 @@ const std::shared_ptr& FontCollection::getFamilyForChar( 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]); + const uint32_t score = + calcFamilyScore(ch, vs, variant, langListId, sFallbackFamilies[i]); if (score >= kMinFallbackScore) { return sFallbackFamilies[i]; } @@ -352,7 +353,8 @@ 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]); + const uint32_t score = + calcFamilyScore(ch, vs, variant, langListId, sFallbackFamilies[i]); if (score >= kMinFallbackScore) { return sFallbackFamilies[i]; }