1cb93a386Sopenharmony_ci// Copyright 2019 Google LLC. 2cb93a386Sopenharmony_ci#ifndef FontCollection_DEFINED 3cb93a386Sopenharmony_ci#define FontCollection_DEFINED 4cb93a386Sopenharmony_ci 5cb93a386Sopenharmony_ci#include <memory> 6cb93a386Sopenharmony_ci#include <mutex> 7cb93a386Sopenharmony_ci#include <optional> 8cb93a386Sopenharmony_ci#include <set> 9cb93a386Sopenharmony_ci#include <shared_mutex> 10cb93a386Sopenharmony_ci#include <unordered_map> 11cb93a386Sopenharmony_ci#include "include/core/SkFontMgr.h" 12cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 13cb93a386Sopenharmony_ci#include "modules/skparagraph/include/FontArguments.h" 14cb93a386Sopenharmony_ci#include "modules/skparagraph/include/ParagraphCache.h" 15cb93a386Sopenharmony_ci#include "modules/skparagraph/include/TextStyle.h" 16cb93a386Sopenharmony_ci#include "include/private/SkTHash.h" 17cb93a386Sopenharmony_ci#include "drawing.h" 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_cinamespace skia { 20cb93a386Sopenharmony_cinamespace textlayout { 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ciclass TextStyle; 23cb93a386Sopenharmony_ciclass Paragraph; 24cb93a386Sopenharmony_ciclass FontCollection : public SkRefCnt { 25cb93a386Sopenharmony_cipublic: 26cb93a386Sopenharmony_ci FontCollection(); 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ci size_t getFontManagersCount() const; 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 31cb93a386Sopenharmony_ci void setAssetFontManager(sk_sp<SkFontMgr> fontManager); 32cb93a386Sopenharmony_ci void setDynamicFontManager(sk_sp<SkFontMgr> fontManager); 33cb93a386Sopenharmony_ci void setTestFontManager(sk_sp<SkFontMgr> fontManager); 34cb93a386Sopenharmony_ci void setDefaultFontManager(sk_sp<SkFontMgr> fontManager); 35cb93a386Sopenharmony_ci void setDefaultFontManager(sk_sp<SkFontMgr> fontManager, const char defaultFamilyName[]); 36cb93a386Sopenharmony_ci void setDefaultFontManager(sk_sp<SkFontMgr> fontManager, const std::vector<SkString>& defaultFamilyNames); 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci sk_sp<SkFontMgr> getFallbackManager() const 39cb93a386Sopenharmony_ci { 40cb93a386Sopenharmony_ci std::shared_lock<std::shared_mutex> readLock(mutex_); 41cb93a386Sopenharmony_ci return fDefaultFontManager; 42cb93a386Sopenharmony_ci } 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci std::vector<sk_sp<SkTypeface>> findTypefaces(const std::vector<SkString>& familyNames, SkFontStyle fontStyle); 45cb93a386Sopenharmony_ci std::vector<sk_sp<SkTypeface>> findTypefaces(const std::vector<SkString>& familyNames, SkFontStyle fontStyle, const std::optional<FontArguments>& fontArgs); 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci sk_sp<SkTypeface> defaultFallback(SkUnichar unicode, SkFontStyle fontStyle, const SkString& locale); 48cb93a386Sopenharmony_ci sk_sp<SkTypeface> defaultFallback(); 49cb93a386Sopenharmony_ci#else 50cb93a386Sopenharmony_ci void setAssetFontManager(std::shared_ptr<RSFontMgr> fontManager); 51cb93a386Sopenharmony_ci void setDynamicFontManager(std::shared_ptr<RSFontMgr> fontManager); 52cb93a386Sopenharmony_ci void setTestFontManager(std::shared_ptr<RSFontMgr> fontManager); 53cb93a386Sopenharmony_ci void setDefaultFontManager(std::shared_ptr<RSFontMgr> fontManager); 54cb93a386Sopenharmony_ci void setDefaultFontManager(std::shared_ptr<RSFontMgr> fontManager, const char defaultFamilyName[]); 55cb93a386Sopenharmony_ci void setDefaultFontManager(std::shared_ptr<RSFontMgr> fontManager, const std::vector<SkString>& defaultFamilyNames); 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci std::shared_ptr<RSFontMgr> getFallbackManager() const 58cb93a386Sopenharmony_ci { 59cb93a386Sopenharmony_ci std::shared_lock<std::shared_mutex> readLock(mutex_); 60cb93a386Sopenharmony_ci return fDefaultFontManager; 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci std::vector<std::shared_ptr<RSTypeface>> findTypefaces( 64cb93a386Sopenharmony_ci const std::vector<SkString>& familyNames, RSFontStyle fontStyle); 65cb93a386Sopenharmony_ci std::vector<std::shared_ptr<RSTypeface>> findTypefaces( 66cb93a386Sopenharmony_ci const std::vector<SkString>& familyNames, RSFontStyle fontStyle, const std::optional<FontArguments>& fontArgs); 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci std::shared_ptr<RSTypeface> defaultFallback(SkUnichar unicode, RSFontStyle fontStyle, const SkString& locale); 69cb93a386Sopenharmony_ci std::shared_ptr<RSTypeface> defaultFallback(); 70cb93a386Sopenharmony_ci#endif 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 73cb93a386Sopenharmony_ci sk_sp<SkTypeface> CloneTypeface(sk_sp<SkTypeface> typeface, 74cb93a386Sopenharmony_ci const std::optional<FontArguments>& fontArgs); 75cb93a386Sopenharmony_ci#else 76cb93a386Sopenharmony_ci std::shared_ptr<RSTypeface> CloneTypeface(std::shared_ptr<RSTypeface> typeface, 77cb93a386Sopenharmony_ci const std::optional<FontArguments>& fontArgs); 78cb93a386Sopenharmony_ci#endif 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci void disableFontFallback(); 81cb93a386Sopenharmony_ci void enableFontFallback(); 82cb93a386Sopenharmony_ci bool fontFallbackEnabled() 83cb93a386Sopenharmony_ci { 84cb93a386Sopenharmony_ci std::shared_lock<std::shared_mutex> readLock(mutex_); 85cb93a386Sopenharmony_ci return fEnableFontFallback; 86cb93a386Sopenharmony_ci } 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ci ParagraphCache* getParagraphCache() 89cb93a386Sopenharmony_ci { 90cb93a386Sopenharmony_ci std::shared_lock<std::shared_mutex> readLock(mutex_); 91cb93a386Sopenharmony_ci return &fParagraphCache; 92cb93a386Sopenharmony_ci } 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci void clearCaches(); 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ci#ifdef OHOS_SUPPORT 97cb93a386Sopenharmony_ci // set fIsAdpaterTextHeightEnabled with once_flag. 98cb93a386Sopenharmony_ci static void SetAdapterTextHeightEnabled(bool adapterTextHeightEnabled) 99cb93a386Sopenharmony_ci { 100cb93a386Sopenharmony_ci static std::once_flag flag; 101cb93a386Sopenharmony_ci std::call_once(flag, [adapterTextHeightEnabled]() { 102cb93a386Sopenharmony_ci fIsAdpaterTextHeightEnabled = adapterTextHeightEnabled; 103cb93a386Sopenharmony_ci }); 104cb93a386Sopenharmony_ci } 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci static bool IsAdapterTextHeightEnabled() 107cb93a386Sopenharmony_ci { 108cb93a386Sopenharmony_ci return fIsAdpaterTextHeightEnabled; 109cb93a386Sopenharmony_ci } 110cb93a386Sopenharmony_ci#endif 111cb93a386Sopenharmony_ciprivate: 112cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 113cb93a386Sopenharmony_ci std::vector<sk_sp<SkFontMgr>> getFontManagerOrder() const; 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_ci sk_sp<SkTypeface> matchTypeface(const SkString& familyName, SkFontStyle fontStyle); 116cb93a386Sopenharmony_ci#else 117cb93a386Sopenharmony_ci std::vector<std::shared_ptr<RSFontMgr>> getFontManagerOrder() const; 118cb93a386Sopenharmony_ci 119cb93a386Sopenharmony_ci std::shared_ptr<RSTypeface> matchTypeface(const SkString& familyName, RSFontStyle fontStyle); 120cb93a386Sopenharmony_ci#endif 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_ci struct FamilyKey { 123cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 124cb93a386Sopenharmony_ci FamilyKey(const std::vector<SkString>& familyNames, SkFontStyle style, const std::optional<FontArguments>& args) 125cb93a386Sopenharmony_ci : fFamilyNames(familyNames), fFontStyle(style), fFontArguments(args) {} 126cb93a386Sopenharmony_ci#else 127cb93a386Sopenharmony_ci FamilyKey( 128cb93a386Sopenharmony_ci const std::vector<SkString>& familyNames, RSFontStyle style, const std::optional<FontArguments>& args) 129cb93a386Sopenharmony_ci : fFamilyNames(familyNames), fFontStyle(style), fFontArguments(args) {} 130cb93a386Sopenharmony_ci#endif 131cb93a386Sopenharmony_ci 132cb93a386Sopenharmony_ci FamilyKey() {} 133cb93a386Sopenharmony_ci 134cb93a386Sopenharmony_ci std::vector<SkString> fFamilyNames; 135cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 136cb93a386Sopenharmony_ci SkFontStyle fFontStyle; 137cb93a386Sopenharmony_ci#else 138cb93a386Sopenharmony_ci RSFontStyle fFontStyle; 139cb93a386Sopenharmony_ci#endif 140cb93a386Sopenharmony_ci std::optional<FontArguments> fFontArguments; 141cb93a386Sopenharmony_ci 142cb93a386Sopenharmony_ci bool operator==(const FamilyKey& other) const; 143cb93a386Sopenharmony_ci 144cb93a386Sopenharmony_ci struct Hasher { 145cb93a386Sopenharmony_ci size_t operator()(const FamilyKey& key) const; 146cb93a386Sopenharmony_ci }; 147cb93a386Sopenharmony_ci }; 148cb93a386Sopenharmony_ci#ifdef OHOS_SUPPORT 149cb93a386Sopenharmony_ci static bool fIsAdpaterTextHeightEnabled; 150cb93a386Sopenharmony_ci#endif 151cb93a386Sopenharmony_ci 152cb93a386Sopenharmony_ci bool fEnableFontFallback; 153cb93a386Sopenharmony_ci#ifndef USE_SKIA_TXT 154cb93a386Sopenharmony_ci SkTHashMap<FamilyKey, std::vector<sk_sp<SkTypeface>>, FamilyKey::Hasher> fTypefaces; 155cb93a386Sopenharmony_ci sk_sp<SkFontMgr> fDefaultFontManager; 156cb93a386Sopenharmony_ci sk_sp<SkFontMgr> fAssetFontManager; 157cb93a386Sopenharmony_ci sk_sp<SkFontMgr> fDynamicFontManager; 158cb93a386Sopenharmony_ci sk_sp<SkFontMgr> fTestFontManager; 159cb93a386Sopenharmony_ci#else 160cb93a386Sopenharmony_ci std::unordered_map<FamilyKey, std::vector<std::shared_ptr<RSTypeface>>, FamilyKey::Hasher> fTypefaces; 161cb93a386Sopenharmony_ci std::shared_ptr<RSFontMgr> fDefaultFontManager; 162cb93a386Sopenharmony_ci std::shared_ptr<RSFontMgr> fAssetFontManager; 163cb93a386Sopenharmony_ci std::shared_ptr<RSFontMgr> fDynamicFontManager; 164cb93a386Sopenharmony_ci std::shared_ptr<RSFontMgr> fTestFontManager; 165cb93a386Sopenharmony_ci#endif 166cb93a386Sopenharmony_ci std::mutex fMutex; 167cb93a386Sopenharmony_ci std::vector<SkString> fDefaultFamilyNames; 168cb93a386Sopenharmony_ci ParagraphCache fParagraphCache; 169cb93a386Sopenharmony_ci mutable std::shared_mutex mutex_; 170cb93a386Sopenharmony_ci}; 171cb93a386Sopenharmony_ci} // namespace textlayout 172cb93a386Sopenharmony_ci} // namespace skia 173cb93a386Sopenharmony_ci 174cb93a386Sopenharmony_ci#endif // FontCollection_DEFINED 175