diff options
author | Kenichi Handa <handa@gnu.org> | 2012-09-22 11:15:29 +0900 |
---|---|---|
committer | Kenichi Handa <handa@gnu.org> | 2012-09-22 11:15:29 +0900 |
commit | 3cccbd87267735609a21df50b80b3aad07004555 (patch) | |
tree | d684898ffb505f726798696740b312be125d437c /src/composite.c | |
parent | 0b97c030c678e7c77766e13e615ef2ce8394860a (diff) | |
download | emacs-3cccbd87267735609a21df50b80b3aad07004555.tar.gz |
composite.c (composition_reseat_it): Handle the case that a grapheme cluster is not covered by a single font (Bug#12352).
Diffstat (limited to 'src/composite.c')
-rw-r--r-- | src/composite.c | 51 |
1 files changed, 20 insertions, 31 deletions
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; } |