home *** CD-ROM | disk | FTP | other *** search
- To: vim-dev@vim.org
- Subject: Patch 5.6.060
- Fcc: outbox
- From: Bram Moolenaar <Bram@moolenaar.net>
- ------------
-
- Patch 5.6.060
- Problem: Some bold characters spill over the the cell on the left, that
- spill-over can remain sometimes.
- Solution: Redraw a characters when the next character was bold and needs
- redrawing. (Robert Webb)
- Files: src/screen.c
-
-
- *** ../vim-5.6.59/src/screen.c Tue Apr 4 20:52:36 2000
- --- src/screen.c Wed Apr 5 16:17:34 2000
- ***************
- *** 67,72 ****
- --- 67,73 ----
-
- static void win_update __ARGS((WIN *wp));
- static int win_line __ARGS((WIN *, linenr_t, int, int));
- + static int char_needs_redraw __ARGS((char_u *screenp_from, char_u *screenp_to, int len));
- #ifdef RIGHTLEFT
- static void screen_line __ARGS((int row, int endcol, int clear_rest, int rlflag));
- #define SCREEN_LINE(r, e, c, rl) screen_line((r), (e), (c), (rl))
- ***************
- *** 1875,1880 ****
- --- 1876,1908 ----
- }
-
- /*
- + * Check whether the given character needs redrawing:
- + * - the (first byte of the) character is different
- + * - the attributes are different
- + * - the character is multi-byte and the next byte is different
- + */
- + static int
- + char_needs_redraw(screenp_from, screenp_to, len)
- + char_u *screenp_from;
- + char_u *screenp_to;
- + int len;
- + {
- + if (len > 0
- + && ((*screenp_from != *screenp_to
- + || *(screenp_from + Columns) != *(screenp_to + Columns))
- +
- + #ifdef MULTI_BYTE
- + || (is_dbcs
- + && len > 1
- + && *(screenp_from + 1) != *(screenp_to + 1)
- + && IsLeadByte(*screenp_from))
- + #endif
- + ))
- + return TRUE;
- + return FALSE;
- + }
- +
- + /*
- * Move one "cooked" screen line to the screen, but only the characters that
- * have actually changed. Handle insert/delete character.
- * 'endcol' gives the columns where valid characters are.
- ***************
- *** 1899,1909 ****
- char_u *screenp_from;
- char_u *screenp_to;
- int col = 0;
- int force = FALSE; /* force update rest of the line */
- #ifdef MULTI_BYTE
- int char_bytes; /* 1 : if normal char */
- /* 2 : if DBCS char */
- ! int need_update; /* bool variable */
- #endif
-
- screenp_from = current_LinePointer;
- --- 1927,1942 ----
- char_u *screenp_from;
- char_u *screenp_to;
- int col = 0;
- + int hl;
- int force = FALSE; /* force update rest of the line */
- + int redraw_this; /* bool: does character need redraw? */
- + int redraw_next; /* redraw_this for next character */
- #ifdef MULTI_BYTE
- int char_bytes; /* 1 : if normal char */
- /* 2 : if DBCS char */
- ! # define CHAR_BYTES char_bytes
- ! #else
- ! # define CHAR_BYTES 1
- #endif
-
- screenp_from = current_LinePointer;
- ***************
- *** 1926,1975 ****
- col = endcol + 1;
- screenp_to = LinePointers[row] + col;
- screenp_from += col;
- }
-
- - while (rlflag ? (col < Columns) : (col < endcol))
- - #else
- while (col < endcol)
- - #endif
- {
- #ifdef MULTI_BYTE
- ! if (is_dbcs && IsLeadByte(*screenp_from) && (col + 1 < endcol))
- ! {
- char_bytes = 2;
- - if ( force
- - || *screenp_from != *screenp_to
- - || *(screenp_from + 1) != *(screenp_to + 1)
- - || *(screenp_from + Columns) != *(screenp_to + Columns)
- - )
- - need_update = TRUE;
- - else
- - need_update = FALSE;
- - }
- else
- - {
- char_bytes = 1;
- - if ( force
- - || *screenp_from != *screenp_to
- - || *(screenp_from + Columns) != *(screenp_to + Columns)
- - )
- - need_update = TRUE;
- - else
- - need_update = FALSE;
- - }
- #endif
-
- ! if (
- ! #if defined(MULTI_BYTE)
- ! need_update
- ! #else
- ! force
- ! || *screenp_from != *screenp_to
- ! || *(screenp_from + Columns) != *(screenp_to + Columns)
- ! #endif
- ! )
- {
-
- /*
- * Special handling when 'xs' termcap flag set (hpterm):
- * Attributes for characters are stored at the position where the
- --- 1959,1999 ----
- col = endcol + 1;
- screenp_to = LinePointers[row] + col;
- screenp_from += col;
- +
- + endcol = Columns;
- }
- + #endif /* RIGHTLEFT */
- +
- + redraw_next = char_needs_redraw(screenp_from, screenp_to, endcol - col);
-
- while (col < endcol)
- {
- #ifdef MULTI_BYTE
- ! if (is_dbcs && (col + 1 < endcol) && IsLeadByte(*screenp_from))
- char_bytes = 2;
- else
- char_bytes = 1;
- #endif
-
- ! redraw_this = redraw_next;
- ! redraw_next = force || char_needs_redraw(screenp_from + CHAR_BYTES,
- ! screenp_to + CHAR_BYTES, endcol - col - CHAR_BYTES);
- !
- ! #ifdef USE_GUI
- ! /* 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.
- ! */
- ! if (redraw_next && gui.in_use)
- {
- + hl = *(screenp_to + CHAR_BYTES + Columns);
- + if (hl > HL_ALL || (hl & HL_BOLD))
- + redraw_this = TRUE;
- + }
- + #endif
-
- + if (redraw_this)
- + {
- /*
- * Special handling when 'xs' termcap flag set (hpterm):
- * Attributes for characters are stored at the position where the
- ***************
- *** 1997,2002 ****
- --- 2021,2027 ----
- out_str(T_CE); /* clear rest of this screen line */
- screen_start(); /* don't know where cursor is now */
- force = TRUE; /* force redraw of rest of the line */
- + redraw_next = TRUE; /* or else next char would miss out */
-
- /*
- * If the previous character was highlighted, need to stop
- ***************
- *** 2014,2027 ****
- #ifdef MULTI_BYTE
- if (is_dbcs)
- {
- ! /* The trick to make a force update */
- ! if (!IsLeadByte(*screenp_from) && IsLeadByte(*screenp_to))
- ! *(screenp_to + 1) = 0;
- ! else if ((char_bytes == 2)
- ! && mb_isbyte1(LinePointers[row], col + 1))
- {
- *(screenp_to + 1) = 0;
- *(screenp_to + 2) = 0;
- }
- }
- #endif
- --- 2039,2059 ----
- #ifdef MULTI_BYTE
- if (is_dbcs)
- {
- ! if (char_bytes == 1 && col + 1 < endcol
- ! && IsLeadByte(*screenp_to))
- {
- + /* When: !DBCS(*screenp_from) && DBCS(*screenp_to) */
- *(screenp_to + 1) = 0;
- + redraw_next = TRUE;
- + }
- + else if (char_bytes == 2 && col + 2 < endcol
- + && !IsLeadByte(*screenp_to)
- + && IsLeadByte(*(screenp_to + 1)))
- + {
- + /* When: DBCS(*screenp_from) && DBCS(*screenp_to+1) */
- + /* *(screenp_to + 1) = 0; redundant code */
- *(screenp_to + 2) = 0;
- + redraw_next = TRUE;
- }
- }
- #endif
- ***************
- *** 2049,2069 ****
- # endif
- )
- {
- ! int n;
- !
- ! n = *(screenp_to + Columns);
- ! # ifdef MULTI_BYTE
- ! if (col + char_bytes < Columns && (n > HL_ALL || (n & HL_BOLD)))
- ! *(screenp_to + char_bytes) = 0;
- ! # else
- ! if (col + 1 < Columns && (n > HL_ALL || (n & HL_BOLD)))
- ! *(screenp_to + 1) = 0;
- ! # endif
- }
- #endif
- *(screenp_to + Columns) = *(screenp_from + Columns);
- #ifdef MULTI_BYTE
- ! if (char_bytes == 2) /* just a hack */
- *(screenp_to + Columns + 1) = *(screenp_from + Columns);
- screen_char_n(screenp_to, char_bytes, row, col);
- #else
- --- 2081,2095 ----
- # endif
- )
- {
- ! hl = *(screenp_to + Columns);
- ! if (hl > HL_ALL || (hl & HL_BOLD))
- ! redraw_next = TRUE;
- }
- #endif
- *(screenp_to + Columns) = *(screenp_from + Columns);
- #ifdef MULTI_BYTE
- ! /* just a hack: It makes two bytes of DBCS have same attributes */
- ! if (char_bytes == 2)
- *(screenp_to + Columns + 1) = *(screenp_from + Columns);
- screen_char_n(screenp_to, char_bytes, row, col);
- #else
- ***************
- *** 2090,2104 ****
- }
- }
-
- ! #ifdef MULTI_BYTE
- ! screenp_to += char_bytes;
- ! screenp_from += char_bytes;
- ! col += char_bytes;
- ! #else
- ! ++screenp_to;
- ! ++screenp_from;
- ! ++col;
- ! #endif
- }
-
- if (clear_rest
- --- 2116,2124 ----
- }
- }
-
- ! screenp_to += CHAR_BYTES;
- ! screenp_from += CHAR_BYTES;
- ! col += CHAR_BYTES;
- }
-
- if (clear_rest
- *** ../vim-5.6.59/src/version.c Wed Apr 5 16:30:51 2000
- --- src/version.c Wed Apr 5 16:31:16 2000
- ***************
- *** 420,421 ****
- --- 420,423 ----
- { /* Add new patch number below this line */
- + /**/
- + 60,
- /**/
-
- --
- SECOND SOLDIER: It could be carried by an African swallow!
- FIRST SOLDIER: Oh yes! An African swallow maybe ... but not a European
- swallow. that's my point.
- "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
-
- /-/-- Bram Moolenaar --- Bram@moolenaar.net --- http://www.moolenaar.net --\-\
- \-\-- Vim: http://www.vim.org ---- ICCF Holland: http://www.vim.org/iccf --/-/
-