# HG changeset patch # User Kim F. Storm # Date 1138972483 0 # Node ID 8e80e7413fc22398fed5e371f4c7bc5d32609a59 # Parent 55d1392b15da4b8edd31a3b9b11bd776333ca049 Cache last merged escape glyph face. (last_escape_glyph_frame, last_escape_glyph_face_id) (last_escape_glyph_merged_face_id): New variables. (get_next_display_element): Use/update them. (redisplay_internal): Reset them before redisplay. (set_iterator_to_next): Optimize 2004-12-13 fix. Only recheck faces after displaying ellipsis. diff -r 55d1392b15da -r 8e80e7413fc2 src/xdisp.c --- a/src/xdisp.c Fri Feb 03 13:14:23 2006 +0000 +++ b/src/xdisp.c Fri Feb 03 13:14:43 2006 +0000 @@ -5329,6 +5329,10 @@ display element from the current position of IT. Value is zero if end of buffer (or C string) is reached. */ +static struct frame *last_escape_glyph_frame = NULL; +static unsigned last_escape_glyph_face_id = (1 << FACE_ID_BITS); +static int last_escape_glyph_merged_face_id = 0; + int get_next_display_element (it) struct it *it; @@ -5445,11 +5449,19 @@ face_id = merge_faces (it->f, Qt, lface_id, it->face_id); } + else if (it->f == last_escape_glyph_frame + && it->face_id == last_escape_glyph_face_id) + { + face_id = last_escape_glyph_merged_face_id; + } else { /* Merge the escape-glyph face into the current face. */ face_id = merge_faces (it->f, Qescape_glyph, 0, it->face_id); + last_escape_glyph_frame = it->f; + last_escape_glyph_face_id = it->face_id; + last_escape_glyph_merged_face_id = face_id; } XSETINT (it->ctl_chars[0], g); @@ -5496,11 +5508,19 @@ face_id = merge_faces (it->f, Qt, lface_id, it->face_id); } + else if (it->f == last_escape_glyph_frame + && it->face_id == last_escape_glyph_face_id) + { + face_id = last_escape_glyph_merged_face_id; + } else { /* Merge the escape-glyph face into the current face. */ face_id = merge_faces (it->f, Qescape_glyph, 0, it->face_id); + last_escape_glyph_frame = it->f; + last_escape_glyph_face_id = it->face_id; + last_escape_glyph_merged_face_id = face_id; } /* Handle soft hyphens in the mode where they only get @@ -5694,6 +5714,8 @@ if (it->dpvec + it->current.dpvec_index == it->dpend) { + int recheck_faces = it->ellipsis_p; + if (it->s) it->method = GET_FROM_C_STRING; else if (STRINGP (it->string)) @@ -5716,8 +5738,9 @@ set_iterator_to_next (it, reseat_p); } - /* Recheck faces after display vector */ - it->stop_charpos = IT_CHARPOS (*it); + /* Maybe recheck faces after display vector */ + if (recheck_faces) + it->stop_charpos = IT_CHARPOS (*it); } break; @@ -10545,6 +10568,8 @@ retry: pause = 0; reconsider_clip_changes (w, current_buffer); + last_escape_glyph_frame = NULL; + last_escape_glyph_face_id = (1 << FACE_ID_BITS); /* If new fonts have been loaded that make a glyph matrix adjustment necessary, do it. */