| Index: skia/ext/SkFontHost_fontconfig_direct.cpp
|
| ===================================================================
|
| --- skia/ext/SkFontHost_fontconfig_direct.cpp (revision 68262)
|
| +++ skia/ext/SkFontHost_fontconfig_direct.cpp (working copy)
|
| @@ -26,7 +26,7 @@
|
|
|
| namespace {
|
|
|
| -// Equivalence classes, used to match the Liberation and Ascender fonts
|
| +// Equivalence classes, used to match the Liberation and other fonts
|
| // with their metric-compatible replacements. See the discussion in
|
| // GetFontEquivClass().
|
| enum FontEquivClass
|
| @@ -34,7 +34,13 @@
|
| OTHER,
|
| SANS,
|
| SERIF,
|
| - MONO
|
| + MONO,
|
| + PMINCHO,
|
| + MINCHO,
|
| + PGOTHIC,
|
| + GOTHIC,
|
| + SIMSUN,
|
| + NSIMSUN,
|
| };
|
|
|
| // Match the font name against a whilelist of fonts, returning the equivalence
|
| @@ -51,28 +57,73 @@
|
| // /etc/fonts/conf.d/30-metric-aliases.conf
|
| // from my Ubuntu system, but we're better off being very conservative.
|
|
|
| - // "Ascender Sans", "Ascender Serif" and "Ascender Sans Mono" are the
|
| - // tentative names of another set of fonts metric-compatible with
|
| + // Arimo, Tinos and Cousine are a set of fonts metric-compatible with
|
| // Arial, Times New Roman and Courier New with a character repertoire
|
| - // much larger than Liberation. Note that Ascender Sans Mono
|
| - // is metrically compatible with Courier New, but the former
|
| - // is sans-serif while ther latter is serif.
|
| - // Arimo, Tinos and Cousine are the names of new fonts derived from and
|
| - // expanded upon Ascender Sans, Ascender Serif and Ascender Sans Mono.
|
| - if (strcasecmp(fontname, "Arial") == 0 ||
|
| - strcasecmp(fontname, "Liberation Sans") == 0 ||
|
| - strcasecmp(fontname, "Arimo") == 0 ||
|
| - strcasecmp(fontname, "Ascender Sans") == 0) {
|
| - return SANS;
|
| - } else if (strcasecmp(fontname, "Times New Roman") == 0 ||
|
| - strcasecmp(fontname, "Liberation Serif") == 0 ||
|
| - strcasecmp(fontname, "Tinos") == 0 ||
|
| - strcasecmp(fontname, "Ascender Serif") == 0) {
|
| - return SERIF;
|
| - } else if (strcasecmp(fontname, "Courier New") == 0 ||
|
| - strcasecmp(fontname, "Cousine") == 0 ||
|
| - strcasecmp(fontname, "Ascender Sans Mono") == 0) {
|
| - return MONO;
|
| + // much larger than Liberation. Note that Cousine is metrically
|
| + // compatible with Courier New, but the former is sans-serif while
|
| + // the latter is serif.
|
| +
|
| +
|
| + struct FontEquivMap {
|
| + FontEquivClass clazz;
|
| + const char name[40];
|
| + };
|
| +
|
| + static const FontEquivMap kFontEquivMap[] = {
|
| + { SANS, "Arial" },
|
| + { SANS, "Arimo" },
|
| + { SANS, "Liberation Sans" },
|
| +
|
| + { SERIF, "Times New Roman" },
|
| + { SERIF, "Tinos" },
|
| + { SERIF, "Liberation Serif" },
|
| +
|
| + { MONO, "Courier New" },
|
| + { MONO, "Cousine" },
|
| + { MONO, "Liberation Mono" },
|
| +
|
| + // MS Pゴシック
|
| + { PGOTHIC, "MS PGothic" },
|
| + { PGOTHIC, "\xef\xbc\xad\xef\xbc\xb3 \xef\xbc\xb0"
|
| + "\xe3\x82\xb4\xe3\x82\xb7\xe3\x83\x83\xe3\x82\xaf" },
|
| + { PGOTHIC, "IPAPGothic" },
|
| +
|
| + // 宋体
|
| + { SIMSUN, "Simsun" },
|
| + { SIMSUN, "\xe5\xae\x8b\xe4\xbd\x93" },
|
| + { SIMSUN, "Song ASC" },
|
| +
|
| + // MS P明朝
|
| + { PMINCHO, "MS PMincho" },
|
| + { PMINCHO, "\xef\xbc\xad\xef\xbc\xb3 \xef\xbc\xb0"
|
| + "\xe6\x98\x8e\xe6\x9c\x9d"},
|
| + { PMINCHO, "IPAPMincho" },
|
| +
|
| + // MS ゴシック
|
| + { GOTHIC, "MS Gothic" },
|
| + { GOTHIC, "\xef\xbc\xad\xef\xbc\xb3 "
|
| + "\xe3\x82\xb4\xe3\x82\xb7\xe3\x83\x83\xe3\x82\xaf" },
|
| + { GOTHIC, "IPAGothic" },
|
| +
|
| + // MS 明朝
|
| + { MINCHO, "MS Mincho" },
|
| + { MINCHO, "\xef\xbc\xad\xef\xbc\xb3 \xe6\x98\x8e\xe6\x9c\x9d" },
|
| + { MINCHO, "IPAMincho" },
|
| +
|
| + // 新宋体
|
| + { NSIMSUN, "NSimsun" },
|
| + { NSIMSUN, "\xe6\x96\xb0\xe5\xae\x8b\xe4\xbd\x93" },
|
| + { NSIMSUN, "N Song ASC" },
|
| + };
|
| +
|
| + static const size_t kFontCount =
|
| + sizeof(kFontEquivMap)/sizeof(kFontEquivMap[0]);
|
| +
|
| + // TODO(jungshik): If this loop turns out to be hot, turn
|
| + // the array to a static (hash)map to speed it up.
|
| + for (size_t i = 0; i < kFontCount; ++i) {
|
| + if (strcasecmp(kFontEquivMap[i].name, fontname) == 0)
|
| + return kFontEquivMap[i].clazz;
|
| }
|
| return OTHER;
|
| }
|
|
|