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