Patch 8.1.1753
Problem: Use of popup window mask is inefficient.
Solution: Precompute and cache the mask.
Files: src/popupwin.c
*** ../vim-8.1.1752/src/popupwin.c 2019-07-26 21:26:31.163382011 +0200
--- src/popupwin.c 2019-07-26 22:08:25.390837979 +0200
***************
*** 673,678 ****
--- 673,679 ----
{
wp->w_popup_mask = di->di_tv.vval.v_list;
++wp->w_popup_mask->lv_refcount;
+ VIM_CLEAR(wp->w_popup_mask_cells);
}
else
semsg(_(e_invargval), "mask");
***************
*** 2417,2437 ****
}
/*
! * Return TRUE if "col" / "line" matches with an entry in w_popup_mask.
! * "col" and "line" are screen coordinates.
*/
! static int
! popup_masked(win_T *wp, int screencol, int screenline)
{
- int col = screencol - wp->w_wincol + 1 +
wp->w_popup_leftoff;
- int line = screenline - wp->w_winrow + 1;
listitem_T *lio, *li;
! int width, height;
if (wp->w_popup_mask == NULL)
! return FALSE;
! width = popup_width(wp);
! height = popup_height(wp);
for (lio = wp->w_popup_mask->lv_first; lio != NULL; lio = lio->li_next)
{
--- 2418,2444 ----
}
/*
! * Update "w_popup_mask_cells".
*/
! static void
! popup_update_mask(win_T *wp, int width, int height)
{
listitem_T *lio, *li;
! char_u *cells;
! int row, col;
if (wp->w_popup_mask == NULL)
! return;
! if (wp->w_popup_mask_cells != NULL
! && wp->w_popup_mask_height == height
! && wp->w_popup_mask_width == width)
! return; // cache is still valid
!
! vim_free(wp->w_popup_mask_cells);
! wp->w_popup_mask_cells = alloc_clear(width * height);
! if (wp->w_popup_mask_cells == NULL)
! return;
! cells = wp->w_popup_mask_cells;
for (lio = wp->w_popup_mask->lv_first; lio != NULL; lio = lio->li_next)
{
***************
*** 2442,2470 ****
cols = tv_get_number(&li->li_tv);
if (cols < 0)
cols = width + cols + 1;
- if (col < cols)
- continue;
li = li->li_next;
cole = tv_get_number(&li->li_tv);
if (cole < 0)
cole = width + cole + 1;
- if (col > cole)
- continue;
li = li->li_next;
lines = tv_get_number(&li->li_tv);
if (lines < 0)
lines = height + lines + 1;
- if (line < lines)
- continue;
li = li->li_next;
linee = tv_get_number(&li->li_tv);
if (linee < 0)
linee = height + linee + 1;
! if (line > linee)
! continue;
! return TRUE;
}
! return FALSE;
}
/*
--- 2449,2486 ----
cols = tv_get_number(&li->li_tv);
if (cols < 0)
cols = width + cols + 1;
li = li->li_next;
cole = tv_get_number(&li->li_tv);
if (cole < 0)
cole = width + cole + 1;
li = li->li_next;
lines = tv_get_number(&li->li_tv);
if (lines < 0)
lines = height + lines + 1;
li = li->li_next;
linee = tv_get_number(&li->li_tv);
if (linee < 0)
linee = height + linee + 1;
!
! for (row = lines - 1; row < linee && row < height; ++row)
! for (col = cols - 1; col < cole && col < width; ++col)
! cells[row * width + col] = 1;
}
! }
!
! /*
! * Return TRUE if "col" / "line" matches with an entry in w_popup_mask.
! * "col" and "line" are screen coordinates.
! */
! static int
! popup_masked(win_T *wp, int width, int height, int screencol, int screenline)
! {
! int col = screencol - wp->w_wincol + wp->w_popup_leftoff;
! int line = screenline - wp->w_winrow;
!
! return col >= 0 && col < width
! && line >= 0 && line < height
! && wp->w_popup_mask_cells[line * width + col];
}
/*
***************
*** 2574,2581 ****
popup_reset_handled();
while ((wp = find_next_popup(TRUE)) != NULL)
{
- int height;
int width;
popup_visible = TRUE;
--- 2590,2597 ----
popup_reset_handled();
while ((wp = find_next_popup(TRUE)) != NULL)
{
int width;
+ int height;
popup_visible = TRUE;
***************
*** 2584,2596 ****
|| wp->w_popup_last_changedtick != CHANGEDTICK(wp->w_buffer))
popup_adjust_position(wp);
height = popup_height(wp);
! width = popup_width(wp) - wp->w_popup_leftoff;
for (line = wp->w_winrow;
line < wp->w_winrow + height && line < screen_Rows; ++line)
for (col = wp->w_wincol;
! col < wp->w_wincol + width && col < screen_Columns; ++col)
! if (!popup_masked(wp, col, line))
mask[line * screen_Columns + col] = wp->w_zindex;
}
--- 2600,2615 ----
|| wp->w_popup_last_changedtick != CHANGEDTICK(wp->w_buffer))
popup_adjust_position(wp);
+ width = popup_width(wp);
height = popup_height(wp);
! popup_update_mask(wp, width, height);
for (line = wp->w_winrow;
line < wp->w_winrow + height && line < screen_Rows; ++line)
for (col = wp->w_wincol;
! col < wp->w_wincol + width - wp->w_popup_leftoff
! && col < screen_Columns; ++col)
! if (wp->w_popup_mask_cells == NULL
! || !popup_masked(wp, width, height, col, line))
mask[line * screen_Columns + col] = wp->w_zindex;
}
*** ../vim-8.1.1752/src/version.c 2019-07-26 21:26:31.163382011 +0200
--- src/version.c 2019-07-26 21:48:26.888010162 +0200
***************
*** 779,780 ****
--- 779,782 ----
{ /* Add new patch number below this line */
+ /**/
+ 1753,
/**/
--
BLACK KNIGHT: I'm invincible!
ARTHUR: You're a looney.
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/201907262016.x6QKGBqp026386%40masaka.moolenaar.net.