[SkSVGDevice] Full font family support

Use a family name iterator and list all names instead of just one
returned by SkTypeface::getFamilyName().

R=reed@google.com,mtklein@google.com

Review URL: https://codereview.chromium.org/923583002
diff --git a/gyp/svg.gyp b/gyp/svg.gyp
index d681bda..82ff53d 100644
--- a/gyp/svg.gyp
+++ b/gyp/svg.gyp
@@ -11,6 +11,7 @@
       ],
       'include_dirs': [
         '../include/svg',
+        '../src/core',
       ],
       'sources': [
         '<(skia_include_path)/svg/SkSVGCanvas.h',
diff --git a/include/core/SkTDArray.h b/include/core/SkTDArray.h
index 08478c7..31a11c7 100644
--- a/include/core/SkTDArray.h
+++ b/include/core/SkTDArray.h
@@ -218,7 +218,7 @@
 
         for (; iter < stop; iter++) {
             if (*iter == elem) {
-                return (int) (iter - fArray);
+                return SkToInt(iter - fArray);
             }
         }
         return -1;
diff --git a/src/svg/SkSVGDevice.cpp b/src/svg/SkSVGDevice.cpp
index bf19a81..4b9f489 100644
--- a/src/svg/SkSVGDevice.cpp
+++ b/src/svg/SkSVGDevice.cpp
@@ -8,12 +8,14 @@
 #include "SkSVGDevice.h"
 
 #include "SkBitmap.h"
+#include "SkChecksum.h"
 #include "SkDraw.h"
 #include "SkPaint.h"
 #include "SkParsePath.h"
 #include "SkPathOps.h"
 #include "SkShader.h"
 #include "SkStream.h"
+#include "SkTHash.h"
 #include "SkTypeface.h"
 #include "SkUtils.h"
 #include "SkXMLWriter.h"
@@ -164,6 +166,12 @@
     return svgText;
 }
 
+uint32_t hash_family_string(const SkString& family) {
+    // This is a lame hash function, but we don't really expect to see more than 1-2
+    // family names under normal circumstances.
+    return SkChecksum::Mix(SkToU32(family.size()));
+}
+
 struct Resources {
     Resources(const SkPaint& paint)
         : fPaintServer(svg_color(paint.getColor())) {}
@@ -458,17 +466,27 @@
         this->addAttribute("font-weight", "bold");
     }
 
-    SkAutoTUnref<const SkTypeface> tface(paint.getTypeface() ?
-        SkRef(paint.getTypeface()) : SkTypeface::RefDefault(style));
-    SkString familyName;
-    tface->getFamilyName(&familyName);
-    if (!familyName.isEmpty()) {
-        this->addAttribute("font-family", familyName);
-    }
-
     if (const char* textAlign = svg_text_align(paint.getTextAlign())) {
         this->addAttribute("text-anchor", textAlign);
     }
+
+    SkString familyName;
+    SkTHashSet<SkString, hash_family_string> familySet;
+    SkAutoTUnref<const SkTypeface> tface(paint.getTypeface() ?
+        SkRef(paint.getTypeface()) : SkTypeface::RefDefault(style));
+    SkAutoTUnref<SkTypeface::LocalizedStrings> familyNameIter(tface->createFamilyNameIterator());
+    SkTypeface::LocalizedString familyString;
+    while (familyNameIter->next(&familyString)) {
+        if (familySet.contains(familyString.fString)) {
+            continue;
+        }
+        familySet.add(familyString.fString);
+        familyName.appendf((familyName.isEmpty() ? "%s" : ", %s"), familyString.fString.c_str());
+    }
+
+    if (!familyName.isEmpty()) {
+        this->addAttribute("font-family", familyName);
+    }
 }
 
 SkBaseDevice* SkSVGDevice::Create(const SkISize& size, SkXMLWriter* writer) {