From d3f1ab78138a1f9256ec02842799ed6cd1e3ec1e Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Thu, 1 Feb 2018 18:52:16 -0500 Subject: [PATCH] xtext: Always use Pango to get correct glyph width on Unix This should be slower but pango seems to be reasonably fast on Unix though extremely slow on Windows. https://bugzilla.redhat.com/show_bug.cgi?id=1536298 --- src/fe-gtk/xtext.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/fe-gtk/xtext.c b/src/fe-gtk/xtext.c index fef00c51..203bcd60 100644 --- a/src/fe-gtk/xtext.c +++ b/src/fe-gtk/xtext.c @@ -157,7 +157,10 @@ static char * gtk_xtext_get_word (GtkXText * xtext, int x, int y, textentry ** r #define EMPH_BOLD 2 #define EMPH_HIDDEN 4 static PangoAttrList *attr_lists[4]; +#ifdef G_OS_WIN32 +/* the fontwidths variable is used on Windows only. */ static int fontwidths[4][128]; +#endif static PangoAttribute * xtext_pango_attr (PangoAttribute *attr) @@ -170,7 +173,10 @@ xtext_pango_attr (PangoAttribute *attr) static void xtext_pango_init (GtkXText *xtext) { - int i, j; + int i; +#ifdef G_OS_WIN32 + int j; +#endif char buf[2] = "\000"; if (attr_lists[0]) @@ -202,6 +208,7 @@ xtext_pango_init (GtkXText *xtext) break; } +#ifdef G_OS_WIN32 /* Now initialize fontwidths[i] */ pango_layout_set_attributes (xtext->layout, attr_lists[i]); for (j = 0; j < 128; j++) @@ -210,8 +217,14 @@ xtext_pango_init (GtkXText *xtext) pango_layout_set_text (xtext->layout, buf, 1); pango_layout_get_pixel_size (xtext->layout, &fontwidths[i][j], NULL); } +#endif } - xtext->space_width = fontwidths[0][' ']; + + /* re-compute space_width without using fontwidths */ + pango_layout_set_attributes (xtext->layout, attr_lists[0]); + buf[0] = ' '; + pango_layout_set_text (xtext->layout, buf, 1); + pango_layout_get_pixel_size (xtext->layout, &(xtext->space_width), NULL); } static void @@ -289,8 +302,10 @@ static int backend_get_text_width_emph (GtkXText *xtext, guchar *str, int len, int emphasis) { int width; +#ifdef G_OS_WIN32 int deltaw; int mbl; +#endif if (*str == 0) return 0; @@ -301,6 +316,8 @@ backend_get_text_width_emph (GtkXText *xtext, guchar *str, int len, int emphasis width = 0; pango_layout_set_attributes (xtext->layout, attr_lists[emphasis]); + +#ifdef G_OS_WIN32 while (len > 0) { mbl = charlen(str); @@ -315,6 +332,12 @@ backend_get_text_width_emph (GtkXText *xtext, guchar *str, int len, int emphasis str += mbl; len -= mbl; } +#else + /* This code is slow on Windows, + but it will get the correct width from pango on Linux. */ + pango_layout_set_text (xtext->layout, str, len); + pango_layout_get_pixel_size (xtext->layout, &width, NULL); +#endif return width; }