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.
{
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;
}
}
}
+
+ /* 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