From: Gregory Heytings Date: Fri, 29 Jul 2022 16:23:16 +0000 (+0000) Subject: Improve narrowing when iterator has moved outside of narrowing bounds. X-Git-Tag: emacs-29.0.90~1447^2~661 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=9c12c3b7c59ee102d3a022368ea050fc9e3bb186;p=emacs.git Improve narrowing when iterator has moved outside of narrowing bounds. * src/xdisp.c (get_narrowed_begv, get_narrowed_zv): Add 'pos' parameter. (init_iterator): Add arguments to 'get_narrowed_begv' and 'get_narrowed_zv'. (handle_fontified_prop): Recompute the narrowing when iterator has moved outside of narrowing bounds. * src/dispextern.h (get_narrowed_begv, get_narrowed_zv): Adapt prototypes. * src/composite.c (find_automatic_composition): Add argument to 'get_narrowed_begv'. --- diff --git a/src/composite.c b/src/composite.c index b04d34337b4..0f90b92a785 100644 --- a/src/composite.c +++ b/src/composite.c @@ -1599,7 +1599,7 @@ find_automatic_composition (ptrdiff_t pos, ptrdiff_t limit, ptrdiff_t backlim, head = backlim; /* In buffers with very long lines, this function becomes very slow. Pretend that the buffer is narrowed to make it fast. */ - narrowed_begv = get_narrowed_begv (w); + narrowed_begv = get_narrowed_begv (w, window_point (w)); if (narrowed_begv && pos > narrowed_begv) head = narrowed_begv; tail = ZV; diff --git a/src/dispextern.h b/src/dispextern.h index 2772e8cda8d..817211e795e 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -3404,8 +3404,8 @@ void mark_window_display_accurate (Lisp_Object, bool); void redisplay_preserve_echo_area (int); void init_iterator (struct it *, struct window *, ptrdiff_t, ptrdiff_t, struct glyph_row *, enum face_id); -ptrdiff_t get_narrowed_begv (struct window *); -ptrdiff_t get_narrowed_zv (struct window *); +ptrdiff_t get_narrowed_begv (struct window *, ptrdiff_t); +ptrdiff_t get_narrowed_zv (struct window *, ptrdiff_t); ptrdiff_t get_closer_narrowed_begv (struct window *, ptrdiff_t); void init_iterator_to_row_start (struct it *, struct window *, struct glyph_row *); diff --git a/src/xdisp.c b/src/xdisp.c index 9580e596012..cdef90b6868 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -3427,8 +3427,8 @@ init_iterator (struct it *it, struct window *w, if (current_buffer->long_line_optimizations_p) { - it->narrowed_begv = get_narrowed_begv (w); - it->narrowed_zv = get_narrowed_zv (w); + it->narrowed_begv = get_narrowed_begv (w, window_point (w)); + it->narrowed_zv = get_narrowed_zv (w, window_point (w)); } /* If a buffer position was specified, set the iterator there, @@ -3519,19 +3519,19 @@ get_narrowed_len (struct window *w) } ptrdiff_t -get_narrowed_begv (struct window *w) +get_narrowed_begv (struct window *w, ptrdiff_t pos) { int len = get_narrowed_len (w); ptrdiff_t begv; - begv = max ((window_point (w) / len - 1) * len, BEGV); + begv = max ((pos / len - 1) * len, BEGV); return begv == BEGV ? 0 : begv; } ptrdiff_t -get_narrowed_zv (struct window *w) +get_narrowed_zv (struct window *w, ptrdiff_t pos) { int len = get_narrowed_len (w); - return min ((window_point (w) / len + 1) * len, ZV); + return min ((pos / len + 1) * len, ZV); } ptrdiff_t @@ -4408,9 +4408,17 @@ handle_fontified_prop (struct it *it) eassert (it->end_charpos == ZV); if (current_buffer->long_line_optimizations_p) - Fnarrow_to_region (make_fixnum (it->narrowed_begv ? - it->narrowed_begv : BEGV), - make_fixnum (it->narrowed_zv), Qt); + { + ptrdiff_t begv = it->narrowed_begv ? it->narrowed_begv : BEGV; + ptrdiff_t zv = it->narrowed_zv; + ptrdiff_t charpos = IT_CHARPOS (*it); + if (charpos < begv || charpos > zv) + { + begv = get_narrowed_begv (it->w, charpos); + zv = get_narrowed_zv (it->w, charpos); + } + Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv), Qt); + } /* Don't allow Lisp that runs from 'fontification-functions' clear our face and image caches behind our back. */