[goocanvas/new-api] 2010-07-08 Damon Chaplin <damon gnome org>



commit f57fb10f76668b918f1a410252239799990d5556
Author: Damon Chaplin <damon gnome org>
Date:   Thu Jul 8 16:35:20 2010 +0100

    2010-07-08  Damon Chaplin  <damon gnome org>
    
    	    * src/goocanvas.c (goo_canvas_check_font_size): new function to
    	    convert font sizes in points to the appropriate canvas units.
    
    	    * src/goocanvastext.c (goo_canvas_text_create_layout): use the above.
    
    	    * demo/units-demo.c (setup_canvas): test the above.

 ChangeLog           |    9 +++++++++
 demo/units-demo.c   |   10 ++++++++--
 src/goocanvas.c     |   35 +++++++++++++++++++++++++++++++++++
 src/goocanvas.h     |    3 +++
 src/goocanvastext.c |    6 +++++-
 5 files changed, 60 insertions(+), 3 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 058e32b..827e2b3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2010-07-08  Damon Chaplin  <damon gnome org>
+
+	* src/goocanvas.c (goo_canvas_check_font_size): new function to
+	convert font sizes in points to the appropriate canvas units.
+
+	* src/goocanvastext.c (goo_canvas_text_create_layout): use the above.
+
+	* demo/units-demo.c (setup_canvas): test the above.
+
 2010-07-07  Damon Chaplin  <damon gnome org>
 
 	* src/goocanvasitemsimple.c
diff --git a/demo/units-demo.c b/demo/units-demo.c
index 4a28e8b..6c96991 100644
--- a/demo/units-demo.c
+++ b/demo/units-demo.c
@@ -36,13 +36,13 @@ setup_canvas (GtkWidget *canvas,
 
     /* Points */
     { 100, 100, 200, 20, 10,
-      200, 310, 24,
+      200, 250, 24,
       310, 100, 20, 20
     },
 
     /* Inches */
     { 1, 1, 3, 0.5, 0.16,
-      3, 4, 0.3,
+      3, 3, 0.3,
       4.2, 1, 0.5, 0.5
     },
 
@@ -77,6 +77,12 @@ setup_canvas (GtkWidget *canvas,
 			      "font", font_desc,
 			      NULL);
 
+  sprintf (buffer, "This font is 12 points high");
+  item = goo_canvas_text_new (root, buffer, d[5], d[6] * 1.5, -1,
+			      GTK_ANCHOR_CENTER,
+			      "font", "Sans 12",
+			      NULL);
+
   item = goo_canvas_image_new (root, NULL, d[8], d[9],
 			       "pattern", flower_pattern,
 			       "width", d[10],
diff --git a/src/goocanvas.c b/src/goocanvas.c
index 2649d0d..bce521b 100644
--- a/src/goocanvas.c
+++ b/src/goocanvas.c
@@ -4063,3 +4063,38 @@ goo_canvas_update_items_using_style (GooCanvas      *canvas,
     goo_canvas_update_items_using_style_recurse (canvas->static_root_item,
 						 style, recompute_bounds);
 }
+
+
+/* If the canvas is using resolution-dependent units like points or mm then
+   we need to convert the font sizes from points to the units being used,
+   and set it as an absolute font size. */
+void
+goo_canvas_check_font_size (GooCanvas            *canvas,
+			    PangoFontDescription *font_desc)
+{
+  gdouble size;
+
+  if (canvas->units == GTK_UNIT_PIXEL
+      || pango_font_description_get_size_is_absolute (font_desc))
+    return;
+
+  /* Note that size will be scaled by PANGO_SCALE but it doesn't matter. */
+  size = pango_font_description_get_size (font_desc);
+
+  switch (canvas->units)
+    {
+    case GTK_UNIT_POINTS:
+      /* Do nothing. The size is in points already. Just make it absolute. */
+      break;
+    case GTK_UNIT_INCH:
+      size = size / 72.0;
+      break;
+    case GTK_UNIT_MM:
+      size = (size / 72.0) * 25.4;
+      break;
+    default:
+      break;
+    }
+
+  pango_font_description_set_absolute_size (font_desc, size);
+}
diff --git a/src/goocanvas.h b/src/goocanvas.h
index 7a9d48e..dac7ab0 100644
--- a/src/goocanvas.h
+++ b/src/goocanvas.h
@@ -263,6 +263,9 @@ void		goo_canvas_convert_bounds_to_item_space (GooCanvas           *canvas,
 							 GooCanvasItem       *item,
 							 GooCanvasBounds     *bounds);
 
+void            goo_canvas_check_font_size  (GooCanvas            *canvas,
+					     PangoFontDescription *font_desc);
+
 
 /*
  * Pointer/keyboard grabbing & ungrabbing.
diff --git a/src/goocanvastext.c b/src/goocanvastext.c
index ac3a1c6..bd2bdf8 100644
--- a/src/goocanvastext.c
+++ b/src/goocanvastext.c
@@ -287,7 +287,11 @@ goo_canvas_text_create_layout (GooCanvasText           *text,
     pango_layout_set_text (layout, string, -1);
 
   if (simple->style && simple->style->font_desc)
-    pango_layout_set_font_description (layout, simple->style->font_desc);
+    {
+      /* Convert sizes in points to the appropriate absolute size. */
+      goo_canvas_check_font_size (simple->canvas, simple->style->font_desc);
+      pango_layout_set_font_description (layout, simple->style->font_desc);
+    }
 
   font_options = cairo_font_options_create ();
   if (simple->style)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]