summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeng Wu <pwu@redhat.com>2018-02-01 18:52:16 -0500
committerPatrick Griffis <tingping@tingping.se>2018-02-06 17:06:50 -0500
commitd3f1ab78138a1f9256ec02842799ed6cd1e3ec1e (patch)
tree9cc23f0377eb1987901242027ea5c672c734f718
parent4cdf6460b666a187c791c26c2f693f1f5adde3ee (diff)
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
-rw-r--r--src/fe-gtk/xtext.c27
1 files 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;
}