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.
This commit is contained in:
Eli Zaretskii 2012-09-01 16:54:27 +03:00
parent f18cbb28c2
commit 7e510e2844
2 changed files with 30 additions and 16 deletions

View file

@ -1,5 +1,9 @@
2012-09-01 Eli Zaretskii <eliz@gnu.org>
* 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.

View file

@ -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