# HG changeset patch # User Bram Moolenaar # Date 1358959437 -3600 # Node ID 29f29e86602e4a7f83d4572d2fe75b9b0de2752f # Parent 7457c01057479a7d65305a73936c30d25069bd25 updated for version 7.3.781 Problem: Drawing with 'guifontwide' can be slow. Solution: Draw multiple characters at a time. (Taro Muraoka) diff --git a/src/gui.c b/src/gui.c --- 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; diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -726,6 +726,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 781, +/**/ 780, /**/ 779,