1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2017 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "DMFontMgr.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkFontDescriptor.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "sk_tool_utils.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace {
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic constexpr const char* kFamilyNames[] = {
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    "Toy Liberation Sans",
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    "Toy Liberation Serif",
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    "Toy Liberation Mono",
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass FontStyleSet final : public SkFontStyleSet {
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    explicit FontStyleSet(int familyIndex) {
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        using sk_tool_utils::create_portable_typeface;
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const char* familyName = kFamilyNames[familyIndex];
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fTypefaces[0] = create_portable_typeface(familyName, SkFontStyle::Normal());
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fTypefaces[1] = create_portable_typeface(familyName, SkFontStyle::Bold());
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fTypefaces[2] = create_portable_typeface(familyName, SkFontStyle::Italic());
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fTypefaces[3] = create_portable_typeface(familyName, SkFontStyle::BoldItalic());
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int count() override { return 4; }
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void getStyle(int index, SkFontStyle* style, SkString* name) override {
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        switch (index) {
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            default:
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case  0: if (style) { *style = SkFontStyle::Normal(); }
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     if (name)  { *name = "Normal"; }
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     break;
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case  1: if (style) { *style = SkFontStyle::Bold(); }
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     if (name)  { *name = "Bold"; }
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     break;
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case  2: if (style) { *style = SkFontStyle::Italic(); }
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     if (name)  { *name = "Italic"; }
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     break;
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case  3: if (style) { *style = SkFontStyle::BoldItalic(); }
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     if (name)  { *name = "BoldItalic"; }
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     break;
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTypeface* createTypeface(int index) override {
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkRef(fTypefaces[index].get());
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTypeface* matchStyle(const SkFontStyle& pattern) override {
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return this->matchStyleCSS3(pattern);
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkTypeface> fTypefaces[4];
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass FontMgr final : public SkFontMgr {
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    FontMgr() {
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fFamilies[0] = sk_make_sp<FontStyleSet>(0);
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fFamilies[1] = sk_make_sp<FontStyleSet>(1);
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fFamilies[2] = sk_make_sp<FontStyleSet>(2);
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int onCountFamilies() const override { return SK_ARRAY_COUNT(fFamilies); }
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onGetFamilyName(int index, SkString* familyName) const override {
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        *familyName = kFamilyNames[index];
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkFontStyleSet* onCreateStyleSet(int index) const override {
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkRef(fFamilies[index].get());
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkFontStyleSet* onMatchFamily(const char familyName[]) const override {
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (familyName) {
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (strstr(familyName,  "ans")) { return this->createStyleSet(0); }
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (strstr(familyName, "erif")) { return this->createStyleSet(1); }
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (strstr(familyName,  "ono")) { return this->createStyleSet(2); }
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return this->createStyleSet(0);
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTypeface* onMatchFamilyStyle(const char familyName[],
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                   const SkFontStyle& style) const override {
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<SkFontStyleSet> styleSet(this->matchFamily(familyName));
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return styleSet->matchStyle(style);
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTypeface* onMatchFamilyStyleCharacter(const char familyName[],
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            const SkFontStyle& style,
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            const char* bcp47[], int bcp47Count,
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            SkUnichar character) const override {
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        (void)bcp47;
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        (void)bcp47Count;
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        (void)character;
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return this->matchFamilyStyle(familyName, style);
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTypeface* onMatchFaceStyle(const SkTypeface* tf,
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                 const SkFontStyle& style) const override {
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkString familyName;
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        tf->getFamilyName(&familyName);
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return this->matchFamilyStyle(familyName.c_str(), style);
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData>, int ttcIndex) const override {
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset>,
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            int ttcIndex) const override {
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkTypeface> onMakeFromStreamArgs(std::unique_ptr<SkStreamAsset>,
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                           const SkFontArguments&) const override {
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkTypeface> onMakeFromFontData(std::unique_ptr<SkFontData>) const override {
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkTypeface> onMakeFromFile(const char path[], int ttcIndex) const override {
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkTypeface> onLegacyMakeTypeface(const char familyName[],
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                           SkFontStyle style) const override {
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return sk_sp<SkTypeface>(this->matchFamilyStyle(familyName, style));
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<FontStyleSet> fFamilies[3];
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace DM {
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkFontMgr> MakeFontMgr() { return sk_make_sp<FontMgr>(); }
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} // namespace DM
148