Mercurial > vim
changeset 4053:29f29e86602e v7.3.781
updated for version 7.3.781
Problem: Drawing with 'guifontwide' can be slow.
Solution: Draw multiple characters at a time. (Taro Muraoka)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 23 Jan 2013 17:43:57 +0100 |
parents | 7457c0105747 |
children | 806eb14f383c |
files | src/gui.c src/version.c |
diffstat | 2 files changed, 23 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/gui.c +++ b/src/gui.c @@ -2380,7 +2380,9 @@ gui_outstr_nowrap(s, len, flags, fg, bg, int cl; /* byte length of current char */ int comping; /* current char is composing */ int scol = col; /* screen column */ - int dowide; /* use 'guifontwide' */ + int curr_wide; /* use 'guifontwide' */ + int prev_wide = FALSE; + int wide_changed; /* Break the string at a composing character, it has to be drawn on * top of the previous character. */ @@ -2395,9 +2397,9 @@ gui_outstr_nowrap(s, len, flags, fg, bg, && fontset == NOFONTSET # endif && gui.wide_font != NOFONT) - dowide = TRUE; + curr_wide = TRUE; else - dowide = FALSE; + curr_wide = FALSE; comping = utf_iscomposing(c); if (!comping) /* count cells from non-composing chars */ cells += cn; @@ -2405,9 +2407,11 @@ gui_outstr_nowrap(s, len, flags, fg, bg, if (cl == 0) /* hit end of string */ len = i + cl; /* len must be wrong "cannot happen" */ - /* print the string so far if it's the last character or there is + wide_changed = curr_wide != prev_wide; + + /* Print the string so far if it's the last character or there is * a composing character. */ - if (i + cl >= len || (comping && i > start) || dowide + if (i + cl >= len || (comping && i > start) || wide_changed # if defined(FEAT_GUI_X11) || (cn > 1 # ifdef FEAT_XFONTSET @@ -2419,25 +2423,28 @@ gui_outstr_nowrap(s, len, flags, fg, bg, # endif ) { - if (comping || dowide) + if (comping || wide_changed) thislen = i - start; else thislen = i - start + cl; if (thislen > 0) { + if (prev_wide) + gui_mch_set_font(gui.wide_font); gui_mch_draw_string(gui.row, scol, s + start, thislen, draw_flags); + if (prev_wide) + gui_mch_set_font(font); start += thislen; } scol += cells; cells = 0; - if (dowide) + /* Adjust to not draw a character which width is changed + * against with last one. */ + if (wide_changed && !comping) { - gui_mch_set_font(gui.wide_font); - gui_mch_draw_string(gui.row, scol - cn, - s + start, cl, draw_flags); - gui_mch_set_font(font); - start += cl; + scol -= cn; + cl = 0; } # if defined(FEAT_GUI_X11) @@ -2447,7 +2454,7 @@ gui_outstr_nowrap(s, len, flags, fg, bg, # ifdef FEAT_XFONTSET && fontset == NOFONTSET # endif - && !dowide) + && !wide_changed) gui_mch_draw_string(gui.row, scol - 1, (char_u *)" ", 1, draw_flags); # endif @@ -2465,6 +2472,7 @@ gui_outstr_nowrap(s, len, flags, fg, bg, # endif start = i + cl; } + prev_wide = curr_wide; } /* The stuff below assumes "len" is the length in screen columns. */ len = scol - col;