Add getFamilyNames to SkTypeface.

Review URL: https://codereview.chromium.org/21716005

git-svn-id: http://skia.googlecode.com/svn/trunk@10589 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/FontNamesTest.cpp b/tests/FontNamesTest.cpp
index 3845c3b..18ba356 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 @@
     },
 };
 
-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 @@
     }
 }
 
+#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)