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