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