aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/drawline.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-01-22 10:00:11 +0800
committerGitHub <noreply@github.com>2024-01-22 10:00:11 +0800
commit8c6de9147cabbf99d18afbdbed2f11f30c1d0dfc (patch)
treeb05e873236f53b2b9dc244c00f538eb47f45ab2f /src/nvim/drawline.c
parenta25aeee856e2fb02f93ffa5c2e5d43fd75ead2cf (diff)
parentfd08de4b85ae42fe3ad5b480b58df9f7fff76269 (diff)
downloadrneovim-8c6de9147cabbf99d18afbdbed2f11f30c1d0dfc.tar.gz
rneovim-8c6de9147cabbf99d18afbdbed2f11f30c1d0dfc.tar.bz2
rneovim-8c6de9147cabbf99d18afbdbed2f11f30c1d0dfc.zip
Merge pull request #26813 from VanaIgr/screen-pos-speedup
perf: make screen size and position calculations more efficient N/A patches for version.c: vim-patch:9.1.0037: Calling get_breakindent_win() repeatedly when computing virtcol vim-patch:9.1.0038: Unnecessary loop in getvcol()
Diffstat (limited to 'src/nvim/drawline.c')
-rw-r--r--src/nvim/drawline.c48
1 files changed, 24 insertions, 24 deletions
diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c
index cead63b88d..616fd24460 100644
--- a/src/nvim/drawline.c
+++ b/src/nvim/drawline.c
@@ -1336,30 +1336,30 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
if (start_col > 0 && col_rows == 0) {
char *prev_ptr = ptr;
- chartabsize_T cts;
- int charsize = 0;
- int head = 0;
-
- init_chartabsize_arg(&cts, wp, lnum, wlv.vcol, line, ptr);
- cts.cts_max_head_vcol = start_col;
- while (cts.cts_vcol < start_col && *cts.cts_ptr != NUL) {
- head = 0;
- charsize = win_lbr_chartabsize(&cts, &head);
- cts.cts_vcol += charsize;
- prev_ptr = cts.cts_ptr;
- MB_PTR_ADV(cts.cts_ptr);
+ CharSize cs = { 0 };
+
+ CharsizeArg arg;
+ CSType cstype = init_charsize_arg(&arg, wp, lnum, line);
+ arg.max_head_vcol = start_col;
+ int vcol = wlv.vcol;
+ StrCharInfo ci = utf_ptr2StrCharInfo(ptr);
+ while (vcol < start_col && *ci.ptr != NUL) {
+ cs = win_charsize(cstype, vcol, ci.ptr, ci.chr.value, &arg);
+ vcol += cs.width;
+ prev_ptr = ci.ptr;
+ ci = utfc_next(ci);
if (wp->w_p_list) {
- in_multispace = *prev_ptr == ' ' && (*cts.cts_ptr == ' '
+ in_multispace = *prev_ptr == ' ' && (*ci.ptr == ' '
|| (prev_ptr > line && prev_ptr[-1] == ' '));
if (!in_multispace) {
multispace_pos = 0;
- } else if (cts.cts_ptr >= line + leadcol
+ } else if (ci.ptr >= line + leadcol
&& wp->w_p_lcs_chars.multispace != NULL) {
multispace_pos++;
if (wp->w_p_lcs_chars.multispace[multispace_pos] == NUL) {
multispace_pos = 0;
}
- } else if (cts.cts_ptr < line + leadcol
+ } else if (ci.ptr < line + leadcol
&& wp->w_p_lcs_chars.leadmultispace != NULL) {
multispace_pos++;
if (wp->w_p_lcs_chars.leadmultispace[multispace_pos] == NUL) {
@@ -1368,9 +1368,10 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
}
}
}
- wlv.vcol = cts.cts_vcol;
- ptr = cts.cts_ptr;
- clear_chartabsize_arg(&cts);
+ wlv.vcol = vcol;
+ ptr = ci.ptr;
+ int charsize = cs.width;
+ int head = cs.head;
// When:
// - 'cuc' is set, or
@@ -2081,13 +2082,12 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
&& vim_isbreak(mb_c) && !vim_isbreak((uint8_t)(*ptr))) {
int mb_off = utf_head_off(line, ptr - 1);
char *p = ptr - (mb_off + 1);
- chartabsize_T cts;
- init_chartabsize_arg(&cts, wp, lnum, wlv.vcol, line, p);
- // do not want virtual text to be counted here
- cts.cts_has_virt_text = false;
- wlv.n_extra = win_lbr_chartabsize(&cts, NULL) - 1;
- clear_chartabsize_arg(&cts);
+ CharsizeArg arg;
+ // lnum == 0, do not want virtual text to be counted here
+ CSType cstype = init_charsize_arg(&arg, wp, 0, line);
+ wlv.n_extra = win_charsize(cstype, wlv.vcol, p, utf_ptr2CharInfo(p).value,
+ &arg).width - 1;
if (on_last_col && mb_c != TAB) {
// Do not continue search/match highlighting over the