1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc.
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 * 2021.9.9 SkFontMgr on previewer of ohos.
7cb93a386Sopenharmony_ci *           Copyright (c) 2021 Huawei Device Co., Ltd. All rights reserved.
8cb93a386Sopenharmony_ci */
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#ifndef SkFontMgr_preview_DEFINED
11cb93a386Sopenharmony_ci#define SkFontMgr_preview_DEFINED
12cb93a386Sopenharmony_ci
13cb93a386Sopenharmony_ci#include "include/core/SkFontMgr.h"
14cb93a386Sopenharmony_ci#include "include/core/SkData.h"
15cb93a386Sopenharmony_ci#include "include/core/SkFontStyle.h"
16cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h"
17cb93a386Sopenharmony_ci#include "include/core/SkStream.h"
18cb93a386Sopenharmony_ci#include "include/core/SkString.h"
19cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h"
20cb93a386Sopenharmony_ci#include "include/private/SkTArray.h"
21cb93a386Sopenharmony_ci#include "include/private/SkTDArray.h"
22cb93a386Sopenharmony_ci#include "include/private/SkFixed.h"
23cb93a386Sopenharmony_ci#include "include/private/SkTemplates.h"
24cb93a386Sopenharmony_ci#include "src/core/SkFontDescriptor.h"
25cb93a386Sopenharmony_ci#include "src/core/SkOSFile.h"
26cb93a386Sopenharmony_ci#include "src/ports/SkFontHost_FreeType_common.h"
27cb93a386Sopenharmony_ci#include "src/ports/SkFontMgr_config_parser.h"
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ciclass SkData;
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_ciclass SkTypeface_Preview : public SkTypeface_FreeType {
32cb93a386Sopenharmony_cipublic:
33cb93a386Sopenharmony_ci    SkTypeface_Preview(const SkFontStyle& style,
34cb93a386Sopenharmony_ci                   bool isFixedPitch,
35cb93a386Sopenharmony_ci                   const SkString& familyName)
36cb93a386Sopenharmony_ci        : INHERITED(style, isFixedPitch)
37cb93a386Sopenharmony_ci        , fFamilyName(familyName)
38cb93a386Sopenharmony_ci    { }
39cb93a386Sopenharmony_ci
40cb93a386Sopenharmony_ci    ~SkTypeface_Preview() override = default;
41cb93a386Sopenharmony_ci
42cb93a386Sopenharmony_ciprotected:
43cb93a386Sopenharmony_ci    void onGetFamilyName(SkString* familyName) const override
44cb93a386Sopenharmony_ci    {
45cb93a386Sopenharmony_ci        *familyName = fFamilyName;
46cb93a386Sopenharmony_ci    }
47cb93a386Sopenharmony_ci
48cb93a386Sopenharmony_ci    SkString fFamilyName;
49cb93a386Sopenharmony_ci
50cb93a386Sopenharmony_ciprivate:
51cb93a386Sopenharmony_ci    typedef SkTypeface_FreeType INHERITED;
52cb93a386Sopenharmony_ci};
53cb93a386Sopenharmony_ci
54cb93a386Sopenharmony_ciclass SkTypeface_PreviewSystem : public SkTypeface_Preview {
55cb93a386Sopenharmony_cipublic:
56cb93a386Sopenharmony_ci    SkTypeface_PreviewSystem(const SkString& pathName,
57cb93a386Sopenharmony_ci                         int index,
58cb93a386Sopenharmony_ci                         const SkFixed* axes, int axesCount,
59cb93a386Sopenharmony_ci                         const SkFontStyle& style,
60cb93a386Sopenharmony_ci                         bool isFixedPitch,
61cb93a386Sopenharmony_ci                         const SkString& familyName,
62cb93a386Sopenharmony_ci                         const SkTArray<SkLanguage, true>& lang,
63cb93a386Sopenharmony_ci                         FontVariant variantStyle)
64cb93a386Sopenharmony_ci        : INHERITED(style, isFixedPitch, familyName)
65cb93a386Sopenharmony_ci        , fPathName(pathName)
66cb93a386Sopenharmony_ci        , fIndex(index)
67cb93a386Sopenharmony_ci        , fAxes(axes, axesCount)
68cb93a386Sopenharmony_ci        , fLang(lang)
69cb93a386Sopenharmony_ci        , fVariantStyle(variantStyle)
70cb93a386Sopenharmony_ci        , fFile(nullptr)
71cb93a386Sopenharmony_ci    { }
72cb93a386Sopenharmony_ci
73cb93a386Sopenharmony_ci    ~SkTypeface_PreviewSystem() override = default;
74cb93a386Sopenharmony_ci
75cb93a386Sopenharmony_ci    std::unique_ptr<SkStreamAsset> makeStream() const
76cb93a386Sopenharmony_ci    {
77cb93a386Sopenharmony_ci        if (fFile) {
78cb93a386Sopenharmony_ci            sk_sp<SkData> data(SkData::MakeFromFILE(fFile));
79cb93a386Sopenharmony_ci            return data ? std::make_unique<SkMemoryStream>(std::move(data)) : nullptr;
80cb93a386Sopenharmony_ci        }
81cb93a386Sopenharmony_ci        return SkStream::MakeFromFile(fPathName.c_str());
82cb93a386Sopenharmony_ci    }
83cb93a386Sopenharmony_ci
84cb93a386Sopenharmony_ci    virtual void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const override
85cb93a386Sopenharmony_ci    {
86cb93a386Sopenharmony_ci        SkASSERT(desc);
87cb93a386Sopenharmony_ci        SkASSERT(serialize);
88cb93a386Sopenharmony_ci        desc->setFamilyName(fFamilyName.c_str());
89cb93a386Sopenharmony_ci        desc->setStyle(this->fontStyle());
90cb93a386Sopenharmony_ci        *serialize = false;
91cb93a386Sopenharmony_ci    }
92cb93a386Sopenharmony_ci
93cb93a386Sopenharmony_ci    std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override
94cb93a386Sopenharmony_ci    {
95cb93a386Sopenharmony_ci        *ttcIndex = fIndex;
96cb93a386Sopenharmony_ci        return this->makeStream();
97cb93a386Sopenharmony_ci    }
98cb93a386Sopenharmony_ci
99cb93a386Sopenharmony_ci    std::unique_ptr<SkFontData> onMakeFontData() const override
100cb93a386Sopenharmony_ci    {
101cb93a386Sopenharmony_ci        return std::make_unique<SkFontData>(this->makeStream(), fIndex, fAxes.begin(), fAxes.count());
102cb93a386Sopenharmony_ci    }
103cb93a386Sopenharmony_ci
104cb93a386Sopenharmony_ci    sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override
105cb93a386Sopenharmony_ci    {
106cb93a386Sopenharmony_ci        std::unique_ptr<SkFontData> data = this->cloneFontData(args);
107cb93a386Sopenharmony_ci        if (!data) {
108cb93a386Sopenharmony_ci            return nullptr;
109cb93a386Sopenharmony_ci        }
110cb93a386Sopenharmony_ci        return sk_make_sp<SkTypeface_PreviewSystem>(fPathName,
111cb93a386Sopenharmony_ci                                                fIndex,
112cb93a386Sopenharmony_ci                                                data->getAxis(),
113cb93a386Sopenharmony_ci                                                data->getAxisCount(),
114cb93a386Sopenharmony_ci                                                this->fontStyle(),
115cb93a386Sopenharmony_ci                                                this->isFixedPitch(),
116cb93a386Sopenharmony_ci                                                fFamilyName,
117cb93a386Sopenharmony_ci                                                fLang,
118cb93a386Sopenharmony_ci                                                fVariantStyle);
119cb93a386Sopenharmony_ci    }
120cb93a386Sopenharmony_ci
121cb93a386Sopenharmony_ci    const SkString fPathName;
122cb93a386Sopenharmony_ci    int fIndex;
123cb93a386Sopenharmony_ci    const SkSTArray<4, SkFixed, true> fAxes;
124cb93a386Sopenharmony_ci    const SkSTArray<4, SkLanguage, true> fLang;
125cb93a386Sopenharmony_ci    const FontVariant fVariantStyle;
126cb93a386Sopenharmony_ci    SkAutoTCallVProc<FILE, sk_fclose> fFile;
127cb93a386Sopenharmony_ci
128cb93a386Sopenharmony_ci    typedef SkTypeface_Preview INHERITED;
129cb93a386Sopenharmony_ci};
130cb93a386Sopenharmony_ci
131cb93a386Sopenharmony_ciclass SkTypeface_PreviewStream : public SkTypeface_Preview {
132cb93a386Sopenharmony_cipublic:
133cb93a386Sopenharmony_ci    SkTypeface_PreviewStream(std::unique_ptr<SkFontData> data,
134cb93a386Sopenharmony_ci                         const SkFontStyle& style,
135cb93a386Sopenharmony_ci                         bool isFixedPitch,
136cb93a386Sopenharmony_ci                         const SkString& familyName)
137cb93a386Sopenharmony_ci        : INHERITED(style, isFixedPitch, familyName)
138cb93a386Sopenharmony_ci        , fData(std::move(data))
139cb93a386Sopenharmony_ci    { }
140cb93a386Sopenharmony_ci
141cb93a386Sopenharmony_ci    ~SkTypeface_PreviewStream() override = default;
142cb93a386Sopenharmony_ci
143cb93a386Sopenharmony_ci    virtual void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const override
144cb93a386Sopenharmony_ci    {
145cb93a386Sopenharmony_ci        SkASSERT(desc);
146cb93a386Sopenharmony_ci        SkASSERT(serialize);
147cb93a386Sopenharmony_ci        desc->setFamilyName(fFamilyName.c_str());
148cb93a386Sopenharmony_ci        *serialize = true;
149cb93a386Sopenharmony_ci    }
150cb93a386Sopenharmony_ci
151cb93a386Sopenharmony_ci    std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override
152cb93a386Sopenharmony_ci    {
153cb93a386Sopenharmony_ci        *ttcIndex = fData->getIndex();
154cb93a386Sopenharmony_ci        return fData->getStream()->duplicate();
155cb93a386Sopenharmony_ci    }
156cb93a386Sopenharmony_ci
157cb93a386Sopenharmony_ci    std::unique_ptr<SkFontData> onMakeFontData() const override
158cb93a386Sopenharmony_ci    {
159cb93a386Sopenharmony_ci        return std::make_unique<SkFontData>(*fData);
160cb93a386Sopenharmony_ci    }
161cb93a386Sopenharmony_ci
162cb93a386Sopenharmony_ci    sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override
163cb93a386Sopenharmony_ci    {
164cb93a386Sopenharmony_ci        std::unique_ptr<SkFontData> data = this->cloneFontData(args);
165cb93a386Sopenharmony_ci        if (!data) {
166cb93a386Sopenharmony_ci            return nullptr;
167cb93a386Sopenharmony_ci        }
168cb93a386Sopenharmony_ci        return sk_make_sp<SkTypeface_PreviewStream>(std::move(data), this->fontStyle(), this->isFixedPitch(), fFamilyName);
169cb93a386Sopenharmony_ci    }
170cb93a386Sopenharmony_ci
171cb93a386Sopenharmony_ciprivate:
172cb93a386Sopenharmony_ci    const std::unique_ptr<const SkFontData> fData;
173cb93a386Sopenharmony_ci    typedef SkTypeface_Preview INHERITED;
174cb93a386Sopenharmony_ci};
175cb93a386Sopenharmony_ci
176cb93a386Sopenharmony_ciclass SkFontStyleSet_Preview : public SkFontStyleSet {
177cb93a386Sopenharmony_ci    typedef SkTypeface_FreeType::Scanner Scanner;
178cb93a386Sopenharmony_ci
179cb93a386Sopenharmony_cipublic:
180cb93a386Sopenharmony_ci    explicit SkFontStyleSet_Preview(const FontFamily& family, const Scanner& scanner)
181cb93a386Sopenharmony_ci    {
182cb93a386Sopenharmony_ci        const SkString* cannonicalFamilyName = nullptr;
183cb93a386Sopenharmony_ci        if (family.fNames.count() > 0) {
184cb93a386Sopenharmony_ci            cannonicalFamilyName = &family.fNames[0];
185cb93a386Sopenharmony_ci        }
186cb93a386Sopenharmony_ci        fFallbackFor = family.fFallbackFor;
187cb93a386Sopenharmony_ci
188cb93a386Sopenharmony_ci        // TODO? make this lazy
189cb93a386Sopenharmony_ci        for (int i = 0; i < family.fFonts.count(); ++i) {
190cb93a386Sopenharmony_ci            const FontFileInfo& fontFile = family.fFonts[i];
191cb93a386Sopenharmony_ci
192cb93a386Sopenharmony_ci            SkString pathName(family.fBasePath);
193cb93a386Sopenharmony_ci            pathName.append(fontFile.fFileName);
194cb93a386Sopenharmony_ci
195cb93a386Sopenharmony_ci            std::unique_ptr<SkStreamAsset> stream = SkStream::MakeFromFile(pathName.c_str());
196cb93a386Sopenharmony_ci            if (!stream) {
197cb93a386Sopenharmony_ci                SkDEBUGF("Requested font file %s does not exist or cannot be opened.\n", pathName.c_str());
198cb93a386Sopenharmony_ci                continue;
199cb93a386Sopenharmony_ci            }
200cb93a386Sopenharmony_ci
201cb93a386Sopenharmony_ci            const int ttcIndex = fontFile.fIndex;
202cb93a386Sopenharmony_ci            SkString familyName;
203cb93a386Sopenharmony_ci            SkFontStyle style;
204cb93a386Sopenharmony_ci            bool isFixedWidth = true;
205cb93a386Sopenharmony_ci            Scanner::AxisDefinitions axisDefinitions;
206cb93a386Sopenharmony_ci
207cb93a386Sopenharmony_ci            if (!scanner.scanFont(stream.get(), ttcIndex,
208cb93a386Sopenharmony_ci                &familyName, &style, &isFixedWidth, &axisDefinitions)) {
209cb93a386Sopenharmony_ci                SkDEBUGF("Requested font file %s exists, but is not a valid font.\n",
210cb93a386Sopenharmony_ci                         pathName.c_str());
211cb93a386Sopenharmony_ci                continue;
212cb93a386Sopenharmony_ci            }
213cb93a386Sopenharmony_ci
214cb93a386Sopenharmony_ci            int weight = fontFile.fWeight != 0 ? fontFile.fWeight : style.weight();
215cb93a386Sopenharmony_ci            SkFontStyle::Slant slant = style.slant();
216cb93a386Sopenharmony_ci            switch (fontFile.fStyle) {
217cb93a386Sopenharmony_ci                case FontFileInfo::Style::kAuto:
218cb93a386Sopenharmony_ci                    slant = style.slant();
219cb93a386Sopenharmony_ci                    break;
220cb93a386Sopenharmony_ci                case FontFileInfo::Style::kNormal:
221cb93a386Sopenharmony_ci                    slant = SkFontStyle::kUpright_Slant;
222cb93a386Sopenharmony_ci                    break;
223cb93a386Sopenharmony_ci                case FontFileInfo::Style::kItalic:
224cb93a386Sopenharmony_ci                    slant = SkFontStyle::kItalic_Slant;
225cb93a386Sopenharmony_ci                    break;
226cb93a386Sopenharmony_ci                default:
227cb93a386Sopenharmony_ci                    SkASSERT(false);
228cb93a386Sopenharmony_ci                    break;
229cb93a386Sopenharmony_ci            }
230cb93a386Sopenharmony_ci            style = SkFontStyle(weight, style.width(), slant);
231cb93a386Sopenharmony_ci
232cb93a386Sopenharmony_ci            uint32_t variant = family.fVariant;
233cb93a386Sopenharmony_ci            if (kDefault_FontVariant == variant) {
234cb93a386Sopenharmony_ci                variant = kCompact_FontVariant | kElegant_FontVariant;
235cb93a386Sopenharmony_ci            }
236cb93a386Sopenharmony_ci
237cb93a386Sopenharmony_ci            // The first specified family name overrides the family name found in the font.
238cb93a386Sopenharmony_ci            // TODO: SkTypeface_PreviewSystem::onCreateFamilyNameIterator should return
239cb93a386Sopenharmony_ci            // all of the specified family names in addition to the names found in the font.
240cb93a386Sopenharmony_ci            if (cannonicalFamilyName != nullptr) {
241cb93a386Sopenharmony_ci                familyName = *cannonicalFamilyName;
242cb93a386Sopenharmony_ci            }
243cb93a386Sopenharmony_ci
244cb93a386Sopenharmony_ci            SkAutoSTMalloc<4, SkFixed> axisValues(axisDefinitions.count());
245cb93a386Sopenharmony_ci            SkFontArguments::VariationPosition position = {
246cb93a386Sopenharmony_ci                fontFile.fVariationDesignPosition.begin(),
247cb93a386Sopenharmony_ci                fontFile.fVariationDesignPosition.count()
248cb93a386Sopenharmony_ci            };
249cb93a386Sopenharmony_ci            Scanner::computeAxisValues(axisDefinitions, position, axisValues, familyName);
250cb93a386Sopenharmony_ci
251cb93a386Sopenharmony_ci            fStyles.push_back().reset(new SkTypeface_PreviewSystem(pathName, ttcIndex, axisValues.get(),
252cb93a386Sopenharmony_ci                                                               axisDefinitions.count(), style, isFixedWidth,
253cb93a386Sopenharmony_ci                                                               familyName, family.fLanguages, variant));
254cb93a386Sopenharmony_ci        }
255cb93a386Sopenharmony_ci    }
256cb93a386Sopenharmony_ci
257cb93a386Sopenharmony_ci    ~SkFontStyleSet_Preview() override = default;
258cb93a386Sopenharmony_ci
259cb93a386Sopenharmony_ci    int count() override
260cb93a386Sopenharmony_ci    {
261cb93a386Sopenharmony_ci        return fStyles.count();
262cb93a386Sopenharmony_ci    }
263cb93a386Sopenharmony_ci
264cb93a386Sopenharmony_ci    void getStyle(int index, SkFontStyle* style, SkString* name) override
265cb93a386Sopenharmony_ci    {
266cb93a386Sopenharmony_ci        if (index < 0 || fStyles.count() <= index) {
267cb93a386Sopenharmony_ci            return;
268cb93a386Sopenharmony_ci        }
269cb93a386Sopenharmony_ci        if (style) {
270cb93a386Sopenharmony_ci            *style = fStyles[index]->fontStyle();
271cb93a386Sopenharmony_ci        }
272cb93a386Sopenharmony_ci        if (name) {
273cb93a386Sopenharmony_ci            name->reset();
274cb93a386Sopenharmony_ci        }
275cb93a386Sopenharmony_ci    }
276cb93a386Sopenharmony_ci
277cb93a386Sopenharmony_ci    SkTypeface_PreviewSystem* createTypeface(int index) override
278cb93a386Sopenharmony_ci    {
279cb93a386Sopenharmony_ci        if (index < 0 || fStyles.count() <= index) {
280cb93a386Sopenharmony_ci            return nullptr;
281cb93a386Sopenharmony_ci        }
282cb93a386Sopenharmony_ci        return SkRef(fStyles[index].get());
283cb93a386Sopenharmony_ci    }
284cb93a386Sopenharmony_ci
285cb93a386Sopenharmony_ci    SkTypeface_PreviewSystem* matchStyle(const SkFontStyle& pattern) override
286cb93a386Sopenharmony_ci    {
287cb93a386Sopenharmony_ci        return static_cast<SkTypeface_PreviewSystem*>(this->matchStyleCSS3(pattern));
288cb93a386Sopenharmony_ci    }
289cb93a386Sopenharmony_ci
290cb93a386Sopenharmony_ciprivate:
291cb93a386Sopenharmony_ci    SkTArray<sk_sp<SkTypeface_PreviewSystem>> fStyles;
292cb93a386Sopenharmony_ci    SkString fFallbackFor;
293cb93a386Sopenharmony_ci
294cb93a386Sopenharmony_ci    friend struct NameToFamily;
295cb93a386Sopenharmony_ci    friend class SkFontMgr_Preview;
296cb93a386Sopenharmony_ci
297cb93a386Sopenharmony_ci    typedef SkFontStyleSet INHERITED;
298cb93a386Sopenharmony_ci};
299cb93a386Sopenharmony_ci
300cb93a386Sopenharmony_ci/** A single family can have many names, but our API assumes unique names.
301cb93a386Sopenharmony_ci *  Map names to the back end so that all names for a given family refer to the same
302cb93a386Sopenharmony_ci *  (non-replicated) set of typefaces.
303cb93a386Sopenharmony_ci *  SkTDict<> doesn't let us do index-based lookup, so we write our own mapping.
304cb93a386Sopenharmony_ci */
305cb93a386Sopenharmony_cistruct NameToFamily {
306cb93a386Sopenharmony_ci    SkString name;
307cb93a386Sopenharmony_ci    SkFontStyleSet_Preview* styleSet;
308cb93a386Sopenharmony_ci};
309cb93a386Sopenharmony_ci
310cb93a386Sopenharmony_ciSK_API sk_sp<SkFontMgr> SkFontMgr_New_Preview();
311cb93a386Sopenharmony_ci
312cb93a386Sopenharmony_ciclass SkFontMgr_Preview : public SkFontMgr {
313cb93a386Sopenharmony_cipublic:
314cb93a386Sopenharmony_ci    SkFontMgr_Preview();
315cb93a386Sopenharmony_ci    ~SkFontMgr_Preview() override = default;
316cb93a386Sopenharmony_ci
317cb93a386Sopenharmony_ciprotected:
318cb93a386Sopenharmony_ci    int onCountFamilies() const override;
319cb93a386Sopenharmony_ci    void onGetFamilyName(int index, SkString* familyName) const override;
320cb93a386Sopenharmony_ci    SkFontStyleSet* onCreateStyleSet(int index) const override;
321cb93a386Sopenharmony_ci    SkFontStyleSet* onMatchFamily(const char familyName[]) const override;
322cb93a386Sopenharmony_ci    virtual SkTypeface* onMatchFamilyStyle(const char familyName[],
323cb93a386Sopenharmony_ci                                           const SkFontStyle& style) const override;
324cb93a386Sopenharmony_ci    virtual SkTypeface* onMatchFaceStyle(const SkTypeface* typeface,
325cb93a386Sopenharmony_ci                                         const SkFontStyle& style) const override;
326cb93a386Sopenharmony_ci
327cb93a386Sopenharmony_ci    static sk_sp<SkTypeface_PreviewSystem> find_family_style_character(
328cb93a386Sopenharmony_ci            const SkString& familyName,
329cb93a386Sopenharmony_ci            const SkTArray<NameToFamily, true>& fallbackNameToFamilyMap,
330cb93a386Sopenharmony_ci            const SkFontStyle& style, bool elegant,
331cb93a386Sopenharmony_ci            const SkString& langTag, SkUnichar character);
332cb93a386Sopenharmony_ci
333cb93a386Sopenharmony_ci    virtual SkTypeface* onMatchFamilyStyleCharacter(const char familyName[],
334cb93a386Sopenharmony_ci                                                    const SkFontStyle& style,
335cb93a386Sopenharmony_ci                                                    const char* bcp47[],
336cb93a386Sopenharmony_ci                                                    int bcp47Count,
337cb93a386Sopenharmony_ci                                                    SkUnichar character) const override;
338cb93a386Sopenharmony_ci    sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData> data, int ttcIndex) const override;
339cb93a386Sopenharmony_ci    sk_sp<SkTypeface> onMakeFromFile(const char path[], int ttcIndex) const override;
340cb93a386Sopenharmony_ci    sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset> stream, int ttcIndex) const override;
341cb93a386Sopenharmony_ci    sk_sp<SkTypeface> onMakeFromStreamArgs(std::unique_ptr<SkStreamAsset> stream,
342cb93a386Sopenharmony_ci                                           const SkFontArguments& args) const override;
343cb93a386Sopenharmony_ci    sk_sp<SkTypeface> onLegacyMakeTypeface(const char familyName[], SkFontStyle style) const override;
344cb93a386Sopenharmony_ci
345cb93a386Sopenharmony_ciprivate:
346cb93a386Sopenharmony_ci    void buildNameToFamilyMap(SkTDArray<FontFamily*> families);
347cb93a386Sopenharmony_ci    void findDefaultStyleSet();
348cb93a386Sopenharmony_ci    void addFamily(FontFamily& family, int familyIndex);
349cb93a386Sopenharmony_ci
350cb93a386Sopenharmony_ci    SkTypeface_FreeType::Scanner fScanner;
351cb93a386Sopenharmony_ci
352cb93a386Sopenharmony_ci    SkTArray<sk_sp<SkFontStyleSet_Preview>> fStyleSets;
353cb93a386Sopenharmony_ci    sk_sp<SkFontStyleSet> fDefaultStyleSet;
354cb93a386Sopenharmony_ci
355cb93a386Sopenharmony_ci    SkTArray<NameToFamily, true> fNameToFamilyMap;
356cb93a386Sopenharmony_ci    SkTArray<NameToFamily, true> fFallbackNameToFamilyMap;
357cb93a386Sopenharmony_ci
358cb93a386Sopenharmony_ci    typedef SkFontMgr INHERITED;
359cb93a386Sopenharmony_ci};
360cb93a386Sopenharmony_ci
361cb93a386Sopenharmony_ci#endif // SkFontMgr_preview_DEFINED