| Index: skia/ext/SkFontHost_fontconfig_direct.cpp
|
| diff --git a/skia/ext/SkFontHost_fontconfig_direct.cpp b/skia/ext/SkFontHost_fontconfig_direct.cpp
|
| index ed9238705a5a500628978359a989dbd338ac4a92..f2cdff864da1ec5c321cb9bd229c31dd81cfe1c4 100644
|
| --- a/skia/ext/SkFontHost_fontconfig_direct.cpp
|
| +++ b/skia/ext/SkFontHost_fontconfig_direct.cpp
|
| @@ -22,13 +22,21 @@
|
|
|
| #include <fontconfig/fontconfig.h>
|
|
|
| -FontConfigDirect::FontConfigDirect()
|
| - : next_file_id_(0) {
|
| - FcInit();
|
| -}
|
| +namespace {
|
|
|
| -bool FontConfigDirect::IsMetricCompatibleReplacement(const char* font_a,
|
| - const char* font_b)
|
| +// Equivalence classes, used to match the Liberation fonts with their
|
| +// metric-compatible replacements. See the discussion in
|
| +// GetFontEquivClass().
|
| +enum FontEquivClass
|
| +{
|
| + OTHER,
|
| + SANS,
|
| + SERIF
|
| +};
|
| +
|
| +// Match the font name against a whilelist of fonts, returning the equivalence
|
| +// class.
|
| +FontEquivClass GetFontEquivClass(const char* fontname)
|
| {
|
| // It would be nice for fontconfig to tell us whether a given suggested
|
| // replacement is a "strong" match (that is, an equivalent font) or
|
| @@ -36,65 +44,36 @@ bool FontConfigDirect::IsMetricCompatibleReplacement(const char* font_a,
|
| // substitute). However, I played around with the fontconfig API for
|
| // a good few hours and could not make it reveal this information.
|
| //
|
| - // So instead, we hardcode. These are from
|
| - // /etc/fonts/conf.d/30-metric-aliases.conf on my Ubuntu Karmic
|
| - // system.
|
| -
|
| - // We represent the data with a table. Two names with the same
|
| - // id are in the same class.
|
| - struct FontEquivClass {
|
| - char id;
|
| - const char name[20];
|
| - };
|
| - static const FontEquivClass kFontEquivClasses[] = {
|
| - { 0, "Arial" },
|
| - { 0, "Liberation Sans" },
|
| - { 0, "Albany" },
|
| - { 0, "Albany Amt" },
|
| -
|
| - { 1, "Times New Roman" },
|
| - { 1, "Liberation Serif" },
|
| - { 1, "Thorndale" },
|
| - { 1, "Thorndale AMT" },
|
| -
|
| - // Note that Liberation Mono doesn't much *look* like Courier New,
|
| - // but it's reportedly metric-compatible.
|
| - { 2, "Courier New" },
|
| - { 2, "Liberation Mono" },
|
| - { 2, "Cumberland" },
|
| - { 2, "Cumberland AMT" },
|
| -
|
| - { 3, "Helvetica" },
|
| - { 3, "Nimbus Sans L" },
|
| -
|
| - { 4, "Times" },
|
| - { 4, "Nimbus Roman No9 L" },
|
| -
|
| - { 5, "Courier" },
|
| - { 5, "Nimbus Mono L" },
|
| - };
|
| - static const size_t kClassCount =
|
| - sizeof(kFontEquivClasses)/sizeof(kFontEquivClasses[0]);
|
| -
|
| - int class_a = -1;
|
| - for (size_t i = 0; i < kClassCount; ++i) {
|
| - if (strcasecmp(kFontEquivClasses[i].name, font_a) == 0) {
|
| - class_a = kFontEquivClasses[i].id;
|
| - break;
|
| - }
|
| + // So instead, we hardcode. Initially this function emulated
|
| + // /etc/fonts/conf.d/30-metric-aliases.conf
|
| + // from my Ubuntu system, but we're better off being very conservative.
|
| +
|
| + if (strcasecmp(fontname, "Arial") == 0 ||
|
| + strcasecmp(fontname, "Liberation Sans") == 0) {
|
| + return SANS;
|
| + } else if (strcasecmp(fontname, "Times New Roman") == 0 ||
|
| + strcasecmp(fontname, "Liberation Serif") == 0) {
|
| + return SERIF;
|
| }
|
| - if (class_a == -1)
|
| - return false;
|
| + return OTHER;
|
| +}
|
|
|
| - int class_b = -1;
|
| - for (size_t i = 0; i < kClassCount; ++i) {
|
| - if (strcasecmp(kFontEquivClasses[i].name, font_b) == 0) {
|
| - class_b = kFontEquivClasses[i].id;
|
| - break;
|
| - }
|
| - }
|
|
|
| - return class_a == class_b;
|
| +// Return true if |font_a| and |font_b| are visually and at the metrics
|
| +// level interchangeable.
|
| +bool IsMetricCompatibleReplacement(const char* font_a, const char* font_b)
|
| +{
|
| + FontEquivClass class_a = GetFontEquivClass(font_a);
|
| + FontEquivClass class_b = GetFontEquivClass(font_b);
|
| +
|
| + return class_a != OTHER && class_a == class_b;
|
| +}
|
| +
|
| +} // anonymous namespace
|
| +
|
| +FontConfigDirect::FontConfigDirect()
|
| + : next_file_id_(0) {
|
| + FcInit();
|
| }
|
|
|
| // -----------------------------------------------------------------------------
|
|
|