1 /*
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 
8 #include "include/core/SkFont.h"
9 #include "include/core/SkFontArguments.h"
10 #include "include/core/SkFontMgr.h"
11 #include "include/core/SkFontParameters.h"
12 #include "include/core/SkFontStyle.h"
13 #include "include/core/SkFontTypes.h"
14 #include "include/core/SkRefCnt.h"
15 #include "include/core/SkStream.h"
16 #include "include/core/SkString.h"
17 #include "include/core/SkTypeface.h"
18 #include "include/core/SkTypes.h"
19 #include "include/private/base/SkMalloc.h"
20 #include "include/private/base/SkDebug.h"
21 #include "src/core/SkAdvancedTypefaceMetrics.h" // IWYU pragma: keep
22 #include "src/core/SkScalerContext.h"
23 #include "tests/Test.h"
24 #include "tools/flags/CommandLineFlags.h"
25 
26 #include <cstddef>
27 #include <cstdint>
28 #include <initializer_list>
29 #include <memory>
30 #include <vector>
31 
32 class SkDescriptor;
33 class SkFontDescriptor;
34 
35 DECLARE_bool(verboseFontMgr)
36 
DEF_TEST(FontMgr_Font,reporter)37 DEF_TEST(FontMgr_Font, reporter) {
38     SkFont font(nullptr, 24);
39 
40     //REPORTER_ASSERT(reporter, SkTypeface::GetDefaultTypeface() == font.getTypeface());
41     REPORTER_ASSERT(reporter, 24 == font.getSize());
42     REPORTER_ASSERT(reporter, 1 == font.getScaleX());
43     REPORTER_ASSERT(reporter, 0 == font.getSkewX());
44 
45     uint16_t glyphs[5];
46     sk_bzero(glyphs, sizeof(glyphs));
47 
48     // Check that no glyphs are copied with insufficient storage.
49     int count = font.textToGlyphs("Hello", 5, SkTextEncoding::kUTF8, glyphs, 2);
50     REPORTER_ASSERT(reporter, 5 == count);
51     for (const auto glyph : glyphs) { REPORTER_ASSERT(reporter, glyph == 0); }
52 
53     SkAssertResult(font.textToGlyphs("Hello", 5, SkTextEncoding::kUTF8, glyphs,
54                                      std::size(glyphs)) == count);
55 
56     for (int i = 0; i < count; ++i) {
57         REPORTER_ASSERT(reporter, 0 != glyphs[i]);
58     }
59     REPORTER_ASSERT(reporter, glyphs[0] != glyphs[1]); // 'h' != 'e'
60     REPORTER_ASSERT(reporter, glyphs[2] == glyphs[3]); // 'l' == 'l'
61 
62     const SkFont newFont(font.makeWithSize(36));
63     REPORTER_ASSERT(reporter, font.getTypefaceOrDefault() == newFont.getTypefaceOrDefault());
64     REPORTER_ASSERT(reporter, 36 == newFont.getSize());   // double check we haven't changed
65     REPORTER_ASSERT(reporter, 24 == font.getSize());   // double check we haven't changed
66 }
67 
68 /*
69  *  If the font backend is going to "alias" some font names to other fonts
70  *  (e.g. sans -> Arial) then we want to at least get the same typeface back
71  *  if we request the alias name multiple times.
72  */
DEF_TEST(FontMgr_AliasNames,reporter)73 DEF_TEST(FontMgr_AliasNames, reporter) {
74     const char* inNames[] = {
75         "sans", "sans-serif", "serif", "monospace", "times", "helvetica"
76     };
77 
78     for (size_t i = 0; i < std::size(inNames); ++i) {
79         sk_sp<SkTypeface> first(SkTypeface::MakeFromName(inNames[i], SkFontStyle()));
80         if (nullptr == first.get()) {
81             continue;
82         }
83         SkString firstName;
84         first->getFamilyName(&firstName);
85         for (int j = 0; j < 10; ++j) {
86             sk_sp<SkTypeface> face(SkTypeface::MakeFromName(inNames[i], SkFontStyle()));
87 
88             SkString name;
89             face->getFamilyName(&name);
90             REPORTER_ASSERT(reporter, first->uniqueID() == face->uniqueID(),
91                 "Request \"%s\" First Name: \"%s\" Id: %x Received Name \"%s\" Id %x",
92                 inNames[i], firstName.c_str(), first->uniqueID(), name.c_str(), face->uniqueID());
93         }
94     }
95 }
96 
DEF_TEST(FontMgr_Iter,reporter)97 DEF_TEST(FontMgr_Iter, reporter) {
98     sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
99     int count = fm->countFamilies();
100 
101     for (int i = 0; i < count; ++i) {
102         SkString fname;
103         fm->getFamilyName(i, &fname);
104 
105         sk_sp<SkFontStyleSet> fnset(fm->matchFamily(fname.c_str()));
106         sk_sp<SkFontStyleSet> set(fm->createStyleSet(i));
107         REPORTER_ASSERT(reporter, fnset->count() == set->count());
108 
109         if (FLAGS_verboseFontMgr) {
110             SkDebugf("[%2d] %s\n", i, fname.c_str());
111         }
112 
113         for (int j = 0; j < set->count(); ++j) {
114             SkString sname;
115             SkFontStyle fs;
116             set->getStyle(j, &fs, &sname);
117 //            REPORTER_ASSERT(reporter, sname.size() > 0);
118 
119             sk_sp<SkTypeface> face(set->createTypeface(j));
120 //            REPORTER_ASSERT(reporter, face.get());
121 
122             if (FLAGS_verboseFontMgr) {
123                 SkDebugf("\t[%d] %s [%3d %d %d]\n", j, sname.c_str(),
124                          fs.weight(), fs.width(), fs.slant());
125             }
126         }
127     }
128 }
129 
DEF_TEST(FontMgr_Match,reporter)130 DEF_TEST(FontMgr_Match, reporter) {
131     sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
132     sk_sp<SkFontStyleSet> styleSet(fm->matchFamily(nullptr));
133     REPORTER_ASSERT(reporter, styleSet);
134 }
135 
DEF_TEST(FontMgr_MatchStyleCSS3,reporter)136 DEF_TEST(FontMgr_MatchStyleCSS3, reporter) {
137     static const SkFontStyle invalidFontStyle(101, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
138 
139     class TestTypeface : public SkTypeface {
140     public:
141         TestTypeface(const SkFontStyle& fontStyle) : SkTypeface(fontStyle, false){}
142     protected:
143         std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override { return nullptr; }
144         sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override {
145             return sk_ref_sp(this);
146         }
147         std::unique_ptr<SkScalerContext> onCreateScalerContext(
148             const SkScalerContextEffects& effects, const SkDescriptor* desc) const override
149         {
150             return SkScalerContext::MakeEmpty(
151                     sk_ref_sp(const_cast<TestTypeface*>(this)), effects, desc);
152         }
153         void onFilterRec(SkScalerContextRec*) const override { }
154         std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override {
155             return nullptr;
156         }
157         void onGetFontDescriptor(SkFontDescriptor*, bool*) const override { }
158         void onCharsToGlyphs(const SkUnichar* chars, int count, SkGlyphID glyphs[]) const override {
159             sk_bzero(glyphs, count * sizeof(glyphs[0]));
160         }
161         int onCountGlyphs() const override { return 0; }
162         void getPostScriptGlyphNames(SkString*) const override {}
163         void getGlyphToUnicodeMap(SkUnichar*) const override {}
164         int onGetUPEM() const override { return 0; }
165         class EmptyLocalizedStrings : public SkTypeface::LocalizedStrings {
166         public:
167             bool next(SkTypeface::LocalizedString*) override { return false; }
168         };
169         void onGetFamilyName(SkString* familyName) const override {
170             familyName->reset();
171         }
172         bool onGetPostScriptName(SkString*) const override { return false; }
173         SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override {
174             return new EmptyLocalizedStrings;
175         }
176         bool onGlyphMaskNeedsCurrentColor() const override { return false; }
177         int onGetVariationDesignPosition(
178                 SkFontArguments::VariationPosition::Coordinate coordinates[],
179                 int coordinateCount) const override
180         {
181             return 0;
182         }
183         int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[],
184                                            int parameterCount) const override
185         {
186             return -1;
187         }
188         int onGetTableTags(SkFontTableTag tags[]) const override { return 0; }
189         size_t onGetTableData(SkFontTableTag, size_t, size_t, void*) const override {
190             return 0;
191         }
192     };
193 
194     class TestFontStyleSet : public SkFontStyleSet {
195     public:
196         TestFontStyleSet(std::initializer_list<SkFontStyle> styles) : fStyles(styles) {}
197         int count() override { return static_cast<int>(fStyles.size()); }
198         void getStyle(int index, SkFontStyle* style, SkString*) override {
199             if (style) {
200                 *style = fStyles[index];
201             }
202         }
203         SkTypeface* createTypeface(int index) override {
204             if (index < 0 || this->count() <= index) {
205                 return new TestTypeface(invalidFontStyle);
206             }
207             return new TestTypeface(fStyles[index]);
208         }
209         SkTypeface* matchStyle(const SkFontStyle& pattern) override {
210             return this->matchStyleCSS3(pattern);
211         }
212     private:
213         std::vector<SkFontStyle> fStyles;
214     };
215 
216     SkFontStyle condensed_normal_100(SkFontStyle::kThin_Weight,  SkFontStyle::kCondensed_Width, SkFontStyle::kUpright_Slant);
217     SkFontStyle condensed_normal_900(SkFontStyle::kBlack_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kUpright_Slant);
218     SkFontStyle condensed_italic_100(SkFontStyle::kThin_Weight,  SkFontStyle::kCondensed_Width, SkFontStyle::kItalic_Slant);
219     SkFontStyle condensed_italic_900(SkFontStyle::kBlack_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kItalic_Slant);
220     SkFontStyle condensed_obliqu_100(SkFontStyle::kThin_Weight,  SkFontStyle::kCondensed_Width, SkFontStyle::kOblique_Slant);
221     SkFontStyle condensed_obliqu_900(SkFontStyle::kBlack_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kOblique_Slant);
222     SkFontStyle  expanded_normal_100(SkFontStyle::kThin_Weight,  SkFontStyle::kExpanded_Width,  SkFontStyle::kUpright_Slant);
223     SkFontStyle  expanded_normal_900(SkFontStyle::kBlack_Weight, SkFontStyle::kExpanded_Width,  SkFontStyle::kUpright_Slant);
224     SkFontStyle  expanded_italic_100(SkFontStyle::kThin_Weight,  SkFontStyle::kExpanded_Width,  SkFontStyle::kItalic_Slant);
225     SkFontStyle  expanded_italic_900(SkFontStyle::kBlack_Weight, SkFontStyle::kExpanded_Width,  SkFontStyle::kItalic_Slant);
226     SkFontStyle  expanded_obliqu_100(SkFontStyle::kThin_Weight,  SkFontStyle::kExpanded_Width,  SkFontStyle::kOblique_Slant);
227     SkFontStyle  expanded_obliqu_900(SkFontStyle::kBlack_Weight, SkFontStyle::kExpanded_Width,  SkFontStyle::kOblique_Slant);
228 
229     SkFontStyle normal_normal_100(SkFontStyle::kThin_Weight,       SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
230     SkFontStyle normal_normal_300(SkFontStyle::kLight_Weight,      SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
231     SkFontStyle normal_normal_400(SkFontStyle::kNormal_Weight,     SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
232     SkFontStyle normal_normal_500(SkFontStyle::kMedium_Weight,     SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
233     SkFontStyle normal_normal_600(SkFontStyle::kSemiBold_Weight,   SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
234     SkFontStyle normal_normal_900(SkFontStyle::kBlack_Weight,      SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant);
235 
236     struct StyleSetTest {
237         TestFontStyleSet styleSet;
238         struct Case {
239             SkFontStyle pattern;
240             SkFontStyle expectedResult;
241         };
242         std::vector<Case> cases;
243     } tests[] = {
244         {
245             { normal_normal_500, normal_normal_400 },
246             {
247                 { normal_normal_400, normal_normal_400 },
248                 { normal_normal_500, normal_normal_500 },
249             },
250         },
251 
252         {
253             { normal_normal_500, normal_normal_300 },
254             {
255                 { normal_normal_300, normal_normal_300 },
256                 { normal_normal_400, normal_normal_500 },
257                 { normal_normal_500, normal_normal_500 },
258             },
259         },
260 
261         {
262             { condensed_normal_100,condensed_normal_900,condensed_italic_100,condensed_italic_900,
263                expanded_normal_100, expanded_normal_900, expanded_italic_100, expanded_italic_900 },
264             {
265                 { condensed_normal_100, condensed_normal_100 },
266                 { condensed_normal_900, condensed_normal_900 },
267                 { condensed_italic_100, condensed_italic_100 },
268                 { condensed_italic_900, condensed_italic_900 },
269                 { expanded_normal_100, expanded_normal_100 },
270                 { expanded_normal_900, expanded_normal_900 },
271                 { expanded_italic_100, expanded_italic_100 },
272                 { expanded_italic_900, expanded_italic_900 },
273             },
274         },
275 
276         {
277             { condensed_normal_100,condensed_italic_100,expanded_normal_100,expanded_italic_100 },
278             {
279                 { condensed_normal_100, condensed_normal_100 },
280                 { condensed_normal_900, condensed_normal_100 },
281                 { condensed_italic_100, condensed_italic_100 },
282                 { condensed_italic_900, condensed_italic_100 },
283                 { expanded_normal_100, expanded_normal_100 },
284                 { expanded_normal_900, expanded_normal_100 },
285                 { expanded_italic_100, expanded_italic_100 },
286                 { expanded_italic_900, expanded_italic_100 },
287             },
288         },
289 
290         {
291             { condensed_normal_900,condensed_italic_900,expanded_normal_900,expanded_italic_900 },
292             {
293                 { condensed_normal_100, condensed_normal_900 },
294                 { condensed_normal_900, condensed_normal_900 },
295                 { condensed_italic_100, condensed_italic_900 },
296                 { condensed_italic_900, condensed_italic_900 },
297                 { expanded_normal_100, expanded_normal_900 },
298                 { expanded_normal_900, expanded_normal_900 },
299                 { expanded_italic_100, expanded_italic_900 },
300                 { expanded_italic_900, expanded_italic_900 },
301             },
302         },
303 
304         {
305             { condensed_normal_100,condensed_normal_900,expanded_normal_100,expanded_normal_900 },
306             {
307                 { condensed_normal_100, condensed_normal_100 },
308                 { condensed_normal_900, condensed_normal_900 },
309                 { condensed_italic_100, condensed_normal_100 },
310                 { condensed_italic_900, condensed_normal_900 },
311                 { expanded_normal_100, expanded_normal_100 },
312                 { expanded_normal_900, expanded_normal_900 },
313                 { expanded_italic_100, expanded_normal_100 },
314                 { expanded_italic_900, expanded_normal_900 },
315             },
316         },
317 
318         {
319             { condensed_normal_100,expanded_normal_100 },
320             {
321                 { condensed_normal_100, condensed_normal_100 },
322                 { condensed_normal_900, condensed_normal_100 },
323                 { condensed_italic_100, condensed_normal_100 },
324                 { condensed_italic_900, condensed_normal_100 },
325                 { expanded_normal_100, expanded_normal_100 },
326                 { expanded_normal_900, expanded_normal_100 },
327                 { expanded_italic_100, expanded_normal_100 },
328                 { expanded_italic_900, expanded_normal_100 },
329             },
330         },
331 
332         {
333             { condensed_normal_900,expanded_normal_900 },
334             {
335                 { condensed_normal_100, condensed_normal_900 },
336                 { condensed_normal_900, condensed_normal_900 },
337                 { condensed_italic_100, condensed_normal_900 },
338                 { condensed_italic_900, condensed_normal_900 },
339                 { expanded_normal_100, expanded_normal_900 },
340                 { expanded_normal_900, expanded_normal_900 },
341                 { expanded_italic_100, expanded_normal_900 },
342                 { expanded_italic_900, expanded_normal_900 },
343             },
344         },
345 
346         {
347             { condensed_italic_100,condensed_italic_900,expanded_italic_100,expanded_italic_900 },
348             {
349                 { condensed_normal_100, condensed_italic_100 },
350                 { condensed_normal_900, condensed_italic_900 },
351                 { condensed_italic_100, condensed_italic_100 },
352                 { condensed_italic_900, condensed_italic_900 },
353                 { expanded_normal_100, expanded_italic_100 },
354                 { expanded_normal_900, expanded_italic_900 },
355                 { expanded_italic_100, expanded_italic_100 },
356                 { expanded_italic_900, expanded_italic_900 },
357             },
358         },
359 
360         {
361             { condensed_italic_100,expanded_italic_100 },
362             {
363                 { condensed_normal_100, condensed_italic_100 },
364                 { condensed_normal_900, condensed_italic_100 },
365                 { condensed_italic_100, condensed_italic_100 },
366                 { condensed_italic_900, condensed_italic_100 },
367                 { expanded_normal_100, expanded_italic_100 },
368                 { expanded_normal_900, expanded_italic_100 },
369                 { expanded_italic_100, expanded_italic_100 },
370                 { expanded_italic_900, expanded_italic_100 },
371             },
372         },
373 
374         {
375             { condensed_italic_900,expanded_italic_900 },
376             {
377                 { condensed_normal_100, condensed_italic_900 },
378                 { condensed_normal_900, condensed_italic_900 },
379                 { condensed_italic_100, condensed_italic_900 },
380                 { condensed_italic_900, condensed_italic_900 },
381                 { expanded_normal_100, expanded_italic_900 },
382                 { expanded_normal_900, expanded_italic_900 },
383                 { expanded_italic_100, expanded_italic_900 },
384                 { expanded_italic_900, expanded_italic_900 },
385             },
386         },
387 
388         {
389             { condensed_normal_100,condensed_normal_900,condensed_italic_100,condensed_italic_900 },
390             {
391                 { condensed_normal_100, condensed_normal_100 },
392                 { condensed_normal_900, condensed_normal_900 },
393                 { condensed_italic_100, condensed_italic_100 },
394                 { condensed_italic_900, condensed_italic_900 },
395                 { expanded_normal_100, condensed_normal_100 },
396                 { expanded_normal_900, condensed_normal_900 },
397                 { expanded_italic_100, condensed_italic_100 },
398                 { expanded_italic_900, condensed_italic_900 },
399             },
400         },
401 
402         {
403             { condensed_normal_100,condensed_italic_100 },
404             {
405                 { condensed_normal_100, condensed_normal_100 },
406                 { condensed_normal_900, condensed_normal_100 },
407                 { condensed_italic_100, condensed_italic_100 },
408                 { condensed_italic_900, condensed_italic_100 },
409                 { expanded_normal_100, condensed_normal_100 },
410                 { expanded_normal_900, condensed_normal_100 },
411                 { expanded_italic_100, condensed_italic_100 },
412                 { expanded_italic_900, condensed_italic_100 },
413             },
414         },
415 
416         {
417             { condensed_normal_900,condensed_italic_900 },
418             {
419                 { condensed_normal_100, condensed_normal_900 },
420                 { condensed_normal_900, condensed_normal_900 },
421                 { condensed_italic_100, condensed_italic_900 },
422                 { condensed_italic_900, condensed_italic_900 },
423                 { expanded_normal_100, condensed_normal_900 },
424                 { expanded_normal_900, condensed_normal_900 },
425                 { expanded_italic_100, condensed_italic_900 },
426                 { expanded_italic_900, condensed_italic_900 },
427             },
428         },
429 
430         {
431             { condensed_normal_100,condensed_normal_900 },
432             {
433                 { condensed_normal_100, condensed_normal_100 },
434                 { condensed_normal_900, condensed_normal_900 },
435                 { condensed_italic_100, condensed_normal_100 },
436                 { condensed_italic_900, condensed_normal_900 },
437                 { expanded_normal_100, condensed_normal_100 },
438                 { expanded_normal_900, condensed_normal_900 },
439                 { expanded_italic_100, condensed_normal_100 },
440                 { expanded_italic_900, condensed_normal_900 },
441             },
442         },
443 
444         {
445             { condensed_normal_100 },
446             {
447                 { condensed_normal_100, condensed_normal_100 },
448                 { condensed_normal_900, condensed_normal_100 },
449                 { condensed_italic_100, condensed_normal_100 },
450                 { condensed_italic_900, condensed_normal_100 },
451                 { expanded_normal_100, condensed_normal_100 },
452                 { expanded_normal_900, condensed_normal_100 },
453                 { expanded_italic_100, condensed_normal_100 },
454                 { expanded_italic_900, condensed_normal_100 },
455             },
456         },
457 
458         {
459             { condensed_normal_900 },
460             {
461                 { condensed_normal_100, condensed_normal_900 },
462                 { condensed_normal_900, condensed_normal_900 },
463                 { condensed_italic_100, condensed_normal_900 },
464                 { condensed_italic_900, condensed_normal_900 },
465                 { expanded_normal_100, condensed_normal_900 },
466                 { expanded_normal_900, condensed_normal_900 },
467                 { expanded_italic_100, condensed_normal_900 },
468                 { expanded_italic_900, condensed_normal_900 },
469             },
470         },
471 
472         {
473             { condensed_italic_100,condensed_italic_900 },
474             {
475                 { condensed_normal_100, condensed_italic_100 },
476                 { condensed_normal_900, condensed_italic_900 },
477                 { condensed_italic_100, condensed_italic_100 },
478                 { condensed_italic_900, condensed_italic_900 },
479                 { expanded_normal_100, condensed_italic_100 },
480                 { expanded_normal_900, condensed_italic_900 },
481                 { expanded_italic_100, condensed_italic_100 },
482                 { expanded_italic_900, condensed_italic_900 },
483             },
484         },
485 
486         {
487             { condensed_italic_100 },
488             {
489                 { condensed_normal_100, condensed_italic_100 },
490                 { condensed_normal_900, condensed_italic_100 },
491                 { condensed_italic_100, condensed_italic_100 },
492                 { condensed_italic_900, condensed_italic_100 },
493                 { expanded_normal_100, condensed_italic_100 },
494                 { expanded_normal_900, condensed_italic_100 },
495                 { expanded_italic_100, condensed_italic_100 },
496                 { expanded_italic_900, condensed_italic_100 },
497             },
498         },
499 
500         {
501             { condensed_italic_900 },
502             {
503                 { condensed_normal_100, condensed_italic_900 },
504                 { condensed_normal_900, condensed_italic_900 },
505                 { condensed_italic_100, condensed_italic_900 },
506                 { condensed_italic_900, condensed_italic_900 },
507                 { expanded_normal_100, condensed_italic_900 },
508                 { expanded_normal_900, condensed_italic_900 },
509                 { expanded_italic_100, condensed_italic_900 },
510                 { expanded_italic_900, condensed_italic_900 },
511             },
512         },
513 
514         {
515             { expanded_normal_100,expanded_normal_900,
516               expanded_italic_100,expanded_italic_900 },
517             {
518                 { condensed_normal_100, expanded_normal_100 },
519                 { condensed_normal_900, expanded_normal_900 },
520                 { condensed_italic_100, expanded_italic_100 },
521                 { condensed_italic_900, expanded_italic_900 },
522                 { condensed_obliqu_100, expanded_italic_100 },
523                 { condensed_obliqu_900, expanded_italic_900 },
524                 { expanded_normal_100, expanded_normal_100 },
525                 { expanded_normal_900, expanded_normal_900 },
526                 { expanded_italic_100, expanded_italic_100 },
527                 { expanded_italic_900, expanded_italic_900 },
528                 { expanded_obliqu_100, expanded_italic_100 },
529                 { expanded_obliqu_900, expanded_italic_900 },
530             },
531         },
532 
533         {
534             { expanded_normal_100,expanded_italic_100 },
535             {
536                 { condensed_normal_100, expanded_normal_100 },
537                 { condensed_normal_900, expanded_normal_100 },
538                 { condensed_italic_100, expanded_italic_100 },
539                 { condensed_italic_900, expanded_italic_100 },
540                 { expanded_normal_100, expanded_normal_100 },
541                 { expanded_normal_900, expanded_normal_100 },
542                 { expanded_italic_100, expanded_italic_100 },
543                 { expanded_italic_900, expanded_italic_100 },
544             },
545         },
546 
547         {
548             { expanded_normal_900,expanded_italic_900 },
549             {
550                 { condensed_normal_100, expanded_normal_900 },
551                 { condensed_normal_900, expanded_normal_900 },
552                 { condensed_italic_100, expanded_italic_900 },
553                 { condensed_italic_900, expanded_italic_900 },
554                 { expanded_normal_100, expanded_normal_900 },
555                 { expanded_normal_900, expanded_normal_900 },
556                 { expanded_italic_100, expanded_italic_900 },
557                 { expanded_italic_900, expanded_italic_900 },
558             },
559         },
560 
561         {
562             { expanded_normal_100,expanded_normal_900 },
563             {
564                 { condensed_normal_100, expanded_normal_100 },
565                 { condensed_normal_900, expanded_normal_900 },
566                 { condensed_italic_100, expanded_normal_100 },
567                 { condensed_italic_900, expanded_normal_900 },
568                 { expanded_normal_100, expanded_normal_100 },
569                 { expanded_normal_900, expanded_normal_900 },
570                 { expanded_italic_100, expanded_normal_100 },
571                 { expanded_italic_900, expanded_normal_900 },
572             },
573         },
574 
575         {
576             { expanded_normal_100 },
577             {
578                 { condensed_normal_100, expanded_normal_100 },
579                 { condensed_normal_900, expanded_normal_100 },
580                 { condensed_italic_100, expanded_normal_100 },
581                 { condensed_italic_900, expanded_normal_100 },
582                 { expanded_normal_100, expanded_normal_100 },
583                 { expanded_normal_900, expanded_normal_100 },
584                 { expanded_italic_100, expanded_normal_100 },
585                 { expanded_italic_900, expanded_normal_100 },
586             },
587         },
588 
589         {
590             { expanded_normal_900 },
591             {
592                 { condensed_normal_100, expanded_normal_900 },
593                 { condensed_normal_900, expanded_normal_900 },
594                 { condensed_italic_100, expanded_normal_900 },
595                 { condensed_italic_900, expanded_normal_900 },
596                 { expanded_normal_100, expanded_normal_900 },
597                 { expanded_normal_900, expanded_normal_900 },
598                 { expanded_italic_100, expanded_normal_900 },
599                 { expanded_italic_900, expanded_normal_900 },
600             },
601         },
602 
603         {
604             { expanded_italic_100,expanded_italic_900 },
605             {
606                 { condensed_normal_100, expanded_italic_100 },
607                 { condensed_normal_900, expanded_italic_900 },
608                 { condensed_italic_100, expanded_italic_100 },
609                 { condensed_italic_900, expanded_italic_900 },
610                 { expanded_normal_100, expanded_italic_100 },
611                 { expanded_normal_900, expanded_italic_900 },
612                 { expanded_italic_100, expanded_italic_100 },
613                 { expanded_italic_900, expanded_italic_900 },
614             },
615         },
616 
617         {
618             { expanded_italic_100 },
619             {
620                 { condensed_normal_100, expanded_italic_100 },
621                 { condensed_normal_900, expanded_italic_100 },
622                 { condensed_italic_100, expanded_italic_100 },
623                 { condensed_italic_900, expanded_italic_100 },
624                 { expanded_normal_100, expanded_italic_100 },
625                 { expanded_normal_900, expanded_italic_100 },
626                 { expanded_italic_100, expanded_italic_100 },
627                 { expanded_italic_900, expanded_italic_100 },
628             },
629         },
630 
631         {
632             { expanded_italic_900 },
633             {
634                 { condensed_normal_100, expanded_italic_900 },
635                 { condensed_normal_900, expanded_italic_900 },
636                 { condensed_italic_100, expanded_italic_900 },
637                 { condensed_italic_900, expanded_italic_900 },
638                 { expanded_normal_100, expanded_italic_900 },
639                 { expanded_normal_900, expanded_italic_900 },
640                 { expanded_italic_100, expanded_italic_900 },
641                 { expanded_italic_900, expanded_italic_900 },
642             },
643         },
644 
645         {
646             { normal_normal_100, normal_normal_900 },
647             {
648                 { normal_normal_300, normal_normal_100 },
649                 { normal_normal_400, normal_normal_100 },
650                 { normal_normal_500, normal_normal_100 },
651                 { normal_normal_600, normal_normal_900 },
652             },
653         },
654 
655         {
656             { normal_normal_100, normal_normal_400, normal_normal_900 },
657             {
658                 { normal_normal_300, normal_normal_100 },
659                 { normal_normal_400, normal_normal_400 },
660                 { normal_normal_500, normal_normal_400 },
661                 { normal_normal_600, normal_normal_900 },
662             },
663         },
664 
665         {
666             { normal_normal_100, normal_normal_500, normal_normal_900 },
667             {
668                 { normal_normal_300, normal_normal_100 },
669                 { normal_normal_400, normal_normal_500 },
670                 { normal_normal_500, normal_normal_500 },
671                 { normal_normal_600, normal_normal_900 },
672             },
673         },
674 
675         {
676             { },
677             {
678                 { normal_normal_300, invalidFontStyle },
679                 { normal_normal_400, invalidFontStyle },
680                 { normal_normal_500, invalidFontStyle },
681                 { normal_normal_600, invalidFontStyle },
682             },
683         },
684         {
685             { expanded_normal_100,expanded_normal_900,
686               expanded_italic_100,expanded_italic_900,
687               expanded_obliqu_100,expanded_obliqu_900, },
688             {
689                 { condensed_normal_100, expanded_normal_100 },
690                 { condensed_normal_900, expanded_normal_900 },
691                 { condensed_italic_100, expanded_italic_100 },
692                 { condensed_italic_900, expanded_italic_900 },
693                 { condensed_obliqu_100, expanded_obliqu_100 },
694                 { condensed_obliqu_900, expanded_obliqu_900 },
695                 { expanded_normal_100, expanded_normal_100 },
696                 { expanded_normal_900, expanded_normal_900 },
697                 { expanded_italic_100, expanded_italic_100 },
698                 { expanded_italic_900, expanded_italic_900 },
699                 { expanded_obliqu_100, expanded_obliqu_100 },
700                 { expanded_obliqu_900, expanded_obliqu_900 },
701             },
702         },
703         {
704             { expanded_normal_100,expanded_normal_900,
705               expanded_obliqu_100,expanded_obliqu_900, },
706             {
707                 { condensed_normal_100, expanded_normal_100 },
708                 { condensed_normal_900, expanded_normal_900 },
709                 { condensed_italic_100, expanded_obliqu_100 },
710                 { condensed_italic_900, expanded_obliqu_900 },
711                 { condensed_obliqu_100, expanded_obliqu_100 },
712                 { condensed_obliqu_900, expanded_obliqu_900 },
713                 { expanded_normal_100, expanded_normal_100 },
714                 { expanded_normal_900, expanded_normal_900 },
715                 { expanded_italic_100, expanded_obliqu_100 },
716                 { expanded_italic_900, expanded_obliqu_900 },
717                 { expanded_obliqu_100, expanded_obliqu_100 },
718                 { expanded_obliqu_900, expanded_obliqu_900 },
719             },
720         },
721         {
722             { expanded_italic_100,expanded_italic_900,
723               expanded_obliqu_100,expanded_obliqu_900, },
724             {
725                 { condensed_normal_100, expanded_obliqu_100 },
726                 { condensed_normal_900, expanded_obliqu_900 },
727                 { condensed_italic_100, expanded_italic_100 },
728                 { condensed_italic_900, expanded_italic_900 },
729                 { condensed_obliqu_100, expanded_obliqu_100 },
730                 { condensed_obliqu_900, expanded_obliqu_900 },
731                 { expanded_normal_100, expanded_obliqu_100 },
732                 { expanded_normal_900, expanded_obliqu_900 },
733                 { expanded_italic_100, expanded_italic_100 },
734                 { expanded_italic_900, expanded_italic_900 },
735                 { expanded_obliqu_100, expanded_obliqu_100 },
736                 { expanded_obliqu_900, expanded_obliqu_900 },
737             },
738         },
739     };
740 
741     for (StyleSetTest& test : tests) {
742         for (const StyleSetTest::Case& testCase : test.cases) {
743             sk_sp<SkTypeface> typeface(test.styleSet.matchStyle(testCase.pattern));
744             if (typeface) {
745                 REPORTER_ASSERT(reporter, typeface->fontStyle() == testCase.expectedResult);
746             } else {
747                 REPORTER_ASSERT(reporter, invalidFontStyle == testCase.expectedResult);
748             }
749         }
750     }
751 }
752 
DEF_TEST(FontMgr_MatchCharacter,reporter)753 DEF_TEST(FontMgr_MatchCharacter, reporter) {
754     sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
755     // 0xD800 <= codepoint <= 0xDFFF || 0x10FFFF < codepoint are invalid
756     SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0x0));
757     SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0xD800));
758     SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0xDFFF));
759     SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0x110000));
760     SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0x1FFFFF));
761     SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, -1));
762 }
763