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