pango r2747 - in trunk: . docs/tmpl pango



Author: behdad
Date: Sat Dec  6 01:44:03 2008
New Revision: 2747
URL: http://svn.gnome.org/viewvc/pango?rev=2747&view=rev

Log:
2008-12-05  Behdad Esfahbod  <behdad gnome org>

        Bug 563356 â The input area of firefox and the blank width after text
        in gnome-menu was stretched too wide, under pango-1.22.3

        * docs/tmpl/fonts.sgml:
        * pango/pango-impl-utils.h:
        * pango/pangocairo-atsuifont.c
        (pango_cairo_atsui_font_create_metrics_for_context):
        * pango/pangocairo-win32font.c
        (pango_cairo_win32_font_create_metrics_for_context):
        * pango/pangofc-font.c (pango_fc_font_create_metrics_for_context):
        For approximate_char_width calculation take each char's width into
        account.  That is, do a weighted average instead of uniform average.
        g_unichar_iszerowidth() chars count as 0, g_unichar_iswide() chars
        count 2, and the rest count as 1.  Pretty much wcwidth() behavior.
        See bug report for rationale.

Modified:
   trunk/ChangeLog
   trunk/docs/tmpl/fonts.sgml
   trunk/pango/pango-impl-utils.h
   trunk/pango/pangocairo-atsuifont.c
   trunk/pango/pangocairo-win32font.c
   trunk/pango/pangofc-font.c

Modified: trunk/docs/tmpl/fonts.sgml
==============================================================================
--- trunk/docs/tmpl/fonts.sgml	(original)
+++ trunk/docs/tmpl/fonts.sgml	Sat Dec  6 01:44:03 2008
@@ -441,7 +441,10 @@
 @descent: the distance from the baseline to the lowest point of the glyphs of
 	 the font. This is positive in practically all fonts.
 @approximate_char_width: approximate average width of the regular glyphs of
-         the font.
+         the font.  Note that for this calculation, East Asian characters
+	 (those passing g_unichar_iswide()) are counted as double-width.
+	 This produces a more uniform value for this measure across languages
+	 and results in more uniform and more expected UI sizes.
 @approximate_digit_width: approximate average width of the glyphs for digits
          of the font.
 @underline_position: position of the underline. This is normally negative.

Modified: trunk/pango/pango-impl-utils.h
==============================================================================
--- trunk/pango/pango-impl-utils.h	(original)
+++ trunk/pango/pango-impl-utils.h	Sat Dec  6 01:44:03 2008
@@ -23,6 +23,7 @@
 #ifndef __PANGO_IMPL_UTILS_H__
 #define __PANGO_IMPL_UTILS_H__
 
+#include <glib.h>
 #include <glib-object.h>
 #include <pango/pango.h>
 
@@ -92,6 +93,36 @@
 			       PangoRectangle   *ink_rect,
 			       PangoRectangle   *logical_rect);
 
+
+/* We define these functions static here because we don't want to add public API
+ * for them (if anything, it belongs to glib, but glib found it trivial enough
+ * not to add API for).  At some point metrics calculations will be
+ * centralized and this mess can be minimized.  Or so I hope.
+ */
+
+static inline G_GNUC_UNUSED int
+pango_unichar_width (gunichar c)
+{
+  return G_UNLIKELY (g_unichar_iszerowidth (c)) ? 0 :
+	   G_UNLIKELY (g_unichar_iswide (c)) ? 2 : 1;
+}
+
+static G_GNUC_UNUSED glong
+pango_utf8_strwidth (const gchar *p)
+{
+  glong len = 0;
+  g_return_val_if_fail (p != NULL, 0);
+
+  while (*p)
+    {
+      len += pango_unichar_width (g_utf8_get_char (p));
+      p = g_utf8_next_char (p);
+    }
+
+  return len;
+}
+
+
 G_END_DECLS
 
 #endif /* __PANGO_IMPL_UTILS_H__ */

Modified: trunk/pango/pangocairo-atsuifont.c
==============================================================================
--- trunk/pango/pangocairo-atsuifont.c	(original)
+++ trunk/pango/pangocairo-atsuifont.c	Sat Dec  6 01:44:03 2008
@@ -24,6 +24,7 @@
 
 #import <Cocoa/Cocoa.h>
 
+#include "pango-impl-utils.h"
 #include "pangoatsui-private.h"
 #include "pangocairo.h"
 #include "pangocairo-private.h"
@@ -148,7 +149,7 @@
   pango_layout_set_text (layout, sample_str, -1);
   pango_layout_get_extents (layout, NULL, &extents);
 
-  metrics->approximate_char_width = extents.width / g_utf8_strlen (sample_str, -1);
+  metrics->approximate_char_width = extents.width / pango_utf8_strwidth (sample_str);
 
   pango_layout_set_text (layout, "0123456789", -1);
   metrics->approximate_digit_width = max_glyph_width (layout);

Modified: trunk/pango/pangocairo-win32font.c
==============================================================================
--- trunk/pango/pangocairo-win32font.c	(original)
+++ trunk/pango/pangocairo-win32font.c	Sat Dec  6 01:44:03 2008
@@ -150,7 +150,7 @@
   pango_layout_set_text (layout, sample_str, -1);
   pango_layout_get_extents (layout, NULL, &extents);
 
-  metrics->approximate_char_width = extents.width / g_utf8_strlen (sample_str, -1);
+  metrics->approximate_char_width = extents.width / pango_utf8_strwidth (sample_str);
 
   pango_layout_set_text (layout, "0123456789", -1);
   metrics->approximate_digit_width = max_glyph_width (layout);

Modified: trunk/pango/pangofc-font.c
==============================================================================
--- trunk/pango/pangofc-font.c	(original)
+++ trunk/pango/pangofc-font.c	Sat Dec  6 01:44:03 2008
@@ -496,7 +496,7 @@
   pango_layout_get_extents (layout, NULL, &extents);
 
   metrics->approximate_char_width =
-    extents.width / g_utf8_strlen (sample_str, -1);
+    extents.width / pango_utf8_strwidth (sample_str);
 
   pango_layout_set_text (layout, "0123456789", -1);
   metrics->approximate_digit_width = max_glyph_width (layout);



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