diff options
Diffstat (limited to 'tests/FontNamesTest.cpp')
-rw-r--r-- | tests/FontNamesTest.cpp | 115 |
1 files changed, 81 insertions, 34 deletions
diff --git a/tests/FontNamesTest.cpp b/tests/FontNamesTest.cpp index 3845c3b6c5..18ba35695e 100644 --- a/tests/FontNamesTest.cpp +++ b/tests/FontNamesTest.cpp @@ -7,6 +7,8 @@ #include "Test.h" +#include "SkCommandLineFlags.h" +#include "SkFontMgr.h" #include "SkOTTable_name.h" #include "SkTypeface.h" @@ -108,40 +110,7 @@ struct FontNamesTest { }, }; -static void TestFontNames(skiatest::Reporter* reporter) { - static const char* interestingFont[] = { - "Arial", - "Times New Roman", - "MS PGothic", // Has Japanese name. - "Wingdings", // Uses 'Symbol' name encoding. - }; - static const SkFontTableTag nameTag = SkSetFourByteTag('n','a','m','e'); - - for (size_t i = 0; i < SK_ARRAY_COUNT(interestingFont); ++i) { - SkAutoTUnref<SkTypeface> typeface(SkTypeface::CreateFromName(interestingFont[i], - SkTypeface::kNormal)); - if (NULL == typeface.get()) { - continue; - } - size_t nameTableSize = typeface->getTableSize(nameTag); - if (0 == nameTableSize) { - continue; - } - uint8_t* nameTableData = new uint8_t[nameTableSize]; - SkAutoTDeleteArray<uint8_t> ada(nameTableData); - size_t copied = typeface->getTableData(nameTag, 0, nameTableSize, nameTableData); - if (copied != nameTableSize) { - continue; - } - - SkOTTableName::Iterator iter(*((SkOTTableName*)nameTableData), - SkOTTableName::Record::NameID::Predefined::FontFamilyName); - SkOTTableName::Iterator::Record record; - while (iter.next(record)) { - //printf("%s <%s>\n", record.name.c_str(), record.language.c_str()); - } - } - +static void test_synthetic(skiatest::Reporter* reporter, bool verbose) { for (size_t i = 0; i < SK_ARRAY_COUNT(test); ++i) { SkOTTableName::Iterator iter(*test[i].data, test[i].nameID.predefined.value); SkOTTableName::Iterator::Record record; @@ -170,6 +139,84 @@ static void TestFontNames(skiatest::Reporter* reporter) { } } +#define MAX_FAMILIES 1000 +static void test_systemfonts(skiatest::Reporter* reporter, bool verbose) { + static const SkFontTableTag nameTag = SkSetFourByteTag('n','a','m','e'); + + SkAutoTUnref<SkFontMgr> fm(SkFontMgr::RefDefault()); + int count = SkMin32(fm->countFamilies(), MAX_FAMILIES); + for (int i = 0; i < count; ++i) { + SkAutoTUnref<SkFontStyleSet> set(fm->createStyleSet(i)); + for (int j = 0; j < set->count(); ++j) { + SkString sname; + SkFontStyle fs; + set->getStyle(j, &fs, &sname); + + SkAutoTUnref<SkTypeface> typeface(set->createTypeface(j)); + + SkString familyName; + typeface->getFamilyName(&familyName); + if (verbose) { + printf("[%s]\n", familyName.c_str()); + } + + SkAutoTDelete<SkTypeface::LocalizedStrings> familyNamesIter(typeface->getFamilyNames()); + SkTypeface::LocalizedString familyNameLocalized; + while (familyNamesIter->next(&familyNameLocalized)) { + if (verbose) { + printf("(%s) <%s>\n", familyNameLocalized.fString.c_str(), + familyNameLocalized.fLanguage.c_str()); + } + } + + size_t nameTableSize = typeface->getTableSize(nameTag); + if (0 == nameTableSize) { + continue; + } + SkAutoTMalloc<uint8_t> nameTableData(nameTableSize); + size_t copied = typeface->getTableData(nameTag, 0, nameTableSize, nameTableData.get()); + if (copied != nameTableSize) { + continue; + } + + SkOTTableName::Iterator::Record record; + SkOTTableName::Iterator familyNameIter(*((SkOTTableName*)nameTableData.get()), + SkOTTableName::Record::NameID::Predefined::FontFamilyName); + while (familyNameIter.next(record)) { + REPORTER_ASSERT_MESSAGE(reporter, + SkOTTableName::Record::NameID::Predefined::FontFamilyName == record.type, + "Requested family name, got something else." + ); + if (verbose) { + printf("{%s} <%s>\n", record.name.c_str(), record.language.c_str()); + } + } + + SkOTTableName::Iterator styleNameIter(*((SkOTTableName*)nameTableData.get()), + SkOTTableName::Record::NameID::Predefined::FontSubfamilyName); + while (styleNameIter.next(record)) { + REPORTER_ASSERT_MESSAGE(reporter, + SkOTTableName::Record::NameID::Predefined::FontSubfamilyName == record.type, + "Requested subfamily name, got something else." + ); + if (verbose) { + printf("{{%s}} <%s>\n", record.name.c_str(), record.language.c_str()); + } + } + + if (verbose) { + printf("\n"); + } + } + } +} + +DEFINE_bool(verboseFontNames, false, "verbose FontNames test."); + +static void TestFontNames(skiatest::Reporter* reporter) { + test_synthetic(reporter, FLAGS_verboseFontNames); + test_systemfonts(reporter, FLAGS_verboseFontNames); +} #include "TestClassDef.h" DEFINE_TESTCLASS("FontNames", FontNamesTestClass, TestFontNames) |