From: Kenichi Handa Date: Sat, 22 Sep 2012 02:15:29 +0000 (+0900) Subject: composite.c (composition_reseat_it): Handle the case that a grapheme cluster is not... X-Git-Tag: emacs-24.2.90~270 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3cccbd87267735609a21df50b80b3aad07004555;p=emacs.git composite.c (composition_reseat_it): Handle the case that a grapheme cluster is not covered by a single font (Bug#12352). --- diff --git a/src/ChangeLog b/src/ChangeLog index be734134adf..8a05f19985f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2012-09-22 Kenichi Handa + + * 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 * font.c (Ffont_shape_gstring): Fix previous change; GLYPHs may diff --git a/src/composite.c b/src/composite.c index ae46df0a573..6c603fab3fc 100644 --- a/src/composite.c +++ b/src/composite.c @@ -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; }