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" 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, 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 */ 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 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 116 DEF_TEST(FontMgr, reporter) { 117 test_fontiter(reporter, FLAGS_verboseFontMgr); 118 test_alias_names(reporter); 119 test_font(reporter); 120 } 121