Speed up bidi redisplay with selective-display.
authorEli Zaretskii <eliz@gnu.org>
Mon, 8 Aug 2011 16:57:53 +0000 (19:57 +0300)
committerEli Zaretskii <eliz@gnu.org>
Mon, 8 Aug 2011 16:57:53 +0000 (19:57 +0300)
 src/xdisp.c (forward_to_next_line_start): Allow to use the
 no-display-properties-and-no-overlays under bidi display.

src/ChangeLog
src/xdisp.c

index cbe2d86..193bb73 100644 (file)
@@ -1,3 +1,8 @@
+2011-08-08  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (forward_to_next_line_start): Allow to use the
+       no-display-properties-and-no-overlays under bidi display.
+
 2011-08-08  Chong Yidong  <cyd@stupidchicken.com>
 
        * editfns.c (Fset_time_zone_rule): Document relationship with the
index 6e9474e..2a46fe2 100644 (file)
@@ -5532,19 +5532,34 @@ forward_to_next_line_start (struct it *it, int *skipped_p,
 
       xassert (!STRINGP (it->string));
 
-      /* If we are not bidi-reordering, and there isn't any `display'
-        property in sight, and no overlays, we can just use the
-        position of the newline in buffer text.  */
-      if (!it->bidi_p
-         && (it->stop_charpos >= limit
-             || ((pos = Fnext_single_property_change (make_number (start),
-                                                      Qdisplay, Qnil,
-                                                      make_number (limit)),
-                  NILP (pos))
-                 && next_overlay_change (start) == ZV)))
-       {
-         IT_CHARPOS (*it) = limit;
-         IT_BYTEPOS (*it) = CHAR_TO_BYTE (limit);
+      /* If there isn't any `display' property in sight, and no
+        overlays, we can just use the position of the newline in
+        buffer text.  */
+      if (it->stop_charpos >= limit
+         || ((pos = Fnext_single_property_change (make_number (start),
+                                                  Qdisplay, Qnil,
+                                                  make_number (limit)),
+              NILP (pos))
+             && next_overlay_change (start) == ZV))
+       {
+         if (!it->bidi_p)
+           {
+             IT_CHARPOS (*it) = limit;
+             IT_BYTEPOS (*it) = CHAR_TO_BYTE (limit);
+           }
+         else
+           {
+             struct bidi_it bprev;
+
+             do {
+               bprev = it->bidi_it;
+               bidi_move_to_visually_next (&it->bidi_it);
+             } while (it->bidi_it.charpos != limit);
+             IT_CHARPOS (*it) = limit;
+             IT_BYTEPOS (*it) = it->bidi_it.bytepos;
+             if (bidi_it_prev)
+               *bidi_it_prev = bprev;
+           }
          *skipped_p = newline_found_p = 1;
        }
       else