summaryrefslogtreecommitdiffstats
path: root/app/gfx/font_gtk.cc
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-15 07:37:29 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-15 07:37:29 +0000
commit82522511b7921e8c61742ebd80a4c674c56e7e48 (patch)
tree381d71de2b9c7b99675e6f2b4523ae0876c72ce8 /app/gfx/font_gtk.cc
parent631cf822bd6e64cf469544b42c9975f5602c29a6 (diff)
downloadchromium_src-82522511b7921e8c61742ebd80a4c674c56e7e48.zip
chromium_src-82522511b7921e8c61742ebd80a4c674c56e7e48.tar.gz
chromium_src-82522511b7921e8c61742ebd80a4c674c56e7e48.tar.bz2
ChromeCanvas->gfx::Canvas
Rename files too. TBR=brettw http://crbug.com/11387 Review URL: http://codereview.chromium.org/113443 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16148 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'app/gfx/font_gtk.cc')
-rw-r--r--app/gfx/font_gtk.cc89
1 files changed, 89 insertions, 0 deletions
diff --git a/app/gfx/font_gtk.cc b/app/gfx/font_gtk.cc
new file mode 100644
index 0000000..3b78d02
--- /dev/null
+++ b/app/gfx/font_gtk.cc
@@ -0,0 +1,89 @@
+// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "app/gfx/font.h"
+
+#include <fontconfig/fontconfig.h>
+#include <gtk/gtk.h>
+
+#include "base/string_util.h"
+
+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.
+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;
+}
+
+// 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);
+
+ // 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';
+
+ PangoFontDescription* desc =
+ pango_font_description_from_string(font_ptr);
+ 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.
+ // TODO(agl): remove this.
+ std::wstring font_family = FindBestMatchFontFamilyName(family_name);
+
+ default_font_ = new Font(CreateFont(font_family, size / PANGO_SCALE));
+
+ pango_font_description_free(desc);
+ g_free(font_name);
+ g_value_unset(&value);
+
+ DCHECK(default_font_);
+ }
+
+ CopyFont(*default_font_);
+}
+
+} // namespace gfx