summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-14 05:14:07 +0000
committeragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-14 05:14:07 +0000
commit565243e032009b7022b49c085b1157c3fb4986d4 (patch)
tree905ee4504d259801a879e1873edb91c300a6392a
parentd41c2bd79c85c07d0f1303a3d9d88ae7279181fa (diff)
downloadchromium_src-565243e032009b7022b49c085b1157c3fb4986d4.zip
chromium_src-565243e032009b7022b49c085b1157c3fb4986d4.tar.gz
chromium_src-565243e032009b7022b49c085b1157c3fb4986d4.tar.bz2
Linux: workaround a fontconfig bug.
Fontconfig cannot filter out non-scalable fonts on Hardy. http://codereview.chromium.org/149482 BUG=16411 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20604 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--skia/ext/SkFontHost_fontconfig_direct.cpp39
-rw-r--r--webkit/api/src/gtk/WebFontInfo.cpp21
2 files changed, 48 insertions, 12 deletions
diff --git a/skia/ext/SkFontHost_fontconfig_direct.cpp b/skia/ext/SkFontHost_fontconfig_direct.cpp
index 9fd1252..7f7be08 100644
--- a/skia/ext/SkFontHost_fontconfig_direct.cpp
+++ b/skia/ext/SkFontHost_fontconfig_direct.cpp
@@ -115,12 +115,35 @@ bool FontConfigDirect::Match(std::string* result_family,
FcPatternGetString(pattern, FC_FAMILY, 0, &post_config_family);
FcResult result;
- FcPattern* match = FcFontMatch(0, pattern, &result);
- if (!match) {
+ FcFontSet* font_set = FcFontSort(0, pattern, 0, 0, &result);
+ if (!font_set) {
FcPatternDestroy(pattern);
return false;
}
+ // Older versions of fontconfig have a bug where they cannot select
+ // only scalable fonts so we have to manually filter the results.
+ FcPattern* match = NULL;
+ for (int i = 0; i < font_set->nfont; ++i) {
+ FcPattern* current = font_set->fonts[i];
+ FcBool is_scalable;
+
+ if (FcPatternGetBool(current, FC_SCALABLE, 0,
+ &is_scalable) != FcResultMatch ||
+ !is_scalable) {
+ continue;
+ }
+
+ match = current;
+ break;
+ }
+
+ if (!match) {
+ FcPatternDestroy(pattern);
+ FcFontSetDestroy(font_set);
+ return false;
+ }
+
FcChar8* post_match_family;
FcPatternGetString(match, FC_FAMILY, 0, &post_match_family);
const bool family_names_match =
@@ -131,14 +154,14 @@ bool FontConfigDirect::Match(std::string* result_family,
FcPatternDestroy(pattern);
if (!family_names_match && !IsFallbackFontAllowed(family)) {
- FcPatternDestroy(match);
+ FcFontSetDestroy(font_set);
return false;
}
FcChar8* c_filename;
if (FcPatternGetString(match, FC_FILE, 0, &c_filename) != FcResultMatch) {
- FcPatternDestroy(match);
- return NULL;
+ FcFontSetDestroy(font_set);
+ return false;
}
const std::string filename((char *) c_filename);
@@ -162,8 +185,8 @@ bool FontConfigDirect::Match(std::string* result_family,
FcChar8* c_family;
if (FcPatternGetString(match, FC_FAMILY, 0, &c_family)) {
- FcPatternDestroy(match);
- return NULL;
+ FcFontSetDestroy(font_set);
+ return false;
}
int resulting_bold;
@@ -195,7 +218,7 @@ bool FontConfigDirect::Match(std::string* result_family,
if (result_family)
*result_family = (char *) c_family;
- FcPatternDestroy(match);
+ FcFontSetDestroy(font_set);
return true;
}
diff --git a/webkit/api/src/gtk/WebFontInfo.cpp b/webkit/api/src/gtk/WebFontInfo.cpp
index 264efff..60fdde4 100644
--- a/webkit/api/src/gtk/WebFontInfo.cpp
+++ b/webkit/api/src/gtk/WebFontInfo.cpp
@@ -66,21 +66,34 @@ WebString WebFontInfo::familyForChars(const WebUChar* characters, size_t numChar
FcDefaultSubstitute(pattern);
FcResult result;
- FcPattern* match = FcFontMatch(0, pattern, &result);
+ FcFontSet* fontSet = FcFontSort(0, pattern, 0, 0, &result);
FcPatternDestroy(pattern);
FcCharSetDestroy(cset);
- if (match) {
+ if (!fontSet)
+ return WebString();
+
+ // Older versions of fontconfig have a bug where they cannot select
+ // only scalable fonts so we have to manually filter the results.
+ for (int i = 0; i < fontSet->nfont; ++i) {
+ FcPattern* current = fontSet->fonts[i];
+ FcBool isScalable;
+
+ if (FcPatternGetBool(current, FC_SCALABLE, 0, &isScalable) != FcResultMatch
+ || !isScalable)
+ continue;
+
FcChar8* family;
WebString result;
- if (FcPatternGetString(match, FC_FAMILY, 0, &family) == FcResultMatch) {
+ if (FcPatternGetString(current, FC_FAMILY, 0, &family) == FcResultMatch) {
const char* charFamily = reinterpret_cast<char*>(family);
result = WebString::fromUTF8(charFamily, strlen(charFamily));
}
- FcPatternDestroy(match);
+ FcFontSetDestroy(fontSet);
return result;
}
+ FcFontSetDestroy(fontSet);
return WebString();
}