Commit 3cccbd87 authored by Kenichi Handa's avatar Kenichi Handa

composite.c (composition_reseat_it): Handle the case that a grapheme cluster...

composite.c (composition_reseat_it): Handle the case that a grapheme cluster is not covered by a single font (Bug#12352).
parent 0b97c030
2012-09-22 Kenichi Handa <handa@gnu.org>
* composite.c (composition_reseat_it): Handle the case that a
grapheme cluster is not covered by a single font (Bug#12352).
2012-09-17 Kenichi Handa <handa@gnu.org>
* font.c (Ffont_shape_gstring): Fix previous change; GLYPHs may
......
......@@ -1219,9 +1219,6 @@ composition_reseat_it (struct composition_it *cmp_it, ptrdiff_t charpos,
ptrdiff_t bytepos, ptrdiff_t endpos, struct window *w,
struct face *face, Lisp_Object string)
{
if (endpos < 0)
endpos = NILP (string) ? BEGV : 0;
if (cmp_it->ch == -2)
{
composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string);
......@@ -1230,6 +1227,9 @@ composition_reseat_it (struct composition_it *cmp_it, ptrdiff_t charpos,
return 0;
}
if (endpos < 0)
endpos = NILP (string) ? BEGV : 0;
if (cmp_it->ch < 0)
{
/* We are looking at a static composition. */
......@@ -1277,36 +1277,23 @@ composition_reseat_it (struct composition_it *cmp_it, ptrdiff_t charpos,
{
ptrdiff_t cpos = charpos, bpos = bytepos;
while (1)
cmp_it->reversed_p = 1;
elt = XCAR (val);
if (cmp_it->lookback > 0)
{
elt = XCAR (val);
if (cmp_it->lookback > 0)
{
cpos = charpos - cmp_it->lookback;
if (STRINGP (string))
bpos = string_char_to_byte (string, cpos);
else
bpos = CHAR_TO_BYTE (cpos);
}
lgstring = autocmp_chars (elt, cpos, bpos, charpos + 1, w, face,
string);
if (composition_gstring_p (lgstring)
&& cpos + LGSTRING_CHAR_LEN (lgstring) - 1 == charpos)
break;
/* Composition failed or didn't cover the current
character. */
if (cmp_it->lookback == 0)
goto no_composition;
lgstring = Qnil;
/* Try to find a shorter composition that starts after CPOS. */
composition_compute_stop_pos (cmp_it, charpos, bytepos, cpos,
string);
if (cmp_it->ch == -2 || cmp_it->stop_pos < charpos)
goto no_composition;
val = CHAR_TABLE_REF (Vcomposition_function_table, cmp_it->ch);
for (i = 0; i < cmp_it->rule_idx; i++, val = XCDR (val));
cpos = charpos - cmp_it->lookback;
if (STRINGP (string))
bpos = string_char_to_byte (string, cpos);
else
bpos = CHAR_TO_BYTE (cpos);
}
cmp_it->reversed_p = 1;
lgstring = autocmp_chars (elt, cpos, bpos, charpos + 1, w, face,
string);
if (! composition_gstring_p (lgstring)
|| cpos + LGSTRING_CHAR_LEN (lgstring) - 1 != charpos)
/* Composition failed or didn't cover the current
character. */
goto no_composition;
}
if (NILP (lgstring))
goto no_composition;
......@@ -1341,6 +1328,8 @@ composition_reseat_it (struct composition_it *cmp_it, ptrdiff_t charpos,
/* BYTEPOS is calculated in composition_compute_stop_pos */
bytepos = -1;
}
if (cmp_it->reversed_p)
endpos = -1;
composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string);
return 0;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment