From 7e510e2844732d53563abd45ec60df7de2129246 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 1 Sep 2012 16:54:27 +0300 Subject: [PATCH] Further fix for bug #11860 with Arabic display on Windows. src/w32uniscribe.c (uniscribe_shape): Handle correctly the case of more than one grapheme cluster passed to the shaper: compute the offset adjustment values separately for each cluster. --- src/ChangeLog | 4 ++++ src/w32uniscribe.c | 42 ++++++++++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 5b58d77e54a..e186b8af87f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,9 @@ 2012-09-01 Eli Zaretskii + * w32uniscribe.c (uniscribe_shape): Handle correctly the case of + more than one grapheme cluster passed to the shaper: compute the + offset adjustment values separately for each cluster. (Bug#11860) + * image.c: Restore mistakenly removed inclusion of w32.h. Without it, GCC doesn't see prototypes of w32_delayed_load, and complains about implicit conversions from integer to pointer. diff --git a/src/w32uniscribe.c b/src/w32uniscribe.c index 50532acaff3..bc45e2c648c 100644 --- a/src/w32uniscribe.c +++ b/src/w32uniscribe.c @@ -322,22 +322,6 @@ uniscribe_shape (Lisp_Object lgstring) { int j, from, to, adj_offset = 0; - /* For RTL text, the Uniscribe shaper prepares the - values in ADVANCES array for layout in reverse order, - whereby "advance width" is applied to move the pen in - reverse direction and _before_ drawing the glyph. - Since we draw glyphs in their normal left-to-right - order, we need to adjust the coordinates of each - non-base glyph in a grapheme cluster via X-OFF - component of the gstring's ADJUSTMENT sub-vector. - This loop computes the initial value of the - adjustment for the base character, which is then - updated for each successive glyph in the grapheme - cluster. */ - if (items[i].a.fRTL) - for (j = 1; j < nglyphs; j++) - adj_offset += advances[j]; - from = 0; to = from; @@ -380,6 +364,32 @@ uniscribe_shape (Lisp_Object lgstring) } } } + + /* For RTL text, the Uniscribe shaper prepares + the values in ADVANCES array for layout in + reverse order, whereby "advance width" is + applied to move the pen in reverse direction + and _before_ drawing the glyph. Since we + draw glyphs in their normal left-to-right + order, we need to adjust the coordinates of + each non-base glyph in a grapheme cluster via + X-OFF component of the gstring's ADJUSTMENT + sub-vector. This loop computes, for each + grapheme cluster, the initial value of the + adjustment for the base character, which is + then updated for each successive glyph in the + grapheme cluster. */ + if (items[i].a.fRTL) + { + int j1 = j; + + adj_offset = 0; + while (j1 < nglyphs && !attributes[j1].fClusterStart) + { + adj_offset += advances[j1]; + j1++; + } + } } LGLYPH_SET_CHAR (lglyph, chars[items[i].iCharPos -- 2.39.2