Commit dd888ede authored by evan@chromium.org's avatar evan@chromium.org

linux: simplify gfx::Font constructor logic and add CHECK()s.

Trying to track down a bug that a user is seeing.
The getter we were using to extract the value before was for
a debugger-compatible string.  Perhaps it was the quote-removal
code that was getting us before; if not, these CHECKs will track
it down.

BUG=12530

Review URL: http://codereview.chromium.org/115877

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17118 0039d316-1c4b-4281-b951-d872f2087c98
parent 5429cb56
......@@ -14,63 +14,59 @@ namespace gfx {
Font* Font::default_font_ = NULL;
// Find the best match font for |family_name| in the same way as Skia
// to make sure CreateFont() successfully creates default font.
// In Skia, it only checks the best match font. If it failed to find,
// SkTypeface will be NULL for that font family. It eventually causes segfault.
// For example, family_name = "Sans" and system may have various fonts.
// The first font family in FcPattern will be "DejaVu Sans" but a font family
// returned by FcFontMatch will be "VL PGothic".
// In this case, SkTypeface for "Sans" returns NULL even if system has font
// for "Sans" font family.
// See FontMatch() in skia/ports/SkFontHost_fontconfig.cpp for more detail.
// to make sure CreateFont() successfully creates a default font. In
// Skia, it only checks the best match font. If it failed to find
// one, SkTypeface will be NULL for that font family. It eventually
// causes a segfault. For example, family_name = "Sans" and system
// may have various fonts. The first font family in FcPattern will be
// "DejaVu Sans" but a font family returned by FcFontMatch will be "VL
// PGothic". In this case, SkTypeface for "Sans" returns NULL even if
// the system has a font for "Sans" font family. See FontMatch() in
// skia/ports/SkFontHost_fontconfig.cpp for more detail.
static std::wstring FindBestMatchFontFamilyName(const char* family_name) {
FcPattern* pattern = FcPatternCreate();
FcValue fcvalue;
fcvalue.type = FcTypeString;
char* family_name_copy = strdup(family_name);
fcvalue.u.s = reinterpret_cast<FcChar8*>(family_name_copy);
FcPatternAdd(pattern, FC_FAMILY, fcvalue, 0);
FcConfigSubstitute(0, pattern, FcMatchPattern);
FcDefaultSubstitute(pattern);
FcResult result;
FcPattern* match = FcFontMatch(0, pattern, &result);
DCHECK(match) << "Could not find font: " << family_name;
FcChar8* match_family;
FcPatternGetString(match, FC_FAMILY, 0, &match_family);
std::wstring font_family = UTF8ToWide(
reinterpret_cast<char*>(match_family));
FcPatternDestroy(match);
FcPatternDestroy(pattern);
free(family_name_copy);
return font_family;
FcPattern* pattern = FcPatternCreate();
FcValue fcvalue;
fcvalue.type = FcTypeString;
char* family_name_copy = strdup(family_name);
fcvalue.u.s = reinterpret_cast<FcChar8*>(family_name_copy);
FcPatternAdd(pattern, FC_FAMILY, fcvalue, 0);
FcConfigSubstitute(0, pattern, FcMatchPattern);
FcDefaultSubstitute(pattern);
FcResult result;
FcPattern* match = FcFontMatch(0, pattern, &result);
DCHECK(match) << "Could not find font: " << family_name;
FcChar8* match_family;
FcPatternGetString(match, FC_FAMILY, 0, &match_family);
std::wstring font_family = UTF8ToWide(
reinterpret_cast<char*>(match_family));
FcPatternDestroy(match);
FcPatternDestroy(pattern);
free(family_name_copy);
return font_family;
}
// Get the default gtk system font (name and size).
Font::Font() {
if (default_font_ == NULL) {
gtk_init(NULL, NULL);
GtkSettings* settings = gtk_settings_get_default();
GValue value = {0};
g_value_init(&value, G_TYPE_STRING);
g_object_get_property(G_OBJECT(settings), "gtk-font-name", &value);
gchar* font_name = NULL;
g_object_get(G_OBJECT(settings),
"gtk-font-name", &font_name,
NULL);
// gtk-font-name may be wrapped in quotes.
gchar* font_name = g_strdup_value_contents(&value);
gchar* font_ptr = font_name;
if (font_ptr[0] == '\"')
font_ptr++;
if (font_ptr[strlen(font_ptr) - 1] == '\"')
font_ptr[strlen(font_ptr) - 1] = '\0';
// Temporary CHECK for helping track down
// http://code.google.com/p/chromium/issues/detail?id=12530
CHECK(font_name) << " Unable to get gtk-font-name for default font.";
PangoFontDescription* desc =
pango_font_description_from_string(font_ptr);
pango_font_description_from_string(font_name);
gint size = pango_font_description_get_size(desc);
const char* family_name = pango_font_description_get_family(desc);
// Find best match font for |family_name| to make sure we can get
// SkTypeface for default font.
// a SkTypeface for the default font.
// TODO(agl): remove this.
std::wstring font_family = FindBestMatchFontFamilyName(family_name);
......@@ -78,7 +74,6 @@ Font::Font() {
pango_font_description_free(desc);
g_free(font_name);
g_value_unset(&value);
DCHECK(default_font_);
}
......
......@@ -85,7 +85,9 @@ Font Font::CreateFont(const std::wstring& font_family, int font_size) {
SkTypeface* tf = SkTypeface::CreateFromName(
base::SysWideToUTF8(font_family).c_str(), SkTypeface::kNormal);
DCHECK(tf) << "Could not find font: " << base::SysWideToUTF8(font_family);
// Temporary CHECK for tracking down
// http://code.google.com/p/chromium/issues/detail?id=12530
CHECK(tf) << "Could not find font: " << base::SysWideToUTF8(font_family);
SkAutoUnref tf_helper(tf);
return Font(tf, font_family, font_size, NORMAL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment