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