]> Pileus Git - ~andy/gtk/commitdiff
Add new function _gdk_screen_get_font_map() and have one fontmap per
authorBehdad Esfahbod <behdad@gnome.org>
Mon, 22 May 2006 04:04:51 +0000 (04:04 +0000)
committerBehdad Esfahbod <behdad@src.gnome.org>
Mon, 22 May 2006 04:04:51 +0000 (04:04 +0000)
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)

ChangeLog
ChangeLog.pre-2-10
gdk/gdkinternals.h
gdk/gdkpango.c
gdk/gdkscreen.c

index 80181134a78885b9bbdf60d72a18b62293db92e1..097c66ee42eb0b1dc92e06bef82e0ea33bd81249 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index 80181134a78885b9bbdf60d72a18b62293db92e1..097c66ee42eb0b1dc92e06bef82e0ea33bd81249 100644 (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
index 1c279f4ec3606c77122dac3be8dc654e7b2c1806..20c7d1d2feab3e8f171770ec7bd9658aec169bca 100644 (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 *
  ************************************/
index 9375a80545ab365b708bb7b7d10b8f296269f6d3..984881aeeade995528788a785f298f583b4ef18b 100644 (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;
 }
 
index 986f9f5525dbc1538a6e285a0afca95ac7d3b7e7..000ca5e85bb3bea69b45447575197c03b79a65d7 100644 (file)
 #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");
       }
 }