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;
--- 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,