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