xref: /aosp_15_r20/external/skia/src/ports/SkFontMgr_custom.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2006 The Android Open Source Project
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkFontMgr_custom_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkFontMgr_custom_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontMgr.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontStyle.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/ports/SkTypeface_FreeType.h"
18*c8dee2aaSAndroid Build Coastguard Worker 
19*c8dee2aaSAndroid Build Coastguard Worker class SkData;
20*c8dee2aaSAndroid Build Coastguard Worker class SkFontDescriptor;
21*c8dee2aaSAndroid Build Coastguard Worker class SkStreamAsset;
22*c8dee2aaSAndroid Build Coastguard Worker class SkTypeface;
23*c8dee2aaSAndroid Build Coastguard Worker 
24*c8dee2aaSAndroid Build Coastguard Worker /** The base SkTypeface implementation for the custom font manager. */
25*c8dee2aaSAndroid Build Coastguard Worker class SkTypeface_Custom : public SkTypeface_FreeType {
26*c8dee2aaSAndroid Build Coastguard Worker public:
27*c8dee2aaSAndroid Build Coastguard Worker     SkTypeface_Custom(const SkFontStyle& style, bool isFixedPitch,
28*c8dee2aaSAndroid Build Coastguard Worker                       bool sysFont, SkString familyName, int index);
29*c8dee2aaSAndroid Build Coastguard Worker     bool isSysFont() const;
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker protected:
32*c8dee2aaSAndroid Build Coastguard Worker     void onGetFamilyName(SkString* familyName) const override;
33*c8dee2aaSAndroid Build Coastguard Worker     void onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) const override;
34*c8dee2aaSAndroid Build Coastguard Worker     int getIndex() const;
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker private:
37*c8dee2aaSAndroid Build Coastguard Worker     const bool fIsSysFont;
38*c8dee2aaSAndroid Build Coastguard Worker     const SkString fFamilyName;
39*c8dee2aaSAndroid Build Coastguard Worker     const int fIndex;
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkTypeface_FreeType;
42*c8dee2aaSAndroid Build Coastguard Worker };
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker /** The empty SkTypeface implementation for the custom font manager.
45*c8dee2aaSAndroid Build Coastguard Worker  *  Used as the last resort fallback typeface.
46*c8dee2aaSAndroid Build Coastguard Worker  */
47*c8dee2aaSAndroid Build Coastguard Worker class SkTypeface_Empty : public SkTypeface_Custom {
48*c8dee2aaSAndroid Build Coastguard Worker public:
49*c8dee2aaSAndroid Build Coastguard Worker     SkTypeface_Empty() ;
50*c8dee2aaSAndroid Build Coastguard Worker 
51*c8dee2aaSAndroid Build Coastguard Worker protected:
52*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkStreamAsset> onOpenStream(int*) const override;
53*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override;
54*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkFontData> onMakeFontData() const override;
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker private:
57*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkTypeface_Custom;
58*c8dee2aaSAndroid Build Coastguard Worker };
59*c8dee2aaSAndroid Build Coastguard Worker 
60*c8dee2aaSAndroid Build Coastguard Worker /** The file SkTypeface implementation for the custom font manager. */
61*c8dee2aaSAndroid Build Coastguard Worker class SkTypeface_File : public SkTypeface_Custom {
62*c8dee2aaSAndroid Build Coastguard Worker public:
63*c8dee2aaSAndroid Build Coastguard Worker     SkTypeface_File(const SkFontStyle& style, bool isFixedPitch, bool sysFont,
64*c8dee2aaSAndroid Build Coastguard Worker                     SkString familyName, const char path[], int index);
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker protected:
67*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override;
68*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override;
69*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkFontData> onMakeFontData() const override;
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker private:
72*c8dee2aaSAndroid Build Coastguard Worker     SkString fPath;
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkTypeface_Custom;
75*c8dee2aaSAndroid Build Coastguard Worker };
76*c8dee2aaSAndroid Build Coastguard Worker 
77*c8dee2aaSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
78*c8dee2aaSAndroid Build Coastguard Worker 
79*c8dee2aaSAndroid Build Coastguard Worker /**
80*c8dee2aaSAndroid Build Coastguard Worker  *  SkFontStyleSet_Custom
81*c8dee2aaSAndroid Build Coastguard Worker  *
82*c8dee2aaSAndroid Build Coastguard Worker  *  This class is used by SkFontMgr_Custom to hold SkTypeface_Custom families.
83*c8dee2aaSAndroid Build Coastguard Worker  */
84*c8dee2aaSAndroid Build Coastguard Worker class SkFontStyleSet_Custom : public SkFontStyleSet {
85*c8dee2aaSAndroid Build Coastguard Worker public:
86*c8dee2aaSAndroid Build Coastguard Worker     explicit SkFontStyleSet_Custom(SkString familyName);
87*c8dee2aaSAndroid Build Coastguard Worker 
88*c8dee2aaSAndroid Build Coastguard Worker     /** Should only be called during the initial build phase. */
89*c8dee2aaSAndroid Build Coastguard Worker     void appendTypeface(sk_sp<SkTypeface> typeface);
90*c8dee2aaSAndroid Build Coastguard Worker     int count() override;
91*c8dee2aaSAndroid Build Coastguard Worker     void getStyle(int index, SkFontStyle* style, SkString* name) override;
92*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> createTypeface(int index) override;
93*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> matchStyle(const SkFontStyle& pattern) override;
94*c8dee2aaSAndroid Build Coastguard Worker     SkString getFamilyName();
95*c8dee2aaSAndroid Build Coastguard Worker 
96*c8dee2aaSAndroid Build Coastguard Worker private:
97*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<sk_sp<SkTypeface>> fStyles;
98*c8dee2aaSAndroid Build Coastguard Worker     SkString fFamilyName;
99*c8dee2aaSAndroid Build Coastguard Worker 
100*c8dee2aaSAndroid Build Coastguard Worker     friend class SkFontMgr_Custom;
101*c8dee2aaSAndroid Build Coastguard Worker };
102*c8dee2aaSAndroid Build Coastguard Worker 
103*c8dee2aaSAndroid Build Coastguard Worker /**
104*c8dee2aaSAndroid Build Coastguard Worker  *  SkFontMgr_Custom
105*c8dee2aaSAndroid Build Coastguard Worker  *
106*c8dee2aaSAndroid Build Coastguard Worker  *  This class is essentially a collection of SkFontStyleSet_Custom,
107*c8dee2aaSAndroid Build Coastguard Worker  *  one SkFontStyleSet_Custom for each family. This class may be modified
108*c8dee2aaSAndroid Build Coastguard Worker  *  to load fonts from any source by changing the initialization.
109*c8dee2aaSAndroid Build Coastguard Worker  */
110*c8dee2aaSAndroid Build Coastguard Worker class SkFontMgr_Custom : public SkFontMgr {
111*c8dee2aaSAndroid Build Coastguard Worker public:
112*c8dee2aaSAndroid Build Coastguard Worker     typedef skia_private::TArray<sk_sp<SkFontStyleSet_Custom>> Families;
113*c8dee2aaSAndroid Build Coastguard Worker     class SystemFontLoader {
114*c8dee2aaSAndroid Build Coastguard Worker     public:
~SystemFontLoader()115*c8dee2aaSAndroid Build Coastguard Worker         virtual ~SystemFontLoader() { }
116*c8dee2aaSAndroid Build Coastguard Worker         virtual void loadSystemFonts(const SkFontScanner*, Families*) const = 0;
117*c8dee2aaSAndroid Build Coastguard Worker     };
118*c8dee2aaSAndroid Build Coastguard Worker     explicit SkFontMgr_Custom(const SystemFontLoader& loader);
119*c8dee2aaSAndroid Build Coastguard Worker 
120*c8dee2aaSAndroid Build Coastguard Worker protected:
121*c8dee2aaSAndroid Build Coastguard Worker     int onCountFamilies() const override;
122*c8dee2aaSAndroid Build Coastguard Worker     void onGetFamilyName(int index, SkString* familyName) const override;
123*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkFontStyleSet> onCreateStyleSet(int index) const override;
124*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkFontStyleSet> onMatchFamily(const char familyName[]) const override;
125*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> onMatchFamilyStyle(const char familyName[],
126*c8dee2aaSAndroid Build Coastguard Worker                                          const SkFontStyle& fontStyle) const override;
127*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> onMatchFamilyStyleCharacter(const char familyName[], const SkFontStyle&,
128*c8dee2aaSAndroid Build Coastguard Worker                                                   const char* bcp47[], int bcp47Count,
129*c8dee2aaSAndroid Build Coastguard Worker                                                   SkUnichar character) const override;
130*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData> data, int ttcIndex) const override;
131*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset>, int ttcIndex) const override;
132*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> onMakeFromStreamArgs(std::unique_ptr<SkStreamAsset>, const SkFontArguments&) const override;
133*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> onMakeFromFile(const char path[], int ttcIndex) const override;
134*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTypeface> onLegacyMakeTypeface(const char familyName[], SkFontStyle style) const override;
135*c8dee2aaSAndroid Build Coastguard Worker 
136*c8dee2aaSAndroid Build Coastguard Worker private:
137*c8dee2aaSAndroid Build Coastguard Worker     Families fFamilies;
138*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkFontStyleSet> fDefaultFamily;
139*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SkFontScanner> fScanner;
140*c8dee2aaSAndroid Build Coastguard Worker };
141*c8dee2aaSAndroid Build Coastguard Worker 
142*c8dee2aaSAndroid Build Coastguard Worker #endif
143