changeset 30771:cf77f7a19ab6 v9.0.0720

patch 9.0.0720: MS-Windows GUI may have pixel dust from antialiasing Commit: https://github.com/vim/vim/commit/0c502d2e7031611788c301c7da0896f0fd9515fd Author: Bram Moolenaar <Bram@vim.org> Date: Tue Oct 11 12:48:44 2022 +0100 patch 9.0.0720: MS-Windows GUI may have pixel dust from antialiasing Problem: MS-Windows GUI may have pixel dust from antialiasing. Solution: When a character changes also redraw the next one. (issue https://github.com/vim/vim/issues/8532)
author Bram Moolenaar <Bram@vim.org>
date Tue, 11 Oct 2022 14:00:07 +0200
parents aff0085cbf86
children 73a1f2dec989
files src/screen.c src/version.c
diffstat 2 files changed, 24 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -475,6 +475,10 @@ screen_line(
 #endif
 				;
     int		    redraw_next;	// redraw_this for next character
+#ifdef FEAT_GUI_MSWIN
+    int		    changed_this;	// TRUE if character changed
+    int		    changed_next;	// TRUE if next character changed
+#endif
     int		    clear_next = FALSE;
     int		    char_cells;		// 1: normal char
 					// 2: occupies two display cells
@@ -534,6 +538,9 @@ screen_line(
 #endif
 
     redraw_next = char_needs_redraw(off_from, off_to, endcol - col);
+#ifdef FEAT_GUI_MSWIN
+    changed_next = redraw_next;
+#endif
 
     while (col < endcol)
     {
@@ -547,15 +554,24 @@ screen_line(
 			      off_to + char_cells, endcol - col - char_cells);
 
 #ifdef FEAT_GUI
+# ifdef FEAT_GUI_MSWIN
+	changed_this = changed_next;
+	changed_next = redraw_next;
+# endif
 	// If the next character was bold, then redraw the current character to
 	// remove any pixels that might have spilt over into us.  This only
 	// happens in the GUI.
+	// With MS-Windows antialiasing may also cause pixels to spill over
+	// from a previous character, no matter attributes, always redraw if a
+	// character changed.
 	if (redraw_next && gui.in_use)
 	{
+# ifndef FEAT_GUI_MSWIN
 	    hl = ScreenAttrs[off_to + char_cells];
 	    if (hl > HL_ALL)
 		hl = syn_attr2attr(hl);
 	    if (hl & HL_BOLD)
+# endif
 		redraw_this = TRUE;
 	}
 #endif
@@ -689,6 +705,12 @@ screen_line(
 		    redraw_next = TRUE;
 	    }
 #endif
+#ifdef FEAT_GUI_MSWIN
+	    // MS-Windows antialiasing may spill over to the next character,
+	    // redraw that one if this one changed, no matter attributes.
+	    if (gui.in_use && changed_this)
+		redraw_next = TRUE;
+#endif
 	    ScreenAttrs[off_to] = ScreenAttrs[off_from];
 
 	    // For simplicity set the attributes of second half of a
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    720,
+/**/
     719,
 /**/
     718,