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:
parent
f18cbb28c2
commit
7e510e2844
2 changed files with 30 additions and 16 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue