Dylan Smith : wordpad: Avoid filling overlapping rectangles in print preview.

Alexandre Julliard julliard at winehq.org
Tue Jul 20 11:20:31 CDT 2010


Module: wine
Branch: master
Commit: 9de8357965e68a04290763db0d528cd3c21ffac1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9de8357965e68a04290763db0d528cd3c21ffac1

Author: Dylan Smith <dylan.ah.smith at gmail.com>
Date:   Mon Jul 19 18:21:07 2010 -0400

wordpad: Avoid filling overlapping rectangles in print preview.

This reduces the amount of flicker seen from redrawing the window.

---

 programs/wordpad/print.c |   48 +++++++++++++++++++++++++++++++++------------
 1 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/programs/wordpad/print.c b/programs/wordpad/print.c
index e77a596..7761c32 100644
--- a/programs/wordpad/print.c
+++ b/programs/wordpad/print.c
@@ -845,33 +845,46 @@ static void update_preview_buttons(HWND hMainWnd)
 
 static LRESULT print_preview(HWND hwndPreview)
 {
+    HPEN hPen, oldPen;
     HDC hdc;
+    HRGN back_rgn, excl_rgn;
     RECT window, background;
     PAINTSTRUCT ps;
     int x, y;
 
     hdc = BeginPaint(hwndPreview, &ps);
     GetClientRect(hwndPreview, &window);
-
-    FillRect(hdc, &window, GetStockObject(GRAY_BRUSH));
+    back_rgn = CreateRectRgnIndirect(&window);
 
     x = preview.spacing.cx - GetScrollPos(hwndPreview, SB_HORZ);
     y = preview.spacing.cy - GetScrollPos(hwndPreview, SB_VERT);
 
+    /* draw page outlines */
+    hPen = CreatePen(PS_SOLID|PS_INSIDEFRAME, 2, RGB(0,0,0));
+    oldPen = SelectObject(hdc, hPen);
     background.left = x - 2;
-    background.right = background.left + preview.bmScaledSize.cx + 4;
+    background.right = x + preview.bmScaledSize.cx + 2;
     background.top = y - 2;
-    background.bottom = background.top + preview.bmScaledSize.cy + 4;
-
-    FillRect(hdc, &background, GetStockObject(BLACK_BRUSH));
-
+    background.bottom = y + preview.bmScaledSize.cy + 2;
+    Rectangle(hdc, background.left, background.top,
+              background.right, background.bottom);
+    excl_rgn = CreateRectRgnIndirect(&background);
+    CombineRgn(back_rgn, back_rgn, excl_rgn, RGN_DIFF);
     if(preview.pages_shown > 1)
     {
         background.left += preview.bmScaledSize.cx + preview.spacing.cx;
         background.right += preview.bmScaledSize.cx + preview.spacing.cx;
-
-        FillRect(hdc, &background, GetStockObject(BLACK_BRUSH));
+        Rectangle(hdc, background.left, background.top,
+                  background.right, background.bottom);
+        SetRectRgn(excl_rgn, background.left, background.top,
+                   background.right, background.bottom);
+        CombineRgn(back_rgn, back_rgn, excl_rgn, RGN_DIFF);
     }
+    SelectObject(hdc, oldPen);
+    DeleteObject(hPen);
+    FillRgn(hdc, back_rgn, GetStockObject(GRAY_BRUSH));
+    DeleteObject(excl_rgn);
+    DeleteObject(back_rgn);
 
     StretchBlt(hdc, x, y, preview.bmScaledSize.cx, preview.bmScaledSize.cy,
                preview.hdc, 0, 0, preview.bmSize.cx, preview.bmSize.cy, SRCCOPY);
@@ -880,12 +893,21 @@ static LRESULT print_preview(HWND hwndPreview)
 
     if(preview.pages_shown > 1)
     {
-        x += preview.spacing.cx + preview.bmScaledSize.cx;
-        StretchBlt(hdc, x, y, preview.bmScaledSize.cx, preview.bmScaledSize.cy,
-                   preview.hdc2, 0, 0, preview.bmSize.cx, preview.bmSize.cy, SRCCOPY);
+        if (!is_last_preview_page(preview.page)) {
+            x += preview.spacing.cx + preview.bmScaledSize.cx;
+            StretchBlt(hdc, x, y,
+                       preview.bmScaledSize.cx, preview.bmScaledSize.cy,
+                       preview.hdc2, 0, 0,
+                       preview.bmSize.cx, preview.bmSize.cy, SRCCOPY);
 
-        if (!is_last_preview_page(preview.page))
             draw_margin_lines(hdc, x, y, preview.zoomratio);
+        } else {
+            background.left += 2;
+            background.right -= 2;
+            background.top += 2;
+            background.bottom -= 2;
+            FillRect(hdc, &background, GetStockObject(WHITE_BRUSH));
+        }
     }
 
     preview.window = window;




More information about the wine-cvs mailing list