1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2017 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 */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "src/core/SkFontDescriptor.h"
9cb93a386Sopenharmony_ci#include "tools/ToolUtils.h"
10cb93a386Sopenharmony_ci#include "tools/fonts/TestFontMgr.h"
11cb93a386Sopenharmony_ci#include "tools/fonts/TestTypeface.h"
12cb93a386Sopenharmony_ci
13cb93a386Sopenharmony_ci#ifdef SK_XML
14cb93a386Sopenharmony_ci#include "tools/fonts/TestSVGTypeface.h"
15cb93a386Sopenharmony_ci#endif
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_ci#include <vector>
18cb93a386Sopenharmony_ci
19cb93a386Sopenharmony_cinamespace {
20cb93a386Sopenharmony_ci
21cb93a386Sopenharmony_ci#include "test_font_monospace.inc"
22cb93a386Sopenharmony_ci#include "test_font_sans_serif.inc"
23cb93a386Sopenharmony_ci#include "test_font_serif.inc"
24cb93a386Sopenharmony_ci
25cb93a386Sopenharmony_ci#include "test_font_index.inc"
26cb93a386Sopenharmony_ci
27cb93a386Sopenharmony_ciclass FontStyleSet final : public SkFontStyleSet {
28cb93a386Sopenharmony_cipublic:
29cb93a386Sopenharmony_ci    FontStyleSet(const char* familyName) : fFamilyName(familyName) {}
30cb93a386Sopenharmony_ci    struct TypefaceEntry {
31cb93a386Sopenharmony_ci        TypefaceEntry(sk_sp<SkTypeface> typeface, SkFontStyle style, const char* styleName)
32cb93a386Sopenharmony_ci                : fTypeface(std::move(typeface)), fStyle(style), fStyleName(styleName) {}
33cb93a386Sopenharmony_ci        sk_sp<SkTypeface> fTypeface;
34cb93a386Sopenharmony_ci        SkFontStyle       fStyle;
35cb93a386Sopenharmony_ci        const char*       fStyleName;
36cb93a386Sopenharmony_ci    };
37cb93a386Sopenharmony_ci
38cb93a386Sopenharmony_ci    int count() override { return fTypefaces.size(); }
39cb93a386Sopenharmony_ci
40cb93a386Sopenharmony_ci    void getStyle(int index, SkFontStyle* style, SkString* name) override {
41cb93a386Sopenharmony_ci        if (style) {
42cb93a386Sopenharmony_ci            *style = fTypefaces[index].fStyle;
43cb93a386Sopenharmony_ci        }
44cb93a386Sopenharmony_ci        if (name) {
45cb93a386Sopenharmony_ci            *name = fTypefaces[index].fStyleName;
46cb93a386Sopenharmony_ci        }
47cb93a386Sopenharmony_ci    }
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ci    SkTypeface* createTypeface(int index) override {
50cb93a386Sopenharmony_ci        return SkRef(fTypefaces[index].fTypeface.get());
51cb93a386Sopenharmony_ci    }
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_ci    SkTypeface* matchStyle(const SkFontStyle& pattern) override {
54cb93a386Sopenharmony_ci        return this->matchStyleCSS3(pattern);
55cb93a386Sopenharmony_ci    }
56cb93a386Sopenharmony_ci
57cb93a386Sopenharmony_ci    SkString getFamilyName() { return fFamilyName; }
58cb93a386Sopenharmony_ci
59cb93a386Sopenharmony_ci    std::vector<TypefaceEntry> fTypefaces;
60cb93a386Sopenharmony_ci    SkString                   fFamilyName;
61cb93a386Sopenharmony_ci};
62cb93a386Sopenharmony_ci
63cb93a386Sopenharmony_ciclass FontMgr final : public SkFontMgr {
64cb93a386Sopenharmony_cipublic:
65cb93a386Sopenharmony_ci    FontMgr() {
66cb93a386Sopenharmony_ci        for (const auto& sub : gSubFonts) {
67cb93a386Sopenharmony_ci            sk_sp<TestTypeface> typeface =
68cb93a386Sopenharmony_ci                    sk_make_sp<TestTypeface>(sk_make_sp<SkTestFont>(sub.fFont), sub.fStyle);
69cb93a386Sopenharmony_ci            bool defaultFamily = false;
70cb93a386Sopenharmony_ci            if (&sub - gSubFonts == gDefaultFontIndex) {
71cb93a386Sopenharmony_ci                defaultFamily    = true;
72cb93a386Sopenharmony_ci                fDefaultTypeface = typeface;
73cb93a386Sopenharmony_ci            }
74cb93a386Sopenharmony_ci            bool found = false;
75cb93a386Sopenharmony_ci            for (const auto& family : fFamilies) {
76cb93a386Sopenharmony_ci                if (family->getFamilyName().equals(sub.fFamilyName)) {
77cb93a386Sopenharmony_ci                    family->fTypefaces.emplace_back(
78cb93a386Sopenharmony_ci                            std::move(typeface), sub.fStyle, sub.fStyleName);
79cb93a386Sopenharmony_ci                    found = true;
80cb93a386Sopenharmony_ci                    if (defaultFamily) {
81cb93a386Sopenharmony_ci                        fDefaultFamily = family;
82cb93a386Sopenharmony_ci                    }
83cb93a386Sopenharmony_ci                    break;
84cb93a386Sopenharmony_ci                }
85cb93a386Sopenharmony_ci            }
86cb93a386Sopenharmony_ci            if (!found) {
87cb93a386Sopenharmony_ci                fFamilies.emplace_back(sk_make_sp<FontStyleSet>(sub.fFamilyName));
88cb93a386Sopenharmony_ci                fFamilies.back()->fTypefaces.emplace_back(
89cb93a386Sopenharmony_ci                        // NOLINTNEXTLINE(bugprone-use-after-move)
90cb93a386Sopenharmony_ci                        std::move(typeface),
91cb93a386Sopenharmony_ci                        sub.fStyle,
92cb93a386Sopenharmony_ci                        sub.fStyleName);
93cb93a386Sopenharmony_ci                if (defaultFamily) {
94cb93a386Sopenharmony_ci                    fDefaultFamily = fFamilies.back();
95cb93a386Sopenharmony_ci                }
96cb93a386Sopenharmony_ci            }
97cb93a386Sopenharmony_ci        }
98cb93a386Sopenharmony_ci#if defined(SK_ENABLE_SVG)
99cb93a386Sopenharmony_ci        fFamilies.emplace_back(sk_make_sp<FontStyleSet>("Emoji"));
100cb93a386Sopenharmony_ci        fFamilies.back()->fTypefaces.emplace_back(
101cb93a386Sopenharmony_ci                TestSVGTypeface::Default(), SkFontStyle::Normal(), "Normal");
102cb93a386Sopenharmony_ci
103cb93a386Sopenharmony_ci        fFamilies.emplace_back(sk_make_sp<FontStyleSet>("Planet"));
104cb93a386Sopenharmony_ci        fFamilies.back()->fTypefaces.emplace_back(
105cb93a386Sopenharmony_ci                TestSVGTypeface::Planets(), SkFontStyle::Normal(), "Normal");
106cb93a386Sopenharmony_ci#endif
107cb93a386Sopenharmony_ci    }
108cb93a386Sopenharmony_ci
109cb93a386Sopenharmony_ci    int onCountFamilies() const override { return fFamilies.size(); }
110cb93a386Sopenharmony_ci
111cb93a386Sopenharmony_ci    void onGetFamilyName(int index, SkString* familyName) const override {
112cb93a386Sopenharmony_ci        *familyName = fFamilies[index]->getFamilyName();
113cb93a386Sopenharmony_ci    }
114cb93a386Sopenharmony_ci
115cb93a386Sopenharmony_ci    SkFontStyleSet* onCreateStyleSet(int index) const override {
116cb93a386Sopenharmony_ci        sk_sp<SkFontStyleSet> ref = fFamilies[index];
117cb93a386Sopenharmony_ci        return ref.release();
118cb93a386Sopenharmony_ci    }
119cb93a386Sopenharmony_ci
120cb93a386Sopenharmony_ci    SkFontStyleSet* onMatchFamily(const char familyName[]) const override {
121cb93a386Sopenharmony_ci        if (familyName) {
122cb93a386Sopenharmony_ci            if (strstr(familyName, "ono")) {
123cb93a386Sopenharmony_ci                return this->createStyleSet(0);
124cb93a386Sopenharmony_ci            }
125cb93a386Sopenharmony_ci            if (strstr(familyName, "ans")) {
126cb93a386Sopenharmony_ci                return this->createStyleSet(1);
127cb93a386Sopenharmony_ci            }
128cb93a386Sopenharmony_ci            if (strstr(familyName, "erif")) {
129cb93a386Sopenharmony_ci                return this->createStyleSet(2);
130cb93a386Sopenharmony_ci            }
131cb93a386Sopenharmony_ci#ifdef SK_XML
132cb93a386Sopenharmony_ci            if (strstr(familyName, "oji")) {
133cb93a386Sopenharmony_ci                return this->createStyleSet(6);
134cb93a386Sopenharmony_ci            }
135cb93a386Sopenharmony_ci            if (strstr(familyName, "Planet")) {
136cb93a386Sopenharmony_ci                return this->createStyleSet(7);
137cb93a386Sopenharmony_ci            }
138cb93a386Sopenharmony_ci#endif
139cb93a386Sopenharmony_ci        }
140cb93a386Sopenharmony_ci        return nullptr;
141cb93a386Sopenharmony_ci    }
142cb93a386Sopenharmony_ci
143cb93a386Sopenharmony_ci    SkTypeface* onMatchFamilyStyle(const char         familyName[],
144cb93a386Sopenharmony_ci                                   const SkFontStyle& style) const override {
145cb93a386Sopenharmony_ci        sk_sp<SkFontStyleSet> styleSet(this->matchFamily(familyName));
146cb93a386Sopenharmony_ci        return styleSet->matchStyle(style);
147cb93a386Sopenharmony_ci    }
148cb93a386Sopenharmony_ci
149cb93a386Sopenharmony_ci    SkTypeface* onMatchFamilyStyleCharacter(const char         familyName[],
150cb93a386Sopenharmony_ci                                            const SkFontStyle& style,
151cb93a386Sopenharmony_ci                                            const char*        bcp47[],
152cb93a386Sopenharmony_ci                                            int                bcp47Count,
153cb93a386Sopenharmony_ci                                            SkUnichar          character) const override {
154cb93a386Sopenharmony_ci        (void)bcp47;
155cb93a386Sopenharmony_ci        (void)bcp47Count;
156cb93a386Sopenharmony_ci        (void)character;
157cb93a386Sopenharmony_ci        return this->matchFamilyStyle(familyName, style);
158cb93a386Sopenharmony_ci    }
159cb93a386Sopenharmony_ci
160cb93a386Sopenharmony_ci    sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData>, int ttcIndex) const override { return nullptr; }
161cb93a386Sopenharmony_ci    sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset>,
162cb93a386Sopenharmony_ci                                            int ttcIndex) const override {
163cb93a386Sopenharmony_ci        return nullptr;
164cb93a386Sopenharmony_ci    }
165cb93a386Sopenharmony_ci    sk_sp<SkTypeface> onMakeFromStreamArgs(std::unique_ptr<SkStreamAsset>,
166cb93a386Sopenharmony_ci                                           const SkFontArguments&) const override {
167cb93a386Sopenharmony_ci        return nullptr;
168cb93a386Sopenharmony_ci    }
169cb93a386Sopenharmony_ci    sk_sp<SkTypeface> onMakeFromFile(const char path[], int ttcIndex) const override {
170cb93a386Sopenharmony_ci        return nullptr;
171cb93a386Sopenharmony_ci    }
172cb93a386Sopenharmony_ci
173cb93a386Sopenharmony_ci    sk_sp<SkTypeface> onLegacyMakeTypeface(const char  familyName[],
174cb93a386Sopenharmony_ci                                           SkFontStyle style) const override {
175cb93a386Sopenharmony_ci        if (familyName == nullptr) {
176cb93a386Sopenharmony_ci            return sk_sp<SkTypeface>(fDefaultFamily->matchStyle(style));
177cb93a386Sopenharmony_ci        }
178cb93a386Sopenharmony_ci        sk_sp<SkTypeface> typeface = sk_sp<SkTypeface>(this->matchFamilyStyle(familyName, style));
179cb93a386Sopenharmony_ci        if (!typeface) {
180cb93a386Sopenharmony_ci            typeface = fDefaultTypeface;
181cb93a386Sopenharmony_ci        }
182cb93a386Sopenharmony_ci        return typeface;
183cb93a386Sopenharmony_ci    }
184cb93a386Sopenharmony_ci
185cb93a386Sopenharmony_ciprivate:
186cb93a386Sopenharmony_ci    std::vector<sk_sp<FontStyleSet>> fFamilies;
187cb93a386Sopenharmony_ci    sk_sp<FontStyleSet>              fDefaultFamily;
188cb93a386Sopenharmony_ci    sk_sp<SkTypeface>                fDefaultTypeface;
189cb93a386Sopenharmony_ci};
190cb93a386Sopenharmony_ci}  // namespace
191cb93a386Sopenharmony_ci
192cb93a386Sopenharmony_cinamespace ToolUtils {
193cb93a386Sopenharmony_cisk_sp<SkFontMgr> MakePortableFontMgr() { return sk_make_sp<FontMgr>(); }
194cb93a386Sopenharmony_ci}  // namespace ToolUtils
195