1cb93a386Sopenharmony_ci// Copyright 2019 Google LLC. 2cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 3cb93a386Sopenharmony_ci#include "modules/skparagraph/include/FontCollection.h" 4cb93a386Sopenharmony_ci#include "modules/skparagraph/include/Paragraph.h" 5cb93a386Sopenharmony_ci#include "modules/skparagraph/src/ParagraphImpl.h" 6cb93a386Sopenharmony_ci#include "modules/skshaper/include/SkShaper.h" 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_cinamespace skia { 9cb93a386Sopenharmony_cinamespace textlayout { 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_cinamespace { 12cb93a386Sopenharmony_ci#ifdef USE_SKIA_TXT 13cb93a386Sopenharmony_cistd::shared_ptr<RSTypeface> RSLegacyMakeTypeface( 14cb93a386Sopenharmony_ci std::shared_ptr<RSFontMgr> fontMgr, const char familyName[], RSFontStyle style) 15cb93a386Sopenharmony_ci{ 16cb93a386Sopenharmony_ci RSTypeface* typeface = fontMgr->MatchFamilyStyle(familyName, style); 17cb93a386Sopenharmony_ci if (typeface == nullptr && familyName != nullptr) { 18cb93a386Sopenharmony_ci typeface = fontMgr->MatchFamilyStyle(nullptr, style); 19cb93a386Sopenharmony_ci } 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ci if (typeface) { 22cb93a386Sopenharmony_ci return std::shared_ptr<RSTypeface>(typeface); 23cb93a386Sopenharmony_ci } 24cb93a386Sopenharmony_ci return nullptr; 25cb93a386Sopenharmony_ci} 26cb93a386Sopenharmony_ci#endif 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ciconstexpr int MAX_VARTYPEFACE_SIZE = 32; 29cb93a386Sopenharmony_ci#ifdef OHOS_SUPPORT 30cb93a386Sopenharmony_cistd::unordered_map<uint32_t, std::shared_ptr<RSTypeface>> g_faceTypeCache(MAX_VARTYPEFACE_SIZE); 31cb93a386Sopenharmony_ci#endif 32cb93a386Sopenharmony_ci} 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci#ifdef OHOS_SUPPORT 35cb93a386Sopenharmony_cibool FontCollection::fIsAdpaterTextHeightEnabled = false; 36cb93a386Sopenharmony_ci#endif 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_cibool FontCollection::FamilyKey::operator==(const FontCollection::FamilyKey& other) const { 39cb93a386Sopenharmony_ci return fFamilyNames == other.fFamilyNames && 40cb93a386Sopenharmony_ci fFontStyle == other.fFontStyle && 41cb93a386Sopenharmony_ci fFontArguments == other.fFontArguments; 42cb93a386Sopenharmony_ci} 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_cisize_t FontCollection::FamilyKey::Hasher::operator()(const FontCollection::FamilyKey& key) const { 45cb93a386Sopenharmony_ci size_t hash = 0; 46cb93a386Sopenharmony_ci for (const SkString& family : key.fFamilyNames) { 47cb93a386Sopenharmony_ci hash ^= std::hash<std::string>()(family.c_str()); 48cb93a386Sopenharmony_ci } 49cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 50cb93a386Sopenharmony_ci return hash ^ 51cb93a386Sopenharmony_ci std::hash<uint32_t>()(key.fFontStyle.weight()) ^ 52cb93a386Sopenharmony_ci std::hash<uint32_t>()(key.fFontStyle.slant()) ^ 53cb93a386Sopenharmony_ci std::hash<std::optional<FontArguments>>()(key.fFontArguments); 54cb93a386Sopenharmony_ci#else 55cb93a386Sopenharmony_ci return hash ^ 56cb93a386Sopenharmony_ci std::hash<uint32_t>()(key.fFontStyle.GetWeight()) ^ 57cb93a386Sopenharmony_ci std::hash<uint32_t>()(static_cast<uint32_t>(key.fFontStyle.GetSlant())) ^ 58cb93a386Sopenharmony_ci std::hash<std::optional<FontArguments>>()(key.fFontArguments); 59cb93a386Sopenharmony_ci#endif 60cb93a386Sopenharmony_ci} 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ciFontCollection::FontCollection() 63cb93a386Sopenharmony_ci : fEnableFontFallback(true), 64cb93a386Sopenharmony_ci fDefaultFamilyNames({SkString(DEFAULT_FONT_FAMILY)}) {} 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_cisize_t FontCollection::getFontManagersCount() const { 67cb93a386Sopenharmony_ci std::shared_lock<std::shared_mutex> readLock(mutex_); 68cb93a386Sopenharmony_ci return this->getFontManagerOrder().size(); 69cb93a386Sopenharmony_ci} 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 72cb93a386Sopenharmony_civoid FontCollection::setAssetFontManager(sk_sp<SkFontMgr> font_manager) { 73cb93a386Sopenharmony_ci#else 74cb93a386Sopenharmony_civoid FontCollection::setAssetFontManager(std::shared_ptr<RSFontMgr> font_manager) { 75cb93a386Sopenharmony_ci#endif 76cb93a386Sopenharmony_ci std::unique_lock<std::shared_mutex> writeLock(mutex_); 77cb93a386Sopenharmony_ci fAssetFontManager = font_manager; 78cb93a386Sopenharmony_ci} 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 81cb93a386Sopenharmony_civoid FontCollection::setDynamicFontManager(sk_sp<SkFontMgr> font_manager) { 82cb93a386Sopenharmony_ci#else 83cb93a386Sopenharmony_civoid FontCollection::setDynamicFontManager(std::shared_ptr<RSFontMgr> font_manager) { 84cb93a386Sopenharmony_ci#endif 85cb93a386Sopenharmony_ci std::unique_lock<std::shared_mutex> writeLock(mutex_); 86cb93a386Sopenharmony_ci fDynamicFontManager = font_manager; 87cb93a386Sopenharmony_ci} 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 90cb93a386Sopenharmony_civoid FontCollection::setTestFontManager(sk_sp<SkFontMgr> font_manager) { 91cb93a386Sopenharmony_ci#else 92cb93a386Sopenharmony_civoid FontCollection::setTestFontManager(std::shared_ptr<RSFontMgr> font_manager) 93cb93a386Sopenharmony_ci{ 94cb93a386Sopenharmony_ci#endif 95cb93a386Sopenharmony_ci std::unique_lock<std::shared_mutex> writeLock(mutex_); 96cb93a386Sopenharmony_ci fTestFontManager = font_manager; 97cb93a386Sopenharmony_ci} 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 100cb93a386Sopenharmony_civoid FontCollection::setDefaultFontManager(sk_sp<SkFontMgr> fontManager, 101cb93a386Sopenharmony_ci const char defaultFamilyName[]) { 102cb93a386Sopenharmony_ci#else 103cb93a386Sopenharmony_civoid FontCollection::setDefaultFontManager(std::shared_ptr<RSFontMgr> fontManager, 104cb93a386Sopenharmony_ci const char defaultFamilyName[]) { 105cb93a386Sopenharmony_ci#endif 106cb93a386Sopenharmony_ci std::unique_lock<std::shared_mutex> writeLock(mutex_); 107cb93a386Sopenharmony_ci fDefaultFontManager = std::move(fontManager); 108cb93a386Sopenharmony_ci fDefaultFamilyNames.emplace_back(defaultFamilyName); 109cb93a386Sopenharmony_ci} 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 112cb93a386Sopenharmony_civoid FontCollection::setDefaultFontManager(sk_sp<SkFontMgr> fontManager, 113cb93a386Sopenharmony_ci const std::vector<SkString>& defaultFamilyNames) { 114cb93a386Sopenharmony_ci#else 115cb93a386Sopenharmony_civoid FontCollection::setDefaultFontManager(std::shared_ptr<RSFontMgr> fontManager, 116cb93a386Sopenharmony_ci const std::vector<SkString>& defaultFamilyNames) { 117cb93a386Sopenharmony_ci#endif 118cb93a386Sopenharmony_ci std::unique_lock<std::shared_mutex> writeLock(mutex_); 119cb93a386Sopenharmony_ci fDefaultFontManager = std::move(fontManager); 120cb93a386Sopenharmony_ci fDefaultFamilyNames = defaultFamilyNames; 121cb93a386Sopenharmony_ci} 122cb93a386Sopenharmony_ci 123cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 124cb93a386Sopenharmony_civoid FontCollection::setDefaultFontManager(sk_sp<SkFontMgr> fontManager) { 125cb93a386Sopenharmony_ci#else 126cb93a386Sopenharmony_civoid FontCollection::setDefaultFontManager(std::shared_ptr<RSFontMgr> fontManager) { 127cb93a386Sopenharmony_ci#endif 128cb93a386Sopenharmony_ci std::unique_lock<std::shared_mutex> writeLock(mutex_); 129cb93a386Sopenharmony_ci fDefaultFontManager = fontManager; 130cb93a386Sopenharmony_ci} 131cb93a386Sopenharmony_ci 132cb93a386Sopenharmony_ci// Return the available font managers in the order they should be queried. 133cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 134cb93a386Sopenharmony_cistd::vector<sk_sp<SkFontMgr>> FontCollection::getFontManagerOrder() const { 135cb93a386Sopenharmony_ci std::vector<sk_sp<SkFontMgr>> order; 136cb93a386Sopenharmony_ci#else 137cb93a386Sopenharmony_cistd::vector<std::shared_ptr<RSFontMgr>> FontCollection::getFontManagerOrder() const { 138cb93a386Sopenharmony_ci std::vector<std::shared_ptr<RSFontMgr>> order; 139cb93a386Sopenharmony_ci#endif 140cb93a386Sopenharmony_ci if (fDynamicFontManager) { 141cb93a386Sopenharmony_ci order.push_back(fDynamicFontManager); 142cb93a386Sopenharmony_ci } 143cb93a386Sopenharmony_ci if (fAssetFontManager) { 144cb93a386Sopenharmony_ci order.push_back(fAssetFontManager); 145cb93a386Sopenharmony_ci } 146cb93a386Sopenharmony_ci if (fTestFontManager) { 147cb93a386Sopenharmony_ci order.push_back(fTestFontManager); 148cb93a386Sopenharmony_ci } 149cb93a386Sopenharmony_ci if (fDefaultFontManager && fEnableFontFallback) { 150cb93a386Sopenharmony_ci order.push_back(fDefaultFontManager); 151cb93a386Sopenharmony_ci } 152cb93a386Sopenharmony_ci return order; 153cb93a386Sopenharmony_ci} 154cb93a386Sopenharmony_ci 155cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 156cb93a386Sopenharmony_cistd::vector<sk_sp<SkTypeface>> FontCollection::findTypefaces(const std::vector<SkString>& familyNames, SkFontStyle fontStyle) { 157cb93a386Sopenharmony_ci#else 158cb93a386Sopenharmony_cistd::vector<std::shared_ptr<RSTypeface>> FontCollection::findTypefaces( 159cb93a386Sopenharmony_ci const std::vector<SkString>& familyNames, RSFontStyle fontStyle) 160cb93a386Sopenharmony_ci{ 161cb93a386Sopenharmony_ci#endif 162cb93a386Sopenharmony_ci return findTypefaces(familyNames, fontStyle, std::nullopt); 163cb93a386Sopenharmony_ci} 164cb93a386Sopenharmony_ci 165cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 166cb93a386Sopenharmony_cistd::vector<sk_sp<SkTypeface>> FontCollection::findTypefaces(const std::vector<SkString>& familyNames, 167cb93a386Sopenharmony_ci SkFontStyle fontStyle, const std::optional<FontArguments>& fontArgs) { 168cb93a386Sopenharmony_ci // Look inside the font collections cache first 169cb93a386Sopenharmony_ci FamilyKey familyKey(familyNames, fontStyle, fontArgs); 170cb93a386Sopenharmony_ci { 171cb93a386Sopenharmony_ci std::shared_lock<std::shared_mutex> readLock(mutex_); 172cb93a386Sopenharmony_ci auto found = fTypefaces.find(familyKey); 173cb93a386Sopenharmony_ci if (found) { 174cb93a386Sopenharmony_ci return *found; 175cb93a386Sopenharmony_ci } 176cb93a386Sopenharmony_ci } 177cb93a386Sopenharmony_ci 178cb93a386Sopenharmony_ci std::vector<sk_sp<SkTypeface>> typefaces; 179cb93a386Sopenharmony_ci for (const SkString& familyName : familyNames) { 180cb93a386Sopenharmony_ci sk_sp<SkTypeface> match = matchTypeface(familyName, fontStyle); 181cb93a386Sopenharmony_ci if (match && fontArgs) { 182cb93a386Sopenharmony_ci match = CloneTypeface(match, fontArgs); 183cb93a386Sopenharmony_ci } 184cb93a386Sopenharmony_ci if (match) { 185cb93a386Sopenharmony_ci typefaces.emplace_back(std::move(match)); 186cb93a386Sopenharmony_ci } 187cb93a386Sopenharmony_ci } 188cb93a386Sopenharmony_ci 189cb93a386Sopenharmony_ci if (typefaces.empty()) { 190cb93a386Sopenharmony_ci sk_sp<SkTypeface> match; 191cb93a386Sopenharmony_ci for (const SkString& familyName : fDefaultFamilyNames) { 192cb93a386Sopenharmony_ci match = matchTypeface(familyName, fontStyle); 193cb93a386Sopenharmony_ci if (match) { 194cb93a386Sopenharmony_ci match = CloneTypeface(match, fontArgs); 195cb93a386Sopenharmony_ci break; 196cb93a386Sopenharmony_ci } 197cb93a386Sopenharmony_ci } 198cb93a386Sopenharmony_ci if (!match) { 199cb93a386Sopenharmony_ci for (const auto& manager : this->getFontManagerOrder()) { 200cb93a386Sopenharmony_ci match = manager->legacyMakeTypeface(nullptr, fontStyle); 201cb93a386Sopenharmony_ci if (match) { 202cb93a386Sopenharmony_ci break; 203cb93a386Sopenharmony_ci } 204cb93a386Sopenharmony_ci } 205cb93a386Sopenharmony_ci } 206cb93a386Sopenharmony_ci if (match) { 207cb93a386Sopenharmony_ci typefaces.emplace_back(std::move(match)); 208cb93a386Sopenharmony_ci } 209cb93a386Sopenharmony_ci } 210cb93a386Sopenharmony_ci 211cb93a386Sopenharmony_ci std::unique_lock<std::shared_mutex> writeLock(mutex_); 212cb93a386Sopenharmony_ci fTypefaces.set(familyKey, typefaces); 213cb93a386Sopenharmony_ci return typefaces; 214cb93a386Sopenharmony_ci} 215cb93a386Sopenharmony_ci#else 216cb93a386Sopenharmony_cistd::vector<std::shared_ptr<RSTypeface>> FontCollection::findTypefaces(const std::vector<SkString>& familyNames, 217cb93a386Sopenharmony_ci RSFontStyle fontStyle, const std::optional<FontArguments>& fontArgs) 218cb93a386Sopenharmony_ci{ 219cb93a386Sopenharmony_ci // Look inside the font collections cache first 220cb93a386Sopenharmony_ci FamilyKey familyKey(familyNames, fontStyle, fontArgs); 221cb93a386Sopenharmony_ci { 222cb93a386Sopenharmony_ci std::shared_lock<std::shared_mutex> readLock(mutex_); 223cb93a386Sopenharmony_ci auto found = fTypefaces.find(familyKey); 224cb93a386Sopenharmony_ci if (found != fTypefaces.end()) { 225cb93a386Sopenharmony_ci return found->second; 226cb93a386Sopenharmony_ci } 227cb93a386Sopenharmony_ci } 228cb93a386Sopenharmony_ci 229cb93a386Sopenharmony_ci std::vector<std::shared_ptr<RSTypeface>> typefaces; 230cb93a386Sopenharmony_ci for (const auto& familyName : familyNames) { 231cb93a386Sopenharmony_ci std::shared_ptr<RSTypeface> match = matchTypeface(familyName, fontStyle); 232cb93a386Sopenharmony_ci if (match && fontArgs) { 233cb93a386Sopenharmony_ci match = CloneTypeface(match, fontArgs); 234cb93a386Sopenharmony_ci } 235cb93a386Sopenharmony_ci if (match) { 236cb93a386Sopenharmony_ci typefaces.emplace_back(std::move(match)); 237cb93a386Sopenharmony_ci } 238cb93a386Sopenharmony_ci } 239cb93a386Sopenharmony_ci 240cb93a386Sopenharmony_ci if (typefaces.empty()) { 241cb93a386Sopenharmony_ci std::shared_ptr<RSTypeface> match; 242cb93a386Sopenharmony_ci for (const auto& familyName : fDefaultFamilyNames) { 243cb93a386Sopenharmony_ci match = matchTypeface(familyName, fontStyle); 244cb93a386Sopenharmony_ci if (match) { 245cb93a386Sopenharmony_ci match = CloneTypeface(match, fontArgs); 246cb93a386Sopenharmony_ci break; 247cb93a386Sopenharmony_ci } 248cb93a386Sopenharmony_ci } 249cb93a386Sopenharmony_ci 250cb93a386Sopenharmony_ci if (!match) { 251cb93a386Sopenharmony_ci for (const auto& manager : this->getFontManagerOrder()) { 252cb93a386Sopenharmony_ci match = RSLegacyMakeTypeface(manager, nullptr, fontStyle); 253cb93a386Sopenharmony_ci if (match) { 254cb93a386Sopenharmony_ci break; 255cb93a386Sopenharmony_ci } 256cb93a386Sopenharmony_ci } 257cb93a386Sopenharmony_ci } 258cb93a386Sopenharmony_ci if (match) { 259cb93a386Sopenharmony_ci typefaces.emplace_back(std::move(match)); 260cb93a386Sopenharmony_ci } 261cb93a386Sopenharmony_ci } 262cb93a386Sopenharmony_ci 263cb93a386Sopenharmony_ci std::unique_lock<std::shared_mutex> writeLock(mutex_); 264cb93a386Sopenharmony_ci fTypefaces.emplace(familyKey, typefaces); 265cb93a386Sopenharmony_ci return typefaces; 266cb93a386Sopenharmony_ci} 267cb93a386Sopenharmony_ci#endif 268cb93a386Sopenharmony_ci 269cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 270cb93a386Sopenharmony_cisk_sp<SkTypeface> FontCollection::matchTypeface(const SkString& familyName, SkFontStyle fontStyle) { 271cb93a386Sopenharmony_ci for (const auto& manager : this->getFontManagerOrder()) { 272cb93a386Sopenharmony_ci sk_sp<SkFontStyleSet> set(manager->matchFamily(familyName.c_str())); 273cb93a386Sopenharmony_ci if (!set || set->count() == 0) { 274cb93a386Sopenharmony_ci continue; 275cb93a386Sopenharmony_ci } 276cb93a386Sopenharmony_ci 277cb93a386Sopenharmony_ci sk_sp<SkTypeface> match(set->matchStyle(fontStyle)); 278cb93a386Sopenharmony_ci if (match) { 279cb93a386Sopenharmony_ci return match; 280cb93a386Sopenharmony_ci } 281cb93a386Sopenharmony_ci } 282cb93a386Sopenharmony_ci 283cb93a386Sopenharmony_ci return nullptr; 284cb93a386Sopenharmony_ci} 285cb93a386Sopenharmony_ci#else 286cb93a386Sopenharmony_cistd::shared_ptr<RSTypeface> FontCollection::matchTypeface(const SkString& familyName, RSFontStyle fontStyle) { 287cb93a386Sopenharmony_ci for (const auto& manager : this->getFontManagerOrder()) { 288cb93a386Sopenharmony_ci std::shared_ptr<RSFontStyleSet> set(manager->MatchFamily(familyName.c_str())); 289cb93a386Sopenharmony_ci if (!set || set->Count() == 0) { 290cb93a386Sopenharmony_ci continue; 291cb93a386Sopenharmony_ci } 292cb93a386Sopenharmony_ci 293cb93a386Sopenharmony_ci std::shared_ptr<RSTypeface> match(set->MatchStyle(fontStyle)); 294cb93a386Sopenharmony_ci if (match) { 295cb93a386Sopenharmony_ci return match; 296cb93a386Sopenharmony_ci } 297cb93a386Sopenharmony_ci } 298cb93a386Sopenharmony_ci 299cb93a386Sopenharmony_ci return nullptr; 300cb93a386Sopenharmony_ci} 301cb93a386Sopenharmony_ci#endif 302cb93a386Sopenharmony_ci 303cb93a386Sopenharmony_ci 304cb93a386Sopenharmony_ci// Find ANY font in available font managers that resolves the unicode codepoint 305cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 306cb93a386Sopenharmony_cisk_sp<SkTypeface> FontCollection::defaultFallback(SkUnichar unicode, SkFontStyle fontStyle, const SkString& locale) { 307cb93a386Sopenharmony_ci#else 308cb93a386Sopenharmony_cistd::shared_ptr<RSTypeface> FontCollection::defaultFallback( 309cb93a386Sopenharmony_ci SkUnichar unicode, RSFontStyle fontStyle, const SkString& locale) 310cb93a386Sopenharmony_ci{ 311cb93a386Sopenharmony_ci#endif 312cb93a386Sopenharmony_ci std::shared_lock<std::shared_mutex> readLock(mutex_); 313cb93a386Sopenharmony_ci for (const auto& manager : this->getFontManagerOrder()) { 314cb93a386Sopenharmony_ci std::vector<const char*> bcp47; 315cb93a386Sopenharmony_ci if (!locale.isEmpty()) { 316cb93a386Sopenharmony_ci bcp47.push_back(locale.c_str()); 317cb93a386Sopenharmony_ci } 318cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 319cb93a386Sopenharmony_ci sk_sp<SkTypeface> typeface(manager->matchFamilyStyleCharacter( 320cb93a386Sopenharmony_ci nullptr, fontStyle, bcp47.data(), bcp47.size(), unicode)); 321cb93a386Sopenharmony_ci#else 322cb93a386Sopenharmony_ci std::shared_ptr<RSTypeface> typeface(manager->MatchFamilyStyleCharacter( 323cb93a386Sopenharmony_ci nullptr, fontStyle, bcp47.data(), bcp47.size(), unicode)); 324cb93a386Sopenharmony_ci#endif 325cb93a386Sopenharmony_ci if (typeface != nullptr) { 326cb93a386Sopenharmony_ci return typeface; 327cb93a386Sopenharmony_ci } 328cb93a386Sopenharmony_ci } 329cb93a386Sopenharmony_ci return nullptr; 330cb93a386Sopenharmony_ci} 331cb93a386Sopenharmony_ci 332cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 333cb93a386Sopenharmony_cisk_sp<SkTypeface> FontCollection::defaultFallback() { 334cb93a386Sopenharmony_ci std::shared_lock<std::shared_mutex> readLock(mutex_); 335cb93a386Sopenharmony_ci if (fDefaultFontManager == nullptr) { 336cb93a386Sopenharmony_ci return nullptr; 337cb93a386Sopenharmony_ci } 338cb93a386Sopenharmony_ci for (const SkString& familyName : fDefaultFamilyNames) { 339cb93a386Sopenharmony_ci sk_sp<SkTypeface> match = sk_sp<SkTypeface>(fDefaultFontManager->matchFamilyStyle(familyName.c_str(), 340cb93a386Sopenharmony_ci SkFontStyle())); 341cb93a386Sopenharmony_ci if (match) { 342cb93a386Sopenharmony_ci return match; 343cb93a386Sopenharmony_ci } 344cb93a386Sopenharmony_ci } 345cb93a386Sopenharmony_ci return nullptr; 346cb93a386Sopenharmony_ci} 347cb93a386Sopenharmony_ci#else 348cb93a386Sopenharmony_cistd::shared_ptr<RSTypeface> FontCollection::defaultFallback() { 349cb93a386Sopenharmony_ci std::shared_lock<std::shared_mutex> readLock(mutex_); 350cb93a386Sopenharmony_ci if (fDefaultFontManager == nullptr) { 351cb93a386Sopenharmony_ci return nullptr; 352cb93a386Sopenharmony_ci } 353cb93a386Sopenharmony_ci for (const auto& familyName : fDefaultFamilyNames) { 354cb93a386Sopenharmony_ci std::shared_ptr<RSTypeface> match = std::shared_ptr<RSTypeface>( 355cb93a386Sopenharmony_ci fDefaultFontManager->MatchFamilyStyle(familyName.c_str(), RSFontStyle())); 356cb93a386Sopenharmony_ci if (match) { 357cb93a386Sopenharmony_ci return match; 358cb93a386Sopenharmony_ci } 359cb93a386Sopenharmony_ci } 360cb93a386Sopenharmony_ci return nullptr; 361cb93a386Sopenharmony_ci} 362cb93a386Sopenharmony_ci#endif 363cb93a386Sopenharmony_ci 364cb93a386Sopenharmony_ciclass SkLRUCacheMgr { 365cb93a386Sopenharmony_cipublic: 366cb93a386Sopenharmony_ci SkLRUCacheMgr(SkLRUCache<uint32_t, std::shared_ptr<RSTypeface>>& lruCache, SkMutex& mutex) 367cb93a386Sopenharmony_ci :fLRUCache(lruCache), fMutex(mutex) 368cb93a386Sopenharmony_ci { 369cb93a386Sopenharmony_ci fMutex.acquire(); 370cb93a386Sopenharmony_ci } 371cb93a386Sopenharmony_ci SkLRUCacheMgr(const SkLRUCacheMgr&) = delete; 372cb93a386Sopenharmony_ci SkLRUCacheMgr(SkLRUCacheMgr&&) = delete; 373cb93a386Sopenharmony_ci SkLRUCacheMgr& operator=(const SkLRUCacheMgr&) = delete; 374cb93a386Sopenharmony_ci SkLRUCacheMgr& operator=(SkLRUCacheMgr&&) = delete; 375cb93a386Sopenharmony_ci 376cb93a386Sopenharmony_ci ~SkLRUCacheMgr() { 377cb93a386Sopenharmony_ci fMutex.release(); 378cb93a386Sopenharmony_ci } 379cb93a386Sopenharmony_ci 380cb93a386Sopenharmony_ci std::shared_ptr<RSTypeface> find(uint32_t fontId) { 381cb93a386Sopenharmony_ci auto face = fLRUCache.find(fontId); 382cb93a386Sopenharmony_ci return face == nullptr ? nullptr : *face; 383cb93a386Sopenharmony_ci } 384cb93a386Sopenharmony_ci 385cb93a386Sopenharmony_ci std::shared_ptr<RSTypeface> insert(uint32_t fontId, std::shared_ptr<RSTypeface> hbFont) { 386cb93a386Sopenharmony_ci auto face = fLRUCache.insert(fontId, std::move(hbFont)); 387cb93a386Sopenharmony_ci return face == nullptr ? nullptr : *face; 388cb93a386Sopenharmony_ci } 389cb93a386Sopenharmony_ci 390cb93a386Sopenharmony_ci void reset() { 391cb93a386Sopenharmony_ci fLRUCache.reset(); 392cb93a386Sopenharmony_ci } 393cb93a386Sopenharmony_ci 394cb93a386Sopenharmony_ciprivate: 395cb93a386Sopenharmony_ci SkLRUCache<uint32_t, std::shared_ptr<RSTypeface>>& fLRUCache; 396cb93a386Sopenharmony_ci SkMutex& fMutex; 397cb93a386Sopenharmony_ci}; 398cb93a386Sopenharmony_ci 399cb93a386Sopenharmony_cistatic SkLRUCacheMgr GetLRUCacheInstance() { 400cb93a386Sopenharmony_ci static SkMutex gFaceCacheMutex; 401cb93a386Sopenharmony_ci static SkLRUCache<uint32_t, std::shared_ptr<RSTypeface>> gFaceCache(MAX_VARTYPEFACE_SIZE); 402cb93a386Sopenharmony_ci return SkLRUCacheMgr(gFaceCache, gFaceCacheMutex); 403cb93a386Sopenharmony_ci} 404cb93a386Sopenharmony_ci 405cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 406cb93a386Sopenharmony_cisk_sp<SkTypeface> FontCollection::CloneTypeface(sk_sp<SkTypeface> typeface, 407cb93a386Sopenharmony_ci const std::optional<FontArguments>& fontArgs) 408cb93a386Sopenharmony_ci{ 409cb93a386Sopenharmony_ci#else 410cb93a386Sopenharmony_cistd::shared_ptr<RSTypeface> FontCollection::CloneTypeface(std::shared_ptr<RSTypeface> typeface, 411cb93a386Sopenharmony_ci const std::optional<FontArguments>& fontArgs) 412cb93a386Sopenharmony_ci{ 413cb93a386Sopenharmony_ci 414cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 415cb93a386Sopenharmony_ci if (!typeface || !fontArgs || typeface->isCustomTypeface()) { 416cb93a386Sopenharmony_ci#else 417cb93a386Sopenharmony_ci if (!typeface || !fontArgs || typeface->IsCustomTypeface()) { 418cb93a386Sopenharmony_ci#endif 419cb93a386Sopenharmony_ci return typeface; 420cb93a386Sopenharmony_ci } 421cb93a386Sopenharmony_ci 422cb93a386Sopenharmony_ci size_t hash = 0; 423cb93a386Sopenharmony_ci hash ^= std::hash<FontArguments>()(fontArgs.value()); 424cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 425cb93a386Sopenharmony_ci hash ^= std::hash<uint32_t>()(typeface->uniqueID()); 426cb93a386Sopenharmony_ci#else 427cb93a386Sopenharmony_ci hash ^= std::hash<uint32_t>()(typeface->GetUniqueID()); 428cb93a386Sopenharmony_ci#endif 429cb93a386Sopenharmony_ci 430cb93a386Sopenharmony_ci std::unique_lock<std::shared_mutex> writeLock(mutex_); 431cb93a386Sopenharmony_ci auto cached = GetLRUCacheInstance().find(hash); 432cb93a386Sopenharmony_ci if (cached) { 433cb93a386Sopenharmony_ci return cached; 434cb93a386Sopenharmony_ci } else { 435cb93a386Sopenharmony_ci auto varTypeface = fontArgs->CloneTypeface(typeface); 436cb93a386Sopenharmony_ci if (!varTypeface) { 437cb93a386Sopenharmony_ci return typeface; 438cb93a386Sopenharmony_ci } 439cb93a386Sopenharmony_ci GetLRUCacheInstance().insert(hash, varTypeface); 440cb93a386Sopenharmony_ci return varTypeface; 441cb93a386Sopenharmony_ci } 442cb93a386Sopenharmony_ci} 443cb93a386Sopenharmony_ci 444cb93a386Sopenharmony_ci#endif 445cb93a386Sopenharmony_ci 446cb93a386Sopenharmony_civoid FontCollection::disableFontFallback() { 447cb93a386Sopenharmony_ci std::unique_lock<std::shared_mutex> writeLock(mutex_); 448cb93a386Sopenharmony_ci fEnableFontFallback = false; 449cb93a386Sopenharmony_ci} 450cb93a386Sopenharmony_ci 451cb93a386Sopenharmony_civoid FontCollection::enableFontFallback() { 452cb93a386Sopenharmony_ci std::unique_lock<std::shared_mutex> writeLock(mutex_); 453cb93a386Sopenharmony_ci fEnableFontFallback = true; 454cb93a386Sopenharmony_ci} 455cb93a386Sopenharmony_ci 456cb93a386Sopenharmony_civoid FontCollection::clearCaches() { 457cb93a386Sopenharmony_ci std::unique_lock<std::shared_mutex> writeLock(mutex_); 458cb93a386Sopenharmony_ci fParagraphCache.reset(); 459cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 460cb93a386Sopenharmony_ci fTypefaces.reset(); 461cb93a386Sopenharmony_ci#else 462cb93a386Sopenharmony_ci fTypefaces.clear(); 463cb93a386Sopenharmony_ci#endif 464cb93a386Sopenharmony_ci SkShaper::PurgeCaches(); 465cb93a386Sopenharmony_ci} 466cb93a386Sopenharmony_ci 467cb93a386Sopenharmony_ci} // namespace textlayout 468cb93a386Sopenharmony_ci} // namespace skia 469