refactor(signs): more efficient signcol calc

When iterating signs to calculate the sign column, stop iterating when
we reach the maximum configured from 'signcolumn'.
This commit is contained in:
Lewis Russell
2022-02-12 17:12:09 +00:00
parent 7db0aa027c
commit 50250542c3
3 changed files with 40 additions and 26 deletions

View File

@@ -5455,30 +5455,43 @@ bool find_win_for_buf(buf_T *buf, win_T **wp, tabpage_T **tp)
return false;
}
int buf_signcols(buf_T *buf)
static int buf_signcols_inner(buf_T *buf, int maximum)
{
sign_entry_T *sign; // a sign in the sign list
int signcols = 0;
int linesum = 0;
linenr_T curline = 0;
FOR_ALL_SIGNS_IN_BUF(buf, sign) {
if (sign->se_lnum > curline) {
if (linesum > signcols) {
signcols = linesum;
if (signcols >= maximum) {
return maximum;
}
}
curline = sign->se_lnum;
linesum = 0;
}
if (sign->se_has_text_or_icon) {
linesum++;
}
}
if (linesum > signcols) {
signcols = linesum;
if (signcols >= maximum) {
return maximum;
}
}
return signcols;
}
int buf_signcols(buf_T *buf, int maximum)
{
if (!buf->b_signcols_valid) {
sign_entry_T *sign; // a sign in the sign list
int signcols = 0;
int linesum = 0;
linenr_T curline = 0;
FOR_ALL_SIGNS_IN_BUF(buf, sign) {
if (sign->se_lnum > curline) {
if (linesum > signcols) {
signcols = linesum;
}
curline = sign->se_lnum;
linesum = 0;
}
if (sign->se_has_text_or_icon) {
linesum++;
}
}
if (linesum > signcols) {
signcols = linesum;
}
int signcols = buf_signcols_inner(buf, maximum);
// Check if we need to redraw
if (signcols != buf->b_signcols) {
buf->b_signcols = signcols;