changeset 68593:8e80e7413fc2

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.
author Kim F. Storm <storm@cua.dk>
date Fri, 03 Feb 2006 13:14:43 +0000
parents 55d1392b15da
children ca4201c7597d
files src/xdisp.c
diffstat 1 files changed, 27 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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.  */