From 5e1c414a21cd5d3345e7d3ff9181d7fa08c86830 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 24 Jul 2023 17:53:16 +0200 Subject: [PATCH] In the no-draw phase, do not cache the positions of not visible insets This can make a big difference for a very large branch that contains lots of equations. This is complementary to the previous patch, since instead of reducing the number of calls to updatePosCache, we make it faster. In the same test of scrolling with mouse wheel through the branch-test.lyx document, one finds a 23% improvement for BufferView::updateMetrics(). Part of bug #12297. (cherry picked from commit 7f85024f80601b15634fb5e771bba51435ad429f) --- src/TextMetrics.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 6968279c23..06e00f4220 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -2000,6 +2000,7 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const if (pm.rows().empty()) return; size_t const nrows = pm.rows().size(); + int const wh = bv_->workHeight(); // Remember left and right margin for drawing math numbers Changer changeleft = changeVar(pi.leftx, x + leftMargin(pit)); Changer changeright = changeVar(pi.rightx, x + width() - rightMargin(pit)); @@ -2014,15 +2015,17 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const if (i) y += row.ascent(); - RowPainter rp(pi, *text_, row, row_x, y); - - rp.paintOnlyInsets(); + // It is not needed to draw on screen if we are not inside + bool const inside = (y + row.descent() >= 0 && y - row.ascent() < wh); + if (inside) { + RowPainter rp(pi, *text_, row, row_x, y); + rp.paintOnlyInsets(); + } y += row.descent(); } return; } - int const ww = bv_->workHeight(); Cursor const & cur = bv_->cursor(); DocIterator sel_beg = cur.selectionBegin(); DocIterator sel_end = cur.selectionEnd(); @@ -2065,7 +2068,7 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const // It is not needed to draw on screen if we are not inside. bool const inside = (y + row.descent() >= 0 - && y - row.ascent() < ww); + && y - row.ascent() < wh); if (!inside) { // Inset positions have already been set in nodraw stage. y += row.descent();