From: Eli Zaretskii Date: Mon, 8 Aug 2011 16:57:53 +0000 (+0300) Subject: Speed up bidi redisplay with selective-display. X-Git-Tag: emacs-pretest-24.0.90~104^2~124^2~62^2~18 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=97bb72a608508d9edbed86ba38d228bf6ed11eb5;p=emacs.git Speed up bidi redisplay with selective-display. src/xdisp.c (forward_to_next_line_start): Allow to use the no-display-properties-and-no-overlays under bidi display. --- diff --git a/src/ChangeLog b/src/ChangeLog index cbe2d8659b2..193bb739766 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2011-08-08 Eli Zaretskii + + * 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 * editfns.c (Fset_time_zone_rule): Document relationship with the diff --git a/src/xdisp.c b/src/xdisp.c index 6e9474e3c10..2a46fe2dad5 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -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