diff options
author | Behdad Esfahbod <behdad@gnome.org> | 2006-05-22 04:04:51 +0000 |
---|---|---|
committer | Behdad Esfahbod <behdad@src.gnome.org> | 2006-05-22 04:04:51 +0000 |
commit | f3b986724c3174fd48e14376b908d7b302a86095 (patch) | |
tree | 885706920edf8bbdbc4db2e454c0c00aeb3b3cf9 /gdk/gdkscreen.c | |
parent | 3023c03a360c1b3f92800dae2d66dbfae0fa277a (diff) | |
download | gtk+-f3b986724c3174fd48e14376b908d7b302a86095.tar.gz |
Add new function _gdk_screen_get_font_map() and have one fontmap per
2006-05-21 Behdad Esfahbod <behdad@gnome.org>
* gdk/gdkinternals.h:
* gdk/gdkscreen.c (gdk_screen_class_init), (gdk_screen_finalize),
(update_fontmap_resolution), (gdk_screen_set_resolution): Add new
function _gdk_screen_get_font_map() and have one fontmap per screen,
with the correct resolution set on it.
* gdk/gdkpango.c (gdk_pango_context_get_for_screen): Use
_gdk_screen_get_font_map() instead of setting resolution on the
PangoCairoContext. (#342529)
Diffstat (limited to 'gdk/gdkscreen.c')
-rw-r--r-- | gdk/gdkscreen.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/gdk/gdkscreen.c b/gdk/gdkscreen.c index 986f9f5525..000ca5e85b 100644 --- a/gdk/gdkscreen.c +++ b/gdk/gdkscreen.c @@ -25,10 +25,23 @@ #include "gdk.h" /* For gdk_rectangle_intersect() */ #include "gdkcolor.h" #include "gdkwindow.h" +#include "gdkinternals.h" #include "gdkscreen.h" #include "gdkintl.h" #include "gdkalias.h" + +#define GDK_SCREEN_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDK_TYPE_SCREEN, GdkScreenPrivate)) + +typedef struct _GdkScreenPrivate GdkScreenPrivate; + +struct _GdkScreenPrivate +{ + PangoFontMap *fontmap; +}; + + static void gdk_screen_dispose (GObject *object); static void gdk_screen_finalize (GObject *object); static void gdk_screen_set_property (GObject *object, @@ -124,6 +137,8 @@ gdk_screen_class_init (GdkScreenClass *klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + g_type_class_add_private (klass, sizeof (GdkScreenPrivate)); } static void @@ -160,10 +175,14 @@ static void gdk_screen_finalize (GObject *object) { GdkScreen *screen = GDK_SCREEN (object); + GdkScreenPrivate *priv = GDK_SCREEN_GET_PRIVATE (screen); if (screen->font_options) cairo_font_options_destroy (screen->font_options); + if (priv->fontmap) + g_object_unref (priv->fontmap); + G_OBJECT_CLASS (gdk_screen_parent_class)->finalize (object); } @@ -369,6 +388,48 @@ gdk_screen_height_mm (void) return gdk_screen_get_height_mm (gdk_screen_get_default ()); } +static void +update_fontmap_resolution (GdkScreen *screen) +{ + GdkScreenPrivate *priv = GDK_SCREEN_GET_PRIVATE (screen); + double dpi = screen->resolution; + + if (dpi < 0) + dpi = 96.; + + if (priv->fontmap) + pango_cairo_font_map_set_resolution (priv->fontmap, dpi); +} + +/** + * _gdk_screen_get_font_map: + * @screen: a #GdkScreen + * + * Gets the Pango fontmap for this screen that is used to create + * #PangoContext, with the right resolution set on it. + * + * Return value: the fontmap. + * + * Since: 2.10 + **/ +PangoFontMap * +_gdk_screen_get_font_map (GdkScreen *screen) +{ + GdkScreenPrivate *priv; + + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + priv = GDK_SCREEN_GET_PRIVATE (screen); + + if (G_UNLIKELY (!priv->fontmap)) + { + priv->fontmap = pango_cairo_font_map_new (); + update_fontmap_resolution (screen); + } + + return priv->fontmap; +} + /** * gdk_screen_set_font_options: * @screen: a #GdkScreen @@ -448,6 +509,8 @@ gdk_screen_set_resolution (GdkScreen *screen, { screen->resolution = dpi; + update_fontmap_resolution (screen); + g_object_notify (G_OBJECT (screen), "resolution"); } } |