(composition_compute_stop_pos): Limit the search of composition to
authorKenichi Handa <handa@m17n.org>
Tue, 9 Sep 2008 11:07:49 +0000 (11:07 +0000)
committerKenichi Handa <handa@m17n.org>
Tue, 9 Sep 2008 11:07:49 +0000 (11:07 +0000)
at most 500 characters ahead.  If we reach the limit or find a
newline, set cmp_it->ch to -2 and return 0.
(composition_reseat_it): Handle the case that cmp_it->ch is -2.

src/composite.c

index 12120f0..eea2f96 100644 (file)
@@ -994,7 +994,11 @@ composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string)
 {
   EMACS_INT start, end, c;
   Lisp_Object prop, val;
+  /* This is from forward_to_next_line_start in xdisp.c.  */
+  const int MAX_NEWLINE_DISTANCE = 500;
 
+  if (endpos > charpos + MAX_NEWLINE_DISTANCE)
+    endpos = charpos + MAX_NEWLINE_DISTANCE;
   cmp_it->stop_pos = endpos;
   if (find_composition (charpos, endpos, &start, &end, &prop, string)
       && COMPOSITION_VALID_P (start, end, prop))
@@ -1020,6 +1024,8 @@ composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string)
        FETCH_STRING_CHAR_ADVANCE (c, string, charpos, bytepos);
       else
        FETCH_CHAR_ADVANCE (c, charpos, bytepos);
+      if (c == '\n')
+       break;
       val = CHAR_TABLE_REF (Vcomposition_function_table, c);
       if (! NILP (val))
        {
@@ -1041,6 +1047,11 @@ composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string)
            }
        }
     }
+  if (charpos == endpos)
+    {
+      cmp_it->stop_pos = endpos;
+      cmp_it->ch = -2;
+    }
 }
 
 /* Check if the character at CHARPOS (and BYTEPOS) is composed
@@ -1062,6 +1073,13 @@ composition_reseat_it (cmp_it, charpos, bytepos, endpos, w, face, string)
      struct face *face;
      Lisp_Object string;
 {
+  if (cmp_it->ch == -2)
+    {
+      composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string);
+      if (cmp_it->ch == -2)
+       return 0;
+    }
+
   if (cmp_it->ch < 0)
     {
       /* We are looking at a static composition.  */