blob: 086ae10e920ad58f8e49d18dc777ff3a2f598cc4 [file] [log] [blame]
reed@google.com83165a52013-04-11 18:31:25 +00001/*
2 * Copyright 2013 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 Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/core/SkFont.h"
9#include "include/core/SkFontMgr.h"
10#include "include/core/SkPaint.h"
11#include "include/core/SkStream.h"
12#include "include/core/SkTypeface.h"
13#include "src/core/SkAdvancedTypefaceMetrics.h"
herb660317f2020-02-10 18:54:34 -050014#include "src/core/SkScalerContext.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#include "tests/Test.h"
16#include "tools/flags/CommandLineFlags.h"
reed@google.com83165a52013-04-11 18:31:25 +000017
bungeman147ea2f2015-11-12 09:50:08 -080018#include <initializer_list>
19#include <limits>
20#include <vector>
21
Ben Wagnera9138952020-03-02 21:44:18 -050022DEFINE_bool(verboseFontMgr, false, "FontMgr will be very verbose.");
23
24DEF_TEST(FontMgr_Font, reporter) {
Mike Reed5f50f572018-11-12 13:19:37 -050025 SkFont font(nullptr, 24);
skia.committer@gmail.come1d94432014-04-09 03:04:11 +000026
Herb Derby087fad72019-01-22 14:45:16 -050027 //REPORTER_ASSERT(reporter, SkTypeface::GetDefaultTypeface() == font.getTypeface());
Mike Reedfe4fc142018-10-22 14:24:07 -040028 REPORTER_ASSERT(reporter, 24 == font.getSize());
29 REPORTER_ASSERT(reporter, 1 == font.getScaleX());
30 REPORTER_ASSERT(reporter, 0 == font.getSkewX());
reed@google.com43c27582014-04-08 15:04:29 +000031
32 uint16_t glyphs[5];
33 sk_bzero(glyphs, sizeof(glyphs));
34
Florin Malitad6db27c2018-11-02 12:08:31 -040035 // Check that no glyphs are copied with insufficient storage.
Ben Wagner51e15a62019-05-07 15:38:46 -040036 int count = font.textToGlyphs("Hello", 5, SkTextEncoding::kUTF8, glyphs, 2);
reed@google.com43c27582014-04-08 15:04:29 +000037 REPORTER_ASSERT(reporter, 5 == count);
Florin Malitad6db27c2018-11-02 12:08:31 -040038 for (const auto glyph : glyphs) { REPORTER_ASSERT(reporter, glyph == 0); }
39
Ben Wagner51e15a62019-05-07 15:38:46 -040040 SkAssertResult(font.textToGlyphs("Hello", 5, SkTextEncoding::kUTF8, glyphs,
Florin Malitad6db27c2018-11-02 12:08:31 -040041 SK_ARRAY_COUNT(glyphs)) == count);
42
reed@google.com43c27582014-04-08 15:04:29 +000043 for (int i = 0; i < count; ++i) {
44 REPORTER_ASSERT(reporter, 0 != glyphs[i]);
45 }
46 REPORTER_ASSERT(reporter, glyphs[0] != glyphs[1]); // 'h' != 'e'
47 REPORTER_ASSERT(reporter, glyphs[2] == glyphs[3]); // 'l' == 'l'
skia.committer@gmail.come1d94432014-04-09 03:04:11 +000048
Mike Reedfe4fc142018-10-22 14:24:07 -040049 const SkFont newFont(font.makeWithSize(36));
Herb Derby087fad72019-01-22 14:45:16 -050050 REPORTER_ASSERT(reporter, font.getTypefaceOrDefault() == newFont.getTypefaceOrDefault());
Mike Reedfe4fc142018-10-22 14:24:07 -040051 REPORTER_ASSERT(reporter, 36 == newFont.getSize()); // double check we haven't changed
52 REPORTER_ASSERT(reporter, 24 == font.getSize()); // double check we haven't changed
reed@google.com43c27582014-04-08 15:04:29 +000053}
54
reed@google.comd44d9882013-09-18 20:32:25 +000055/*
56 * If the font backend is going to "alias" some font names to other fonts
57 * (e.g. sans -> Arial) then we want to at least get the same typeface back
58 * if we request the alias name multiple times.
59 */
Ben Wagnera9138952020-03-02 21:44:18 -050060DEF_TEST(FontMgr_AliasNames, reporter) {
reed@google.comc1a81eb2013-09-19 18:06:03 +000061 const char* inNames[] = {
62 "sans", "sans-serif", "serif", "monospace", "times", "helvetica"
63 };
skia.committer@gmail.comf91e3d42013-09-20 07:01:33 +000064
reed@google.comc1a81eb2013-09-19 18:06:03 +000065 for (size_t i = 0; i < SK_ARRAY_COUNT(inNames); ++i) {
mbocee6a9912016-05-31 11:42:36 -070066 sk_sp<SkTypeface> first(SkTypeface::MakeFromName(inNames[i], SkFontStyle()));
halcanary96fcdcc2015-08-27 07:41:13 -070067 if (nullptr == first.get()) {
reed@google.comc1a81eb2013-09-19 18:06:03 +000068 continue;
69 }
Ben Wagner48faf7b2021-05-04 15:07:51 -040070 SkString firstName;
71 first->getFamilyName(&firstName);
reed@google.comc1a81eb2013-09-19 18:06:03 +000072 for (int j = 0; j < 10; ++j) {
mbocee6a9912016-05-31 11:42:36 -070073 sk_sp<SkTypeface> face(SkTypeface::MakeFromName(inNames[i], SkFontStyle()));
Ben Wagner48faf7b2021-05-04 15:07:51 -040074
reed@google.comc1a81eb2013-09-19 18:06:03 +000075 SkString name;
76 face->getFamilyName(&name);
Ben Wagner48faf7b2021-05-04 15:07:51 -040077 REPORTER_ASSERT(reporter, first->uniqueID() == face->uniqueID(),
78 "Request \"%s\" First Name: \"%s\" Id: %x Received Name \"%s\" Id %x",
79 inNames[i], firstName.c_str(), first->uniqueID(), name.c_str(), face->uniqueID());
reed@google.comc1a81eb2013-09-19 18:06:03 +000080 }
reed@google.comd44d9882013-09-18 20:32:25 +000081 }
82}
83
Ben Wagnera9138952020-03-02 21:44:18 -050084DEF_TEST(FontMgr_Iter, reporter) {
Hal Canary342b7ac2016-11-04 11:49:42 -040085 sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
reed@google.com83165a52013-04-11 18:31:25 +000086 int count = fm->countFamilies();
87
88 for (int i = 0; i < count; ++i) {
89 SkString fname;
90 fm->getFamilyName(i, &fname);
reed@google.com83165a52013-04-11 18:31:25 +000091
Hal Canary342b7ac2016-11-04 11:49:42 -040092 sk_sp<SkFontStyleSet> fnset(fm->matchFamily(fname.c_str()));
93 sk_sp<SkFontStyleSet> set(fm->createStyleSet(i));
bungeman@google.com71033442013-05-01 14:21:20 +000094 REPORTER_ASSERT(reporter, fnset->count() == set->count());
reed@google.com83165a52013-04-11 18:31:25 +000095
Ben Wagnera9138952020-03-02 21:44:18 -050096 if (FLAGS_verboseFontMgr) {
reed@google.com83165a52013-04-11 18:31:25 +000097 SkDebugf("[%2d] %s\n", i, fname.c_str());
98 }
99
100 for (int j = 0; j < set->count(); ++j) {
101 SkString sname;
102 SkFontStyle fs;
103 set->getStyle(j, &fs, &sname);
reed@google.comeb029572013-04-25 14:59:32 +0000104// REPORTER_ASSERT(reporter, sname.size() > 0);
reed@google.com83165a52013-04-11 18:31:25 +0000105
Hal Canary342b7ac2016-11-04 11:49:42 -0400106 sk_sp<SkTypeface> face(set->createTypeface(j));
reed@google.comc1ccda32013-04-19 14:28:54 +0000107// REPORTER_ASSERT(reporter, face.get());
reed@google.com83165a52013-04-11 18:31:25 +0000108
Ben Wagnera9138952020-03-02 21:44:18 -0500109 if (FLAGS_verboseFontMgr) {
reed@google.com83165a52013-04-11 18:31:25 +0000110 SkDebugf("\t[%d] %s [%3d %d %d]\n", j, sname.c_str(),
bungemanb4bb7d82016-04-27 10:21:04 -0700111 fs.weight(), fs.width(), fs.slant());
reed@google.com83165a52013-04-11 18:31:25 +0000112 }
113 }
114 }
115}
116
Ben Wagnera9138952020-03-02 21:44:18 -0500117DEF_TEST(FontMgr_Match, reporter) {
bungeman7575bb12017-05-01 13:02:42 -0400118 sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
119 sk_sp<SkFontStyleSet> styleSet(fm->matchFamily(nullptr));
120 REPORTER_ASSERT(reporter, styleSet);
121}
122
Ben Wagnera9138952020-03-02 21:44:18 -0500123DEF_TEST(FontMgr_MatchStyleCSS3, reporter) {
bungeman147ea2f2015-11-12 09:50:08 -0800124 static const SkFontStyle invalidFontStyle(101, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
125
126 class TestTypeface : public SkTypeface {
127 public:
bungemane3aea102016-07-13 05:16:58 -0700128 TestTypeface(const SkFontStyle& fontStyle) : SkTypeface(fontStyle, false){}
bungeman147ea2f2015-11-12 09:50:08 -0800129 protected:
Ben Wagner4212a7d2019-02-25 14:27:46 -0500130 std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override { return nullptr; }
Bruce Wang536ad2c2018-06-25 11:37:25 -0400131 sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override {
132 return sk_ref_sp(this);
133 }
Ben Wagnerf73a0292020-12-22 14:16:16 -0500134 std::unique_ptr<SkScalerContext> onCreateScalerContext(
135 const SkScalerContextEffects& effects, const SkDescriptor* desc) const override
136 {
137 return SkScalerContext::MakeEmpty(
herb660317f2020-02-10 18:54:34 -0500138 sk_ref_sp(const_cast<TestTypeface*>(this)), effects, desc);
bungeman147ea2f2015-11-12 09:50:08 -0800139 }
140 void onFilterRec(SkScalerContextRec*) const override { }
Hal Canary209e4b12017-05-04 14:23:55 -0400141 std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override {
142 return nullptr;
143 }
bungeman147ea2f2015-11-12 09:50:08 -0800144 void onGetFontDescriptor(SkFontDescriptor*, bool*) const override { }
Mike Reed64670cb2019-04-16 11:37:38 -0700145 void onCharsToGlyphs(const SkUnichar* chars, int count, SkGlyphID glyphs[]) const override {
146 sk_bzero(glyphs, count * sizeof(glyphs[0]));
bungeman147ea2f2015-11-12 09:50:08 -0800147 }
Mike Kleinfc6c37b2016-09-27 09:34:10 -0400148 int onCountGlyphs() const override { return 0; }
Ben Wagner2c2240f2019-04-17 16:04:30 -0400149 void getPostScriptGlyphNames(SkString*) const override {}
150 void getGlyphToUnicodeMap(SkUnichar*) const override {}
Mike Kleinfc6c37b2016-09-27 09:34:10 -0400151 int onGetUPEM() const override { return 0; }
bungeman147ea2f2015-11-12 09:50:08 -0800152 class EmptyLocalizedStrings : public SkTypeface::LocalizedStrings {
153 public:
154 bool next(SkTypeface::LocalizedString*) override { return false; }
155 };
156 void onGetFamilyName(SkString* familyName) const override {
157 familyName->reset();
158 }
Ben Wagner59637dd2020-10-05 18:25:03 -0400159 bool onGetPostScriptName(SkString*) const override { return false; }
bungeman147ea2f2015-11-12 09:50:08 -0800160 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override {
161 return new EmptyLocalizedStrings;
Mike Kleinfc6c37b2016-09-27 09:34:10 -0400162 }
Ben Wagnerfc497342017-02-24 11:15:26 -0500163 int onGetVariationDesignPosition(
164 SkFontArguments::VariationPosition::Coordinate coordinates[],
165 int coordinateCount) const override
166 {
167 return 0;
168 }
Ben Wagner2c2240f2019-04-17 16:04:30 -0400169 int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[],
170 int parameterCount) const override
171 {
172 return -1;
173 }
bungeman147ea2f2015-11-12 09:50:08 -0800174 int onGetTableTags(SkFontTableTag tags[]) const override { return 0; }
175 size_t onGetTableData(SkFontTableTag, size_t, size_t, void*) const override {
176 return 0;
177 }
178 };
179
180 class TestFontStyleSet : public SkFontStyleSet {
181 public:
182 TestFontStyleSet(std::initializer_list<SkFontStyle> styles) : fStyles(styles) {}
183 int count() override { return static_cast<int>(fStyles.size()); }
184 void getStyle(int index, SkFontStyle* style, SkString*) override {
185 if (style) {
186 *style = fStyles[index];
187 }
188 }
189 SkTypeface* createTypeface(int index) override {
190 if (index < 0 || this->count() <= index) {
bungemane3aea102016-07-13 05:16:58 -0700191 return new TestTypeface(invalidFontStyle);
bungeman147ea2f2015-11-12 09:50:08 -0800192 }
bungemane3aea102016-07-13 05:16:58 -0700193 return new TestTypeface(fStyles[index]);
bungeman147ea2f2015-11-12 09:50:08 -0800194 }
195 SkTypeface* matchStyle(const SkFontStyle& pattern) override {
196 return this->matchStyleCSS3(pattern);
197 }
198 private:
199 std::vector<SkFontStyle> fStyles;
200 };
201
202 SkFontStyle condensed_normal_100(SkFontStyle::kThin_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kUpright_Slant);
203 SkFontStyle condensed_normal_900(SkFontStyle::kBlack_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kUpright_Slant);
204 SkFontStyle condensed_italic_100(SkFontStyle::kThin_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kItalic_Slant);
205 SkFontStyle condensed_italic_900(SkFontStyle::kBlack_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kItalic_Slant);
bungemanb4bb7d82016-04-27 10:21:04 -0700206 SkFontStyle condensed_obliqu_100(SkFontStyle::kThin_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kOblique_Slant);
207 SkFontStyle condensed_obliqu_900(SkFontStyle::kBlack_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kOblique_Slant);
bungeman147ea2f2015-11-12 09:50:08 -0800208 SkFontStyle expanded_normal_100(SkFontStyle::kThin_Weight, SkFontStyle::kExpanded_Width, SkFontStyle::kUpright_Slant);
209 SkFontStyle expanded_normal_900(SkFontStyle::kBlack_Weight, SkFontStyle::kExpanded_Width, SkFontStyle::kUpright_Slant);
210 SkFontStyle expanded_italic_100(SkFontStyle::kThin_Weight, SkFontStyle::kExpanded_Width, SkFontStyle::kItalic_Slant);
211 SkFontStyle expanded_italic_900(SkFontStyle::kBlack_Weight, SkFontStyle::kExpanded_Width, SkFontStyle::kItalic_Slant);
bungemanb4bb7d82016-04-27 10:21:04 -0700212 SkFontStyle expanded_obliqu_100(SkFontStyle::kThin_Weight, SkFontStyle::kExpanded_Width, SkFontStyle::kOblique_Slant);
213 SkFontStyle expanded_obliqu_900(SkFontStyle::kBlack_Weight, SkFontStyle::kExpanded_Width, SkFontStyle::kOblique_Slant);
bungeman147ea2f2015-11-12 09:50:08 -0800214
215 SkFontStyle normal_normal_100(SkFontStyle::kThin_Weight, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
bungeman147ea2f2015-11-12 09:50:08 -0800216 SkFontStyle normal_normal_300(SkFontStyle::kLight_Weight, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
217 SkFontStyle normal_normal_400(SkFontStyle::kNormal_Weight, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
218 SkFontStyle normal_normal_500(SkFontStyle::kMedium_Weight, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
219 SkFontStyle normal_normal_600(SkFontStyle::kSemiBold_Weight, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
bungeman147ea2f2015-11-12 09:50:08 -0800220 SkFontStyle normal_normal_900(SkFontStyle::kBlack_Weight, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
221
222 struct StyleSetTest {
223 TestFontStyleSet styleSet;
224 struct Case {
225 SkFontStyle pattern;
226 SkFontStyle expectedResult;
227 };
228 std::vector<Case> cases;
229 } tests[] = {
230 {
Ben Wagner22e04c62019-08-02 01:04:37 -0400231 { normal_normal_500, normal_normal_400 },
232 {
233 { normal_normal_400, normal_normal_400 },
234 { normal_normal_500, normal_normal_500 },
235 },
236 },
237
238 {
239 { normal_normal_500, normal_normal_300 },
240 {
241 { normal_normal_300, normal_normal_300 },
242 { normal_normal_400, normal_normal_500 },
243 { normal_normal_500, normal_normal_500 },
244 },
245 },
246
247 {
bungeman147ea2f2015-11-12 09:50:08 -0800248 { condensed_normal_100,condensed_normal_900,condensed_italic_100,condensed_italic_900,
249 expanded_normal_100, expanded_normal_900, expanded_italic_100, expanded_italic_900 },
250 {
251 { condensed_normal_100, condensed_normal_100 },
252 { condensed_normal_900, condensed_normal_900 },
253 { condensed_italic_100, condensed_italic_100 },
254 { condensed_italic_900, condensed_italic_900 },
255 { expanded_normal_100, expanded_normal_100 },
256 { expanded_normal_900, expanded_normal_900 },
257 { expanded_italic_100, expanded_italic_100 },
258 { expanded_italic_900, expanded_italic_900 },
259 },
260 },
261
262 {
263 { condensed_normal_100,condensed_italic_100,expanded_normal_100,expanded_italic_100 },
264 {
265 { condensed_normal_100, condensed_normal_100 },
266 { condensed_normal_900, condensed_normal_100 },
267 { condensed_italic_100, condensed_italic_100 },
268 { condensed_italic_900, condensed_italic_100 },
269 { expanded_normal_100, expanded_normal_100 },
270 { expanded_normal_900, expanded_normal_100 },
271 { expanded_italic_100, expanded_italic_100 },
272 { expanded_italic_900, expanded_italic_100 },
273 },
274 },
275
276 {
277 { condensed_normal_900,condensed_italic_900,expanded_normal_900,expanded_italic_900 },
278 {
279 { condensed_normal_100, condensed_normal_900 },
280 { condensed_normal_900, condensed_normal_900 },
281 { condensed_italic_100, condensed_italic_900 },
282 { condensed_italic_900, condensed_italic_900 },
283 { expanded_normal_100, expanded_normal_900 },
284 { expanded_normal_900, expanded_normal_900 },
285 { expanded_italic_100, expanded_italic_900 },
286 { expanded_italic_900, expanded_italic_900 },
287 },
288 },
289
290 {
291 { condensed_normal_100,condensed_normal_900,expanded_normal_100,expanded_normal_900 },
292 {
293 { condensed_normal_100, condensed_normal_100 },
294 { condensed_normal_900, condensed_normal_900 },
295 { condensed_italic_100, condensed_normal_100 },
296 { condensed_italic_900, condensed_normal_900 },
297 { expanded_normal_100, expanded_normal_100 },
298 { expanded_normal_900, expanded_normal_900 },
299 { expanded_italic_100, expanded_normal_100 },
300 { expanded_italic_900, expanded_normal_900 },
301 },
302 },
303
304 {
305 { condensed_normal_100,expanded_normal_100 },
306 {
307 { condensed_normal_100, condensed_normal_100 },
308 { condensed_normal_900, condensed_normal_100 },
309 { condensed_italic_100, condensed_normal_100 },
310 { condensed_italic_900, condensed_normal_100 },
311 { expanded_normal_100, expanded_normal_100 },
312 { expanded_normal_900, expanded_normal_100 },
313 { expanded_italic_100, expanded_normal_100 },
314 { expanded_italic_900, expanded_normal_100 },
315 },
316 },
317
318 {
319 { condensed_normal_900,expanded_normal_900 },
320 {
321 { condensed_normal_100, condensed_normal_900 },
322 { condensed_normal_900, condensed_normal_900 },
323 { condensed_italic_100, condensed_normal_900 },
324 { condensed_italic_900, condensed_normal_900 },
325 { expanded_normal_100, expanded_normal_900 },
326 { expanded_normal_900, expanded_normal_900 },
327 { expanded_italic_100, expanded_normal_900 },
328 { expanded_italic_900, expanded_normal_900 },
329 },
330 },
331
332 {
333 { condensed_italic_100,condensed_italic_900,expanded_italic_100,expanded_italic_900 },
334 {
335 { condensed_normal_100, condensed_italic_100 },
336 { condensed_normal_900, condensed_italic_900 },
337 { condensed_italic_100, condensed_italic_100 },
338 { condensed_italic_900, condensed_italic_900 },
339 { expanded_normal_100, expanded_italic_100 },
340 { expanded_normal_900, expanded_italic_900 },
341 { expanded_italic_100, expanded_italic_100 },
342 { expanded_italic_900, expanded_italic_900 },
343 },
344 },
345
346 {
347 { condensed_italic_100,expanded_italic_100 },
348 {
349 { condensed_normal_100, condensed_italic_100 },
350 { condensed_normal_900, condensed_italic_100 },
351 { condensed_italic_100, condensed_italic_100 },
352 { condensed_italic_900, condensed_italic_100 },
353 { expanded_normal_100, expanded_italic_100 },
354 { expanded_normal_900, expanded_italic_100 },
355 { expanded_italic_100, expanded_italic_100 },
356 { expanded_italic_900, expanded_italic_100 },
357 },
358 },
359
360 {
361 { condensed_italic_900,expanded_italic_900 },
362 {
363 { condensed_normal_100, condensed_italic_900 },
364 { condensed_normal_900, condensed_italic_900 },
365 { condensed_italic_100, condensed_italic_900 },
366 { condensed_italic_900, condensed_italic_900 },
367 { expanded_normal_100, expanded_italic_900 },
368 { expanded_normal_900, expanded_italic_900 },
369 { expanded_italic_100, expanded_italic_900 },
370 { expanded_italic_900, expanded_italic_900 },
371 },
372 },
373
374 {
375 { condensed_normal_100,condensed_normal_900,condensed_italic_100,condensed_italic_900 },
376 {
377 { condensed_normal_100, condensed_normal_100 },
378 { condensed_normal_900, condensed_normal_900 },
379 { condensed_italic_100, condensed_italic_100 },
380 { condensed_italic_900, condensed_italic_900 },
381 { expanded_normal_100, condensed_normal_100 },
382 { expanded_normal_900, condensed_normal_900 },
383 { expanded_italic_100, condensed_italic_100 },
384 { expanded_italic_900, condensed_italic_900 },
385 },
386 },
387
388 {
389 { condensed_normal_100,condensed_italic_100 },
390 {
391 { condensed_normal_100, condensed_normal_100 },
392 { condensed_normal_900, condensed_normal_100 },
393 { condensed_italic_100, condensed_italic_100 },
394 { condensed_italic_900, condensed_italic_100 },
395 { expanded_normal_100, condensed_normal_100 },
396 { expanded_normal_900, condensed_normal_100 },
397 { expanded_italic_100, condensed_italic_100 },
398 { expanded_italic_900, condensed_italic_100 },
399 },
400 },
401
402 {
403 { condensed_normal_900,condensed_italic_900 },
404 {
405 { condensed_normal_100, condensed_normal_900 },
406 { condensed_normal_900, condensed_normal_900 },
407 { condensed_italic_100, condensed_italic_900 },
408 { condensed_italic_900, condensed_italic_900 },
409 { expanded_normal_100, condensed_normal_900 },
410 { expanded_normal_900, condensed_normal_900 },
411 { expanded_italic_100, condensed_italic_900 },
412 { expanded_italic_900, condensed_italic_900 },
413 },
414 },
415
416 {
417 { condensed_normal_100,condensed_normal_900 },
418 {
419 { condensed_normal_100, condensed_normal_100 },
420 { condensed_normal_900, condensed_normal_900 },
421 { condensed_italic_100, condensed_normal_100 },
422 { condensed_italic_900, condensed_normal_900 },
423 { expanded_normal_100, condensed_normal_100 },
424 { expanded_normal_900, condensed_normal_900 },
425 { expanded_italic_100, condensed_normal_100 },
426 { expanded_italic_900, condensed_normal_900 },
427 },
428 },
429
430 {
431 { condensed_normal_100 },
432 {
433 { condensed_normal_100, condensed_normal_100 },
434 { condensed_normal_900, condensed_normal_100 },
435 { condensed_italic_100, condensed_normal_100 },
436 { condensed_italic_900, condensed_normal_100 },
437 { expanded_normal_100, condensed_normal_100 },
438 { expanded_normal_900, condensed_normal_100 },
439 { expanded_italic_100, condensed_normal_100 },
440 { expanded_italic_900, condensed_normal_100 },
441 },
442 },
443
444 {
445 { condensed_normal_900 },
446 {
447 { condensed_normal_100, condensed_normal_900 },
448 { condensed_normal_900, condensed_normal_900 },
449 { condensed_italic_100, condensed_normal_900 },
450 { condensed_italic_900, condensed_normal_900 },
451 { expanded_normal_100, condensed_normal_900 },
452 { expanded_normal_900, condensed_normal_900 },
453 { expanded_italic_100, condensed_normal_900 },
454 { expanded_italic_900, condensed_normal_900 },
455 },
456 },
457
458 {
459 { condensed_italic_100,condensed_italic_900 },
460 {
461 { condensed_normal_100, condensed_italic_100 },
462 { condensed_normal_900, condensed_italic_900 },
463 { condensed_italic_100, condensed_italic_100 },
464 { condensed_italic_900, condensed_italic_900 },
465 { expanded_normal_100, condensed_italic_100 },
466 { expanded_normal_900, condensed_italic_900 },
467 { expanded_italic_100, condensed_italic_100 },
468 { expanded_italic_900, condensed_italic_900 },
469 },
470 },
471
472 {
473 { condensed_italic_100 },
474 {
475 { condensed_normal_100, condensed_italic_100 },
476 { condensed_normal_900, condensed_italic_100 },
477 { condensed_italic_100, condensed_italic_100 },
478 { condensed_italic_900, condensed_italic_100 },
479 { expanded_normal_100, condensed_italic_100 },
480 { expanded_normal_900, condensed_italic_100 },
481 { expanded_italic_100, condensed_italic_100 },
482 { expanded_italic_900, condensed_italic_100 },
483 },
484 },
485
486 {
487 { condensed_italic_900 },
488 {
489 { condensed_normal_100, condensed_italic_900 },
490 { condensed_normal_900, condensed_italic_900 },
491 { condensed_italic_100, condensed_italic_900 },
492 { condensed_italic_900, condensed_italic_900 },
493 { expanded_normal_100, condensed_italic_900 },
494 { expanded_normal_900, condensed_italic_900 },
495 { expanded_italic_100, condensed_italic_900 },
496 { expanded_italic_900, condensed_italic_900 },
497 },
498 },
499
500 {
bungemanb4bb7d82016-04-27 10:21:04 -0700501 { expanded_normal_100,expanded_normal_900,
502 expanded_italic_100,expanded_italic_900 },
bungeman147ea2f2015-11-12 09:50:08 -0800503 {
504 { condensed_normal_100, expanded_normal_100 },
505 { condensed_normal_900, expanded_normal_900 },
506 { condensed_italic_100, expanded_italic_100 },
507 { condensed_italic_900, expanded_italic_900 },
bungemanb4bb7d82016-04-27 10:21:04 -0700508 { condensed_obliqu_100, expanded_italic_100 },
509 { condensed_obliqu_900, expanded_italic_900 },
bungeman147ea2f2015-11-12 09:50:08 -0800510 { expanded_normal_100, expanded_normal_100 },
511 { expanded_normal_900, expanded_normal_900 },
512 { expanded_italic_100, expanded_italic_100 },
513 { expanded_italic_900, expanded_italic_900 },
bungemanb4bb7d82016-04-27 10:21:04 -0700514 { expanded_obliqu_100, expanded_italic_100 },
515 { expanded_obliqu_900, expanded_italic_900 },
bungeman147ea2f2015-11-12 09:50:08 -0800516 },
517 },
518
519 {
520 { expanded_normal_100,expanded_italic_100 },
521 {
522 { condensed_normal_100, expanded_normal_100 },
523 { condensed_normal_900, expanded_normal_100 },
524 { condensed_italic_100, expanded_italic_100 },
525 { condensed_italic_900, expanded_italic_100 },
526 { expanded_normal_100, expanded_normal_100 },
527 { expanded_normal_900, expanded_normal_100 },
528 { expanded_italic_100, expanded_italic_100 },
529 { expanded_italic_900, expanded_italic_100 },
530 },
531 },
532
533 {
534 { expanded_normal_900,expanded_italic_900 },
535 {
536 { condensed_normal_100, expanded_normal_900 },
537 { condensed_normal_900, expanded_normal_900 },
538 { condensed_italic_100, expanded_italic_900 },
539 { condensed_italic_900, expanded_italic_900 },
540 { expanded_normal_100, expanded_normal_900 },
541 { expanded_normal_900, expanded_normal_900 },
542 { expanded_italic_100, expanded_italic_900 },
543 { expanded_italic_900, expanded_italic_900 },
544 },
545 },
546
547 {
548 { expanded_normal_100,expanded_normal_900 },
549 {
550 { condensed_normal_100, expanded_normal_100 },
551 { condensed_normal_900, expanded_normal_900 },
552 { condensed_italic_100, expanded_normal_100 },
553 { condensed_italic_900, expanded_normal_900 },
554 { expanded_normal_100, expanded_normal_100 },
555 { expanded_normal_900, expanded_normal_900 },
556 { expanded_italic_100, expanded_normal_100 },
557 { expanded_italic_900, expanded_normal_900 },
558 },
559 },
560
561 {
562 { expanded_normal_100 },
563 {
564 { condensed_normal_100, expanded_normal_100 },
565 { condensed_normal_900, expanded_normal_100 },
566 { condensed_italic_100, expanded_normal_100 },
567 { condensed_italic_900, expanded_normal_100 },
568 { expanded_normal_100, expanded_normal_100 },
569 { expanded_normal_900, expanded_normal_100 },
570 { expanded_italic_100, expanded_normal_100 },
571 { expanded_italic_900, expanded_normal_100 },
572 },
573 },
574
575 {
576 { expanded_normal_900 },
577 {
578 { condensed_normal_100, expanded_normal_900 },
579 { condensed_normal_900, expanded_normal_900 },
580 { condensed_italic_100, expanded_normal_900 },
581 { condensed_italic_900, expanded_normal_900 },
582 { expanded_normal_100, expanded_normal_900 },
583 { expanded_normal_900, expanded_normal_900 },
584 { expanded_italic_100, expanded_normal_900 },
585 { expanded_italic_900, expanded_normal_900 },
586 },
587 },
588
589 {
590 { expanded_italic_100,expanded_italic_900 },
591 {
592 { condensed_normal_100, expanded_italic_100 },
593 { condensed_normal_900, expanded_italic_900 },
594 { condensed_italic_100, expanded_italic_100 },
595 { condensed_italic_900, expanded_italic_900 },
596 { expanded_normal_100, expanded_italic_100 },
597 { expanded_normal_900, expanded_italic_900 },
598 { expanded_italic_100, expanded_italic_100 },
599 { expanded_italic_900, expanded_italic_900 },
600 },
601 },
602
603 {
604 { expanded_italic_100 },
605 {
606 { condensed_normal_100, expanded_italic_100 },
607 { condensed_normal_900, expanded_italic_100 },
608 { condensed_italic_100, expanded_italic_100 },
609 { condensed_italic_900, expanded_italic_100 },
610 { expanded_normal_100, expanded_italic_100 },
611 { expanded_normal_900, expanded_italic_100 },
612 { expanded_italic_100, expanded_italic_100 },
613 { expanded_italic_900, expanded_italic_100 },
614 },
615 },
616
617 {
618 { expanded_italic_900 },
619 {
620 { condensed_normal_100, expanded_italic_900 },
621 { condensed_normal_900, expanded_italic_900 },
622 { condensed_italic_100, expanded_italic_900 },
623 { condensed_italic_900, expanded_italic_900 },
624 { expanded_normal_100, expanded_italic_900 },
625 { expanded_normal_900, expanded_italic_900 },
626 { expanded_italic_100, expanded_italic_900 },
627 { expanded_italic_900, expanded_italic_900 },
628 },
629 },
630
631 {
632 { normal_normal_100, normal_normal_900 },
633 {
634 { normal_normal_300, normal_normal_100 },
635 { normal_normal_400, normal_normal_100 },
636 { normal_normal_500, normal_normal_100 },
637 { normal_normal_600, normal_normal_900 },
638 },
639 },
640
641 {
642 { normal_normal_100, normal_normal_400, normal_normal_900 },
643 {
644 { normal_normal_300, normal_normal_100 },
645 { normal_normal_400, normal_normal_400 },
646 { normal_normal_500, normal_normal_400 },
647 { normal_normal_600, normal_normal_900 },
648 },
649 },
650
651 {
652 { normal_normal_100, normal_normal_500, normal_normal_900 },
653 {
654 { normal_normal_300, normal_normal_100 },
655 { normal_normal_400, normal_normal_500 },
656 { normal_normal_500, normal_normal_500 },
657 { normal_normal_600, normal_normal_900 },
658 },
659 },
660
661 {
662 { },
663 {
664 { normal_normal_300, invalidFontStyle },
665 { normal_normal_400, invalidFontStyle },
666 { normal_normal_500, invalidFontStyle },
667 { normal_normal_600, invalidFontStyle },
668 },
669 },
bungemanb4bb7d82016-04-27 10:21:04 -0700670 {
671 { expanded_normal_100,expanded_normal_900,
672 expanded_italic_100,expanded_italic_900,
673 expanded_obliqu_100,expanded_obliqu_900, },
674 {
675 { condensed_normal_100, expanded_normal_100 },
676 { condensed_normal_900, expanded_normal_900 },
677 { condensed_italic_100, expanded_italic_100 },
678 { condensed_italic_900, expanded_italic_900 },
679 { condensed_obliqu_100, expanded_obliqu_100 },
680 { condensed_obliqu_900, expanded_obliqu_900 },
681 { expanded_normal_100, expanded_normal_100 },
682 { expanded_normal_900, expanded_normal_900 },
683 { expanded_italic_100, expanded_italic_100 },
684 { expanded_italic_900, expanded_italic_900 },
685 { expanded_obliqu_100, expanded_obliqu_100 },
686 { expanded_obliqu_900, expanded_obliqu_900 },
687 },
688 },
689 {
690 { expanded_normal_100,expanded_normal_900,
691 expanded_obliqu_100,expanded_obliqu_900, },
692 {
693 { condensed_normal_100, expanded_normal_100 },
694 { condensed_normal_900, expanded_normal_900 },
695 { condensed_italic_100, expanded_obliqu_100 },
696 { condensed_italic_900, expanded_obliqu_900 },
697 { condensed_obliqu_100, expanded_obliqu_100 },
698 { condensed_obliqu_900, expanded_obliqu_900 },
699 { expanded_normal_100, expanded_normal_100 },
700 { expanded_normal_900, expanded_normal_900 },
701 { expanded_italic_100, expanded_obliqu_100 },
702 { expanded_italic_900, expanded_obliqu_900 },
703 { expanded_obliqu_100, expanded_obliqu_100 },
704 { expanded_obliqu_900, expanded_obliqu_900 },
705 },
706 },
707 {
708 { expanded_italic_100,expanded_italic_900,
709 expanded_obliqu_100,expanded_obliqu_900, },
710 {
711 { condensed_normal_100, expanded_obliqu_100 },
712 { condensed_normal_900, expanded_obliqu_900 },
713 { condensed_italic_100, expanded_italic_100 },
714 { condensed_italic_900, expanded_italic_900 },
715 { condensed_obliqu_100, expanded_obliqu_100 },
716 { condensed_obliqu_900, expanded_obliqu_900 },
717 { expanded_normal_100, expanded_obliqu_100 },
718 { expanded_normal_900, expanded_obliqu_900 },
719 { expanded_italic_100, expanded_italic_100 },
720 { expanded_italic_900, expanded_italic_900 },
721 { expanded_obliqu_100, expanded_obliqu_100 },
722 { expanded_obliqu_900, expanded_obliqu_900 },
723 },
724 },
bungeman147ea2f2015-11-12 09:50:08 -0800725 };
726
727 for (StyleSetTest& test : tests) {
Mike Klein6ad99092016-10-26 10:35:22 -0400728 for (const StyleSetTest::Case& testCase : test.cases) {
Hal Canary342b7ac2016-11-04 11:49:42 -0400729 sk_sp<SkTypeface> typeface(test.styleSet.matchStyle(testCase.pattern));
bungeman147ea2f2015-11-12 09:50:08 -0800730 if (typeface) {
731 REPORTER_ASSERT(reporter, typeface->fontStyle() == testCase.expectedResult);
732 } else {
733 REPORTER_ASSERT(reporter, invalidFontStyle == testCase.expectedResult);
734 }
735 }
736 }
737}
738
Ben Wagnera9138952020-03-02 21:44:18 -0500739DEF_TEST(FontMgr_MatchCharacter, reporter) {
740 sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
741 // 0xD800 <= codepoint <= 0xDFFF || 0x10FFFF < codepoint are invalid
742 SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0x0));
743 SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0xD800));
744 SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0xDFFF));
745 SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0x110000));
746 SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0x1FFFFF));
747 SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, -1));
reed@google.com83165a52013-04-11 18:31:25 +0000748}