[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) {