From 4d6e81995c424e3a6e7b6c53258a031fe3fe3aff Mon Sep 17 00:00:00 2001 From: Jason Rumney Date: Thu, 24 Jan 2002 20:41:46 +0000 Subject: [PATCH] (x_scroll_run): Use ScrollWindowEx in place of BitBlt. If region left to draw is not what was expected, mark the frame as garbaged. --- src/w32term.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/w32term.c b/src/w32term.c index b7b2c96e553..119e77b2a73 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -5453,7 +5453,8 @@ x_scroll_run (w, run) { 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 @@ x_scroll_run (w, run) height = bottom_y - from_y; else height = run->height; + expect_dirty = CreateRectRgn (x, y + height, x + width, bottom_y); } else { @@ -5483,6 +5485,7 @@ x_scroll_run (w, run) height = bottom_y - to_y; else height = run->height; + expect_dirty = CreateRectRgn (x, y, x + width, to_y); } BLOCK_INPUT; @@ -5491,10 +5494,32 @@ x_scroll_run (w, run) 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 @@ x_make_frame_visible (f) 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); } -- 2.39.5