diff src/w32term.c @ 42934:b3ee5e92548a

(x_scroll_run): Use ScrollWindowEx in place of BitBlt. If region left to draw is not what was expected, mark the frame as garbaged.
author Jason Rumney <jasonr@gnu.org>
date Thu, 24 Jan 2002 20:41:46 +0000
parents 2a546583564f
children 49ffe8f5efb6
line wrap: on
line diff
--- a/src/w32term.c	Thu Jan 24 19:20:21 2002 +0000
+++ b/src/w32term.c	Thu Jan 24 20:41:46 2002 +0000
@@ -5453,7 +5453,8 @@
 {
   struct frame *f = XFRAME (w->frame);
   int x, y, width, height, from_y, to_y, bottom_y;
-  HDC hdc = get_frame_dc (f);
+  HWND hwnd = FRAME_W32_WINDOW (f);
+  HRGN expect_dirty;
 
   /* Get frame-relative bounding box of the text display area of W,
      without mode lines.  Include in this box the left and right
@@ -5474,6 +5475,7 @@
 	height = bottom_y - from_y;
       else
 	height = run->height;
+      expect_dirty = CreateRectRgn (x, y + height, x + width, bottom_y);
     }
   else
     {
@@ -5483,6 +5485,7 @@
 	height = bottom_y - to_y;
       else
 	height = run->height;
+      expect_dirty = CreateRectRgn (x, y, x + width, to_y);
     }
 
   BLOCK_INPUT;
@@ -5491,10 +5494,32 @@
   updated_window = w;
   x_clear_cursor (w);
 
-  BitBlt (hdc, x, to_y, width, height, hdc, x, from_y, SRCCOPY);
-  
+  {
+    RECT from;
+    RECT to;
+    HRGN dirty = CreateRectRgn (0, 0, 0, 0);
+    HRGN combined = CreateRectRgn (0, 0, 0, 0);
+
+    from.left = to.left = x;
+    from.right = to.right = x + width;
+    from.top = from_y;
+    from.bottom = from_y + height;
+    to.top = y;
+    to.bottom = bottom_y;
+
+    ScrollWindowEx (hwnd, 0, to_y - from_y, &from, &to, dirty,
+		    NULL, SW_INVALIDATE);
+
+    /* Combine this with what we expect to be dirty. This covers the
+       case where not all of the region we expect is actually dirty.  */
+    CombineRgn (combined, dirty, expect_dirty, RGN_OR);
+
+    /* If the dirty region is not what we expected, redraw the entire frame.  */
+    if (!EqualRgn (combined, expect_dirty))
+      SET_FRAME_GARBAGED (f);
+  }
+
   UNBLOCK_INPUT;
-  release_frame_dc (f, hdc);
 }
 
 
@@ -10464,7 +10489,7 @@
 
       f->output_data.w32->asked_for_visible = 1;
 
-//      my_show_window (f, FRAME_W32_WINDOW (f), f->async_iconified ? SW_RESTORE : SW_SHOW);
+/*      my_show_window (f, FRAME_W32_WINDOW (f), f->async_iconified ? SW_RESTORE : SW_SHOW);  */
       my_show_window (f, FRAME_W32_WINDOW (f), SW_SHOWNORMAL);
     }