diff options
author | vanaigr <vanaigranov@gmail.com> | 2024-10-19 16:28:47 -0500 |
---|---|---|
committer | vanaigr <vanaigranov@gmail.com> | 2024-12-05 08:45:22 -0600 |
commit | 3abd7ed4a4cdc5128c5e7e0d02c313585bd71745 (patch) | |
tree | bb110966f1e84690fdf3e24912478c8f3a524226 /src/nvim/drawline.c | |
parent | 731f83ea4ae7f7118cf34c43dc14005503b950fd (diff) | |
download | rneovim-3abd7ed4a4cdc5128c5e7e0d02c313585bd71745.tar.gz rneovim-3abd7ed4a4cdc5128c5e7e0d02c313585bd71745.tar.bz2 rneovim-3abd7ed4a4cdc5128c5e7e0d02c313585bd71745.zip |
perf: consider only active decorations when drawing lines
Diffstat (limited to 'src/nvim/drawline.c')
-rw-r--r-- | src/nvim/drawline.c | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c index 10811d40f8..93b66a9ba3 100644 --- a/src/nvim/drawline.c +++ b/src/nvim/drawline.c @@ -251,12 +251,17 @@ static int line_putchar(buf_T *buf, const char **pp, schar_T *dest, int maxcells static void draw_virt_text(win_T *wp, buf_T *buf, int col_off, int *end_col, int win_row) { - DecorState *state = &decor_state; - const int max_col = wp->w_grid.cols; + DecorState *const state = &decor_state; + int const max_col = wp->w_grid.cols; int right_pos = max_col; - bool do_eol = state->eol_col > -1; - for (size_t i = 0; i < kv_size(state->active); i++) { - DecorRange *item = &kv_A(state->active, i); + bool const do_eol = state->eol_col > -1; + + int const count = state->current_end; + int *const indices = state->ranges_i.items; + DecorRangeSlot *const slots = state->slots.items; + + for (int i = 0; i < count; i++) { + DecorRange *item = &slots[indices[i]].range; if (!(item->start_row == state->row && decor_virt_pos(item))) { continue; } @@ -756,17 +761,28 @@ static bool has_more_inline_virt(winlinevars_T *wlv, ptrdiff_t v) if (wlv->virt_inline_i < kv_size(wlv->virt_inline)) { return true; } - DecorState *state = &decor_state; - for (size_t i = 0; i < kv_size(state->active); i++) { - DecorRange *item = &kv_A(state->active, i); - if (item->start_row != state->row - || item->kind != kDecorKindVirtText - || item->data.vt->pos != kVPosInline - || item->data.vt->width == 0) { - continue; - } - if (item->draw_col >= -1 && item->start_col >= v) { - return true; + + int const count = (int)kv_size(decor_state.ranges_i); + int const cur_end = decor_state.current_end; + int const fut_beg = decor_state.future_begin; + int *const indices = decor_state.ranges_i.items; + DecorRangeSlot *const slots = decor_state.slots.items; + + int const beg_pos[] = { 0, fut_beg }; + int const end_pos[] = { cur_end, count }; + + for (int pos_i = 0; pos_i < 2; pos_i++) { + for (int i = beg_pos[pos_i]; i < end_pos[pos_i]; i++) { + DecorRange *item = &slots[indices[i]].range; + if (item->start_row != decor_state.row + || item->kind != kDecorKindVirtText + || item->data.vt->pos != kVPosInline + || item->data.vt->width == 0) { + continue; + } + if (item->draw_col >= -1 && item->start_col >= v) { + return true; + } } } return false; @@ -780,8 +796,12 @@ static void handle_inline_virtual_text(win_T *wp, winlinevars_T *wlv, ptrdiff_t wlv->virt_inline = VIRTTEXT_EMPTY; wlv->virt_inline_i = 0; DecorState *state = &decor_state; - for (size_t i = 0; i < kv_size(state->active); i++) { - DecorRange *item = &kv_A(state->active, i); + int const count = state->current_end; + int *const indices = state->ranges_i.items; + DecorRangeSlot *const slots = state->slots.items; + + for (int i = 0; i < count; i++) { + DecorRange *item = &slots[indices[i]].range; if (item->draw_col == -3) { // No more inline virtual text before this non-inline virtual text item, // so its position can be decided now. |