blob: 2b4daa88bb3beec57176fa21f2196b714b7dc905 [file] [log] [blame]
Mike Klein31868212017-11-06 12:02:47 -05001/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Klein0cffcbf92019-03-20 11:08:46 -05008#include "TestFontMgr.h"
Mike Klein31868212017-11-06 12:02:47 -05009#include "SkFontDescriptor.h"
Mike Klein0cffcbf92019-03-20 11:08:46 -050010#include "TestTypeface.h"
Mike Kleinea3f0142019-03-20 11:12:10 -050011#include "ToolUtils.h"
Hal Canary39ccf5d2018-05-31 14:50:58 -040012
13#ifdef SK_XML
Mike Klein0cffcbf92019-03-20 11:08:46 -050014#include "TestSVGTypeface.h"
Hal Canary39ccf5d2018-05-31 14:50:58 -040015#endif
Mike Klein31868212017-11-06 12:02:47 -050016
Ben Wagner83c6b962018-07-10 19:40:15 -040017#include <vector>
18
Hal Canaryccafca02017-11-14 10:34:48 -050019namespace {
Mike Klein31868212017-11-06 12:02:47 -050020
Ben Wagner83c6b962018-07-10 19:40:15 -040021#include "test_font_monospace.inc"
22#include "test_font_sans_serif.inc"
23#include "test_font_serif.inc"
Mike Klein0cffcbf92019-03-20 11:08:46 -050024
Ben Wagner83c6b962018-07-10 19:40:15 -040025#include "test_font_index.inc"
Mike Klein31868212017-11-06 12:02:47 -050026
Hal Canaryccafca02017-11-14 10:34:48 -050027class FontStyleSet final : public SkFontStyleSet {
28public:
Mike Klein0cffcbf92019-03-20 11:08:46 -050029 FontStyleSet(const char* familyName) : fFamilyName(familyName) {}
Ben Wagner83c6b962018-07-10 19:40:15 -040030 struct TypefaceEntry {
31 TypefaceEntry(sk_sp<SkTypeface> typeface, SkFontStyle style, const char* styleName)
Mike Klein0cffcbf92019-03-20 11:08:46 -050032 : fTypeface(std::move(typeface)), fStyle(style), fStyleName(styleName) {}
Ben Wagner83c6b962018-07-10 19:40:15 -040033 sk_sp<SkTypeface> fTypeface;
Mike Klein0cffcbf92019-03-20 11:08:46 -050034 SkFontStyle fStyle;
35 const char* fStyleName;
Ben Wagner83c6b962018-07-10 19:40:15 -040036 };
Mike Klein31868212017-11-06 12:02:47 -050037
Ben Wagner83c6b962018-07-10 19:40:15 -040038 int count() override { return fTypefaces.size(); }
Mike Kleincb6940b2017-11-09 13:45:10 -050039
Hal Canaryccafca02017-11-14 10:34:48 -050040 void getStyle(int index, SkFontStyle* style, SkString* name) override {
Mike Klein0cffcbf92019-03-20 11:08:46 -050041 if (style) {
42 *style = fTypefaces[index].fStyle;
43 }
44 if (name) {
45 *name = fTypefaces[index].fStyleName;
46 }
Mike Klein31868212017-11-06 12:02:47 -050047 }
48
Hal Canaryccafca02017-11-14 10:34:48 -050049 SkTypeface* createTypeface(int index) override {
Ben Wagner83c6b962018-07-10 19:40:15 -040050 return SkRef(fTypefaces[index].fTypeface.get());
Mike Klein31868212017-11-06 12:02:47 -050051 }
52
Hal Canaryccafca02017-11-14 10:34:48 -050053 SkTypeface* matchStyle(const SkFontStyle& pattern) override {
Mike Kleincb6940b2017-11-09 13:45:10 -050054 return this->matchStyleCSS3(pattern);
Mike Klein31868212017-11-06 12:02:47 -050055 }
56
Ben Wagner83c6b962018-07-10 19:40:15 -040057 SkString getFamilyName() { return fFamilyName; }
58
59 std::vector<TypefaceEntry> fTypefaces;
Mike Klein0cffcbf92019-03-20 11:08:46 -050060 SkString fFamilyName;
Hal Canaryccafca02017-11-14 10:34:48 -050061};
Mike Klein31868212017-11-06 12:02:47 -050062
Hal Canaryccafca02017-11-14 10:34:48 -050063class FontMgr final : public SkFontMgr {
64public:
65 FontMgr() {
Ben Wagner83c6b962018-07-10 19:40:15 -040066 for (const auto& sub : gSubFonts) {
Mike Klein0cffcbf92019-03-20 11:08:46 -050067 sk_sp<TestTypeface> typeface =
68 sk_make_sp<TestTypeface>(sk_make_sp<SkTestFont>(sub.fFont), sub.fStyle);
Ben Wagner83c6b962018-07-10 19:40:15 -040069 bool defaultFamily = false;
70 if (&sub - gSubFonts == gDefaultFontIndex) {
Mike Klein0cffcbf92019-03-20 11:08:46 -050071 defaultFamily = true;
Ben Wagner83c6b962018-07-10 19:40:15 -040072 fDefaultTypeface = typeface;
73 }
74 bool found = false;
75 for (const auto& family : fFamilies) {
76 if (family->getFamilyName().equals(sub.fFamilyName)) {
Mike Klein0cffcbf92019-03-20 11:08:46 -050077 family->fTypefaces.emplace_back(
78 std::move(typeface), sub.fStyle, sub.fStyleName);
Ben Wagner83c6b962018-07-10 19:40:15 -040079 found = true;
80 if (defaultFamily) {
81 fDefaultFamily = family;
82 }
Mike Klein16885072018-12-11 09:54:31 -050083 break;
Ben Wagner83c6b962018-07-10 19:40:15 -040084 }
85 }
86 if (!found) {
87 fFamilies.emplace_back(sk_make_sp<FontStyleSet>(sub.fFamilyName));
Mike Klein0cffcbf92019-03-20 11:08:46 -050088 fFamilies.back()->fTypefaces.emplace_back(
89 // NOLINTNEXTLINE(bugprone-use-after-move)
90 std::move(typeface),
91 sub.fStyle,
92 sub.fStyleName);
Ben Wagner83c6b962018-07-10 19:40:15 -040093 if (defaultFamily) {
94 fDefaultFamily = fFamilies.back();
95 }
96 }
97 }
Mike Klein0cffcbf92019-03-20 11:08:46 -050098#ifdef SK_XML
Ben Wagner83c6b962018-07-10 19:40:15 -040099 fFamilies.emplace_back(sk_make_sp<FontStyleSet>("Emoji"));
Mike Klein0cffcbf92019-03-20 11:08:46 -0500100 fFamilies.back()->fTypefaces.emplace_back(
101 TestSVGTypeface::Default(), SkFontStyle::Normal(), "Normal");
Ben Wagner8dce0542019-03-08 18:05:47 -0500102
103 fFamilies.emplace_back(sk_make_sp<FontStyleSet>("Planet"));
Mike Klein0cffcbf92019-03-20 11:08:46 -0500104 fFamilies.back()->fTypefaces.emplace_back(
105 TestSVGTypeface::Planets(), SkFontStyle::Normal(), "Normal");
106#endif
Mike Kleincb6940b2017-11-09 13:45:10 -0500107 }
108
Hal Canary39ccf5d2018-05-31 14:50:58 -0400109 int onCountFamilies() const override { return fFamilies.size(); }
Mike Klein31868212017-11-06 12:02:47 -0500110
Hal Canaryccafca02017-11-14 10:34:48 -0500111 void onGetFamilyName(int index, SkString* familyName) const override {
Ben Wagner83c6b962018-07-10 19:40:15 -0400112 *familyName = fFamilies[index]->getFamilyName();
Mike Klein31868212017-11-06 12:02:47 -0500113 }
114
Hal Canaryccafca02017-11-14 10:34:48 -0500115 SkFontStyleSet* onCreateStyleSet(int index) const override {
Hal Canary39ccf5d2018-05-31 14:50:58 -0400116 sk_sp<SkFontStyleSet> ref = fFamilies[index];
117 return ref.release();
Mike Klein31868212017-11-06 12:02:47 -0500118 }
119
Hal Canaryccafca02017-11-14 10:34:48 -0500120 SkFontStyleSet* onMatchFamily(const char familyName[]) const override {
Mike Klein31868212017-11-06 12:02:47 -0500121 if (familyName) {
Mike Klein0cffcbf92019-03-20 11:08:46 -0500122 if (strstr(familyName, "ono")) {
123 return this->createStyleSet(0);
124 }
125 if (strstr(familyName, "ans")) {
126 return this->createStyleSet(1);
127 }
128 if (strstr(familyName, "erif")) {
129 return this->createStyleSet(2);
130 }
131#ifdef SK_XML
132 if (strstr(familyName, "oji")) {
133 return this->createStyleSet(6);
134 }
135 if (strstr(familyName, "Planet")) {
136 return this->createStyleSet(7);
137 }
138#endif
Mike Klein31868212017-11-06 12:02:47 -0500139 }
Ben Wagner83c6b962018-07-10 19:40:15 -0400140 return nullptr;
Mike Klein31868212017-11-06 12:02:47 -0500141 }
142
Mike Klein0cffcbf92019-03-20 11:08:46 -0500143 SkTypeface* onMatchFamilyStyle(const char familyName[],
Hal Canaryccafca02017-11-14 10:34:48 -0500144 const SkFontStyle& style) const override {
Mike Klein31868212017-11-06 12:02:47 -0500145 sk_sp<SkFontStyleSet> styleSet(this->matchFamily(familyName));
146 return styleSet->matchStyle(style);
147 }
148
Mike Klein0cffcbf92019-03-20 11:08:46 -0500149 SkTypeface* onMatchFamilyStyleCharacter(const char familyName[],
Hal Canaryccafca02017-11-14 10:34:48 -0500150 const SkFontStyle& style,
Mike Klein0cffcbf92019-03-20 11:08:46 -0500151 const char* bcp47[],
152 int bcp47Count,
153 SkUnichar character) const override {
Mike Klein31868212017-11-06 12:02:47 -0500154 (void)bcp47;
155 (void)bcp47Count;
156 (void)character;
157 return this->matchFamilyStyle(familyName, style);
158 }
159
Mike Klein0cffcbf92019-03-20 11:08:46 -0500160 SkTypeface* onMatchFaceStyle(const SkTypeface* tf, const SkFontStyle& style) const override {
Mike Klein31868212017-11-06 12:02:47 -0500161 SkString familyName;
162 tf->getFamilyName(&familyName);
163 return this->matchFamilyStyle(familyName.c_str(), style);
164 }
165
Mike Klein0cffcbf92019-03-20 11:08:46 -0500166 sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData>, int ttcIndex) const override { return nullptr; }
Hal Canaryccafca02017-11-14 10:34:48 -0500167 sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset>,
168 int ttcIndex) const override {
169 return nullptr;
170 }
171 sk_sp<SkTypeface> onMakeFromStreamArgs(std::unique_ptr<SkStreamAsset>,
172 const SkFontArguments&) const override {
173 return nullptr;
174 }
175 sk_sp<SkTypeface> onMakeFromFontData(std::unique_ptr<SkFontData>) const override {
176 return nullptr;
177 }
178 sk_sp<SkTypeface> onMakeFromFile(const char path[], int ttcIndex) const override {
Mike Kleincb6940b2017-11-09 13:45:10 -0500179 return nullptr;
Mike Klein31868212017-11-06 12:02:47 -0500180 }
181
Mike Klein0cffcbf92019-03-20 11:08:46 -0500182 sk_sp<SkTypeface> onLegacyMakeTypeface(const char familyName[],
Hal Canaryccafca02017-11-14 10:34:48 -0500183 SkFontStyle style) const override {
Ben Wagner83c6b962018-07-10 19:40:15 -0400184 if (familyName == nullptr) {
185 return sk_sp<SkTypeface>(fDefaultFamily->matchStyle(style));
186 }
187 sk_sp<SkTypeface> typeface = sk_sp<SkTypeface>(this->matchFamilyStyle(familyName, style));
188 if (!typeface) {
189 typeface = fDefaultTypeface;
190 }
191 return typeface;
Mike Klein31868212017-11-06 12:02:47 -0500192 }
193
Hal Canaryccafca02017-11-14 10:34:48 -0500194private:
Ben Wagner83c6b962018-07-10 19:40:15 -0400195 std::vector<sk_sp<FontStyleSet>> fFamilies;
Mike Klein0cffcbf92019-03-20 11:08:46 -0500196 sk_sp<FontStyleSet> fDefaultFamily;
197 sk_sp<SkTypeface> fDefaultTypeface;
Hal Canaryccafca02017-11-14 10:34:48 -0500198};
Mike Klein0cffcbf92019-03-20 11:08:46 -0500199} // namespace
Hal Canaryccafca02017-11-14 10:34:48 -0500200
Mike Kleinea3f0142019-03-20 11:12:10 -0500201namespace ToolUtils {
Ben Wagner483c7722018-02-20 17:06:07 -0500202sk_sp<SkFontMgr> MakePortableFontMgr() { return sk_make_sp<FontMgr>(); }
Mike Kleinea3f0142019-03-20 11:12:10 -0500203} // namespace ToolUtils