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 7f85024f80)
This commit is contained in:
Jean-Marc Lasgouttes 2023-07-24 17:53:16 +02:00
parent e51f9d9f88
commit 5e1c414a21

View File

@ -2000,6 +2000,7 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
if (pm.rows().empty()) if (pm.rows().empty())
return; return;
size_t const nrows = pm.rows().size(); size_t const nrows = pm.rows().size();
int const wh = bv_->workHeight();
// Remember left and right margin for drawing math numbers // Remember left and right margin for drawing math numbers
Changer changeleft = changeVar(pi.leftx, x + leftMargin(pit)); Changer changeleft = changeVar(pi.leftx, x + leftMargin(pit));
Changer changeright = changeVar(pi.rightx, x + width() - rightMargin(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) if (i)
y += row.ascent(); y += row.ascent();
RowPainter rp(pi, *text_, row, row_x, y); // It is not needed to draw on screen if we are not inside
bool const inside = (y + row.descent() >= 0 && y - row.ascent() < wh);
rp.paintOnlyInsets(); if (inside) {
RowPainter rp(pi, *text_, row, row_x, y);
rp.paintOnlyInsets();
}
y += row.descent(); y += row.descent();
} }
return; return;
} }
int const ww = bv_->workHeight();
Cursor const & cur = bv_->cursor(); Cursor const & cur = bv_->cursor();
DocIterator sel_beg = cur.selectionBegin(); DocIterator sel_beg = cur.selectionBegin();
DocIterator sel_end = cur.selectionEnd(); 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. // It is not needed to draw on screen if we are not inside.
bool const inside = (y + row.descent() >= 0 bool const inside = (y + row.descent() >= 0
&& y - row.ascent() < ww); && y - row.ascent() < wh);
if (!inside) { if (!inside) {
// Inset positions have already been set in nodraw stage. // Inset positions have already been set in nodraw stage.
y += row.descent(); y += row.descent();