• 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 "SkCommandLineFlags.h"
9 #include "SkFontMgr.h"
10 #include "SkTypeface.h"
11 #include "Test.h"
12 
13 #include "SkFont.h"
14 #include "SkPaint.h"
test_font(skiatest::Reporter * reporter)15 static void test_font(skiatest::Reporter* reporter) {
16     uint32_t flags = 0;
17     SkAutoTUnref<SkFont> font(SkFont::Create(NULL, 24, SkFont::kA8_MaskType, flags));
18 
19     REPORTER_ASSERT(reporter, NULL != font->getTypeface());
20     REPORTER_ASSERT(reporter, 24 == font->getSize());
21     REPORTER_ASSERT(reporter, 1 == font->getScaleX());
22     REPORTER_ASSERT(reporter, 0 == font->getSkewX());
23     REPORTER_ASSERT(reporter, SkFont::kA8_MaskType == font->getMaskType());
24 
25     uint16_t glyphs[5];
26     sk_bzero(glyphs, sizeof(glyphs));
27 
28     int count = font->textToGlyphs("Hello", 5, kUTF8_SkTextEncoding, glyphs, SK_ARRAY_COUNT(glyphs));
29 
30     REPORTER_ASSERT(reporter, 5 == count);
31     for (int i = 0; i < count; ++i) {
32         REPORTER_ASSERT(reporter, 0 != glyphs[i]);
33     }
34     REPORTER_ASSERT(reporter, glyphs[0] != glyphs[1]); // 'h' != 'e'
35     REPORTER_ASSERT(reporter, glyphs[2] == glyphs[3]); // 'l' == 'l'
36 
37     SkAutoTUnref<SkFont> newFont(font->cloneWithSize(36));
38     REPORTER_ASSERT(reporter, newFont.get());
39     REPORTER_ASSERT(reporter, font->getTypeface() == newFont->getTypeface());
40     REPORTER_ASSERT(reporter, 36 == newFont->getSize());   // double check we haven't changed
41     REPORTER_ASSERT(reporter, 24 == font->getSize());   // double check we haven't changed
42 
43     SkPaint paint;
44     paint.setTextSize(18);
45     font.reset(SkFont::Testing_CreateFromPaint(paint));
46     REPORTER_ASSERT(reporter, font.get());
47     REPORTER_ASSERT(reporter, font->getSize() == paint.getTextSize());
48     REPORTER_ASSERT(reporter, SkFont::kBW_MaskType == font->getMaskType());
49 }
50 
51 /*
52  *  If the font backend is going to "alias" some font names to other fonts
53  *  (e.g. sans -> Arial) then we want to at least get the same typeface back
54  *  if we request the alias name multiple times.
55  */
test_alias_names(skiatest::Reporter * reporter)56 static void test_alias_names(skiatest::Reporter* reporter) {
57     const char* inNames[] = {
58         "sans", "sans-serif", "serif", "monospace", "times", "helvetica"
59     };
60 
61     for (size_t i = 0; i < SK_ARRAY_COUNT(inNames); ++i) {
62         SkAutoTUnref<SkTypeface> first(SkTypeface::CreateFromName(inNames[i],
63                                                           SkTypeface::kNormal));
64         if (NULL == first.get()) {
65             continue;
66         }
67         for (int j = 0; j < 10; ++j) {
68             SkAutoTUnref<SkTypeface> face(SkTypeface::CreateFromName(inNames[i],
69                                                          SkTypeface::kNormal));
70     #if 0
71             SkString name;
72             face->getFamilyName(&name);
73             printf("request %s, received %s, first id %x received %x\n",
74                    inNames[i], name.c_str(), first->uniqueID(), face->uniqueID());
75     #endif
76             REPORTER_ASSERT(reporter, first->uniqueID() == face->uniqueID());
77         }
78     }
79 }
80 
test_fontiter(skiatest::Reporter * reporter,bool verbose)81 static void test_fontiter(skiatest::Reporter* reporter, bool verbose) {
82     SkAutoTUnref<SkFontMgr> fm(SkFontMgr::RefDefault());
83     int count = fm->countFamilies();
84 
85     for (int i = 0; i < count; ++i) {
86         SkString fname;
87         fm->getFamilyName(i, &fname);
88 
89         SkAutoTUnref<SkFontStyleSet> fnset(fm->matchFamily(fname.c_str()));
90         SkAutoTUnref<SkFontStyleSet> set(fm->createStyleSet(i));
91         REPORTER_ASSERT(reporter, fnset->count() == set->count());
92 
93         if (verbose) {
94             SkDebugf("[%2d] %s\n", i, fname.c_str());
95         }
96 
97         for (int j = 0; j < set->count(); ++j) {
98             SkString sname;
99             SkFontStyle fs;
100             set->getStyle(j, &fs, &sname);
101 //            REPORTER_ASSERT(reporter, sname.size() > 0);
102 
103             SkAutoTUnref<SkTypeface> face(set->createTypeface(j));
104 //            REPORTER_ASSERT(reporter, face.get());
105 
106             if (verbose) {
107                 SkDebugf("\t[%d] %s [%3d %d %d]\n", j, sname.c_str(),
108                          fs.weight(), fs.width(), fs.isItalic());
109             }
110         }
111     }
112 }
113 
114 DEFINE_bool(verboseFontMgr, false, "run verbose fontmgr tests.");
115 
DEF_TEST(FontMgr,reporter)116 DEF_TEST(FontMgr, reporter) {
117     test_fontiter(reporter, FLAGS_verboseFontMgr);
118     test_alias_names(reporter);
119     test_font(reporter);
120 }
121