Index: app/gfx/font_gtk.cc |
diff --git a/app/gfx/font_gtk.cc b/app/gfx/font_gtk.cc |
index 3b78d0201671a566b1229de4611b2f291bd31c3d..6c5f3675cc54db3ed3251fdf6b153f6629fc7746 100644 |
--- a/app/gfx/font_gtk.cc |
+++ b/app/gfx/font_gtk.cc |
@@ -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_); |
} |