]> git.eshelyaron.com Git - emacs.git/commitdiff
Speed up redisplay of long truncated lines
authorEli Zaretskii <eliz@gnu.org>
Sat, 23 Jul 2022 13:13:32 +0000 (16:13 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 23 Jul 2022 13:13:32 +0000 (16:13 +0300)
* src/xdisp.c (forward_to_next_line_start): Fix logic of
interpreting the result of Fnext_single_property_change.
(reseat_at_next_visible_line_start): When ON_NEWLINE_P is zero,
pass NULL to 'forward_to_next_line_start', to avoid costly bidi
iteration when none is needed.  This speeds up redisplay of very
long lines under 'truncate-lines'.

src/xdisp.c

index 215a6d561ea95388c5fc62238daba55ce0a84d20..690f10b84038750c01b719dd5593c819193264f0 100644 (file)
@@ -7153,10 +7153,10 @@ forward_to_next_line_start (struct it *it, bool *skipped_p,
          || ((pos = Fnext_single_property_change (make_fixnum (start),
                                                   Qdisplay, Qnil,
                                                   make_fixnum (limit)),
-              NILP (pos))
+              (NILP (pos) || XFIXNAT (pos) == limit))
              && next_overlay_change (start) == ZV))
        {
-         if (!it->bidi_p)
+         if (!it->bidi_p || !bidi_it_prev)
            {
              IT_CHARPOS (*it) = limit;
              IT_BYTEPOS (*it) = bytepos;
@@ -7319,7 +7319,8 @@ reseat_at_next_visible_line_start (struct it *it, bool on_newline_p)
   bool skipped_p = false;
   struct bidi_it bidi_it_prev;
   bool newline_found_p
-    = forward_to_next_line_start (it, &skipped_p, &bidi_it_prev);
+    = forward_to_next_line_start (it, &skipped_p,
+                                 on_newline_p ? &bidi_it_prev : NULL);
 
   /* Skip over lines that are invisible because they are indented
      more than the value of IT->selective.  */
@@ -7331,7 +7332,8 @@ reseat_at_next_visible_line_start (struct it *it, bool on_newline_p)
        eassert (IT_BYTEPOS (*it) == BEGV
                 || FETCH_BYTE (IT_BYTEPOS (*it) - 1) == '\n');
        newline_found_p =
-         forward_to_next_line_start (it, &skipped_p, &bidi_it_prev);
+         forward_to_next_line_start (it, &skipped_p,
+                                     on_newline_p ? &bidi_it_prev : NULL);
       }
 
   /* Position on the newline if that's what's requested.  */