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