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)
This commit is contained in:
Behdad Esfahbod 2006-05-22 04:04:51 +00:00 committed by Behdad Esfahbod
parent 3023c03a36
commit f3b986724c
5 changed files with 93 additions and 5 deletions

View File

@ -1,3 +1,15 @@
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)
2006-05-22 Tor Lillqvist <tml@novell.com>
* gtk/gtkfilesystemwin32.c: Make it compile again. Doesn't work

View File

@ -1,3 +1,15 @@
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)
2006-05-22 Tor Lillqvist <tml@novell.com>
* gtk/gtkfilesystemwin32.c: Make it compile again. Doesn't work

View File

@ -29,6 +29,7 @@
#include <gdk/gdktypes.h>
#include <gdk/gdkwindow.h>
#include <gdk/gdkprivate.h>
#include <pango/pango.h>
#ifndef __GDK_INTERNALS_H__
#define __GDK_INTERNALS_H__
@ -404,6 +405,10 @@ void _gdk_windowing_gc_get_foreground (GdkGC *gc,
void _gdk_windowing_gc_get_background (GdkGC *gc,
GdkColor *color);
/* Gets the fontmap for screen */
PangoFontMap *
_gdk_screen_get_font_map (GdkScreen *screen);
/************************************
* Initialization and exit routines *
************************************/

View File

@ -1416,20 +1416,16 @@ gdk_pango_context_get_for_screen (GdkScreen *screen)
PangoFontMap *fontmap;
PangoContext *context;
const cairo_font_options_t *options;
double dpi;
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
fontmap = pango_cairo_font_map_get_default ();
fontmap = _gdk_screen_get_font_map (screen);
context = pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fontmap));
options = gdk_screen_get_font_options (screen);
pango_cairo_context_set_font_options (context, options);
dpi = gdk_screen_get_resolution (screen);
pango_cairo_context_set_resolution (context, dpi);
return context;
}

View File

@ -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");
}
}