Rein Klazes : x11drv: Do not use the scroll rectangle for clipping in
ScrollDC.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Dec 19 03:22:37 CST 2005
Module: wine
Branch: refs/heads/master
Commit: 3df678a5afcb54bcd6b92ba14227c7a5b44bef73
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=3df678a5afcb54bcd6b92ba14227c7a5b44bef73
Author: Rein Klazes <wijn at wanadoo.nl>
Date: Mon Dec 19 09:53:04 2005 +0100
x11drv: Do not use the scroll rectangle for clipping in ScrollDC.
With a conformance test.
---
dlls/user/tests/win.c | 17 ++++++++++++++++-
dlls/x11drv/scroll.c | 44 +++++++++++++++++++++-----------------------
2 files changed, 37 insertions(+), 24 deletions(-)
diff --git a/dlls/user/tests/win.c b/dlls/user/tests/win.c
index 447ca34..6cef7a9 100644
--- a/dlls/user/tests/win.c
+++ b/dlls/user/tests/win.c
@@ -2954,7 +2954,7 @@ static void test_scrolldc( HWND parent)
ScrollDC( hdc, 5, -20, &rc, &cliprc, hrgn, &rcu);
colr = GetPixel( hdc, (rc.left+rc.right)/2, ( rc.top + rc.bottom) /2 - 1);
ok ( colr == 0, "pixel should be black, color is %08lx\n", colr);
-
+ /* test with NULL clip rect */
ScrollDC( hdc, 20, -20, &rc, NULL, hrgn, &rcu);
/*FillRgn(hdc, hrgn, GetStockObject(WHITE_BRUSH));*/
trace("update rect: %ld,%ld - %ld,%ld\n",
@@ -2969,6 +2969,21 @@ static void test_scrolldc( HWND parent)
CombineRgn(exprgn, exprgn, tmprgn, RGN_OR);
if (winetest_debug > 0) dump_region(exprgn);
ok(EqualRgn(exprgn, hrgn), "wrong update region\n");
+ /* test clip rect > scroll rect */
+ FillRect( hdc, &rc, GetStockObject(WHITE_BRUSH));
+ rc2=rc;
+ InflateRect( &rc2, -(rc.right-rc.left)/4, -(rc.bottom-rc.top)/4);
+ FillRect( hdc, &rc2, GetStockObject(BLACK_BRUSH));
+ ScrollDC( hdc, 10, 10, &rc2, &rc, hrgn, &rcu);
+ SetRectRgn( exprgn, 25, 25, 75, 35);
+ SetRectRgn( tmprgn, 25, 35, 35, 75);
+ CombineRgn(exprgn, exprgn, tmprgn, RGN_OR);
+ ok(EqualRgn(exprgn, hrgn), "wrong update region\n");
+ colr = GetPixel( hdc, 80, 80);
+ ok ( colr == 0, "pixel should be black, color is %08lx\n", colr);
+ trace("update rect: %ld,%ld - %ld,%ld\n",
+ rcu.left, rcu.top, rcu.right, rcu.bottom);
+ if (winetest_debug > 0) dump_region(hrgn);
/* clean up */
DeleteObject(hrgn);
diff --git a/dlls/x11drv/scroll.c b/dlls/x11drv/scroll.c
index e0c2f83..cf80870 100644
--- a/dlls/x11drv/scroll.c
+++ b/dlls/x11drv/scroll.c
@@ -91,34 +91,21 @@ BOOL X11DRV_ScrollDC( HDC hdc, INT dx, I
} else
CombineRgn( visrgn, visrgn, clipRgn, RGN_AND);
/* only those pixels in the scroll rectangle that remain in the clipping
- * rect are scrolled. So first combine Scroll and Clipping rectangles,
- * if available */
- if( lprcScroll)
- {
- if( lprcClip)
- IntersectRect( &rcClip, lprcClip, lprcScroll);
- else
- rcClip = *lprcScroll;
- }
+ * rect are scrolled. */
+ if( lprcClip)
+ rcClip = *lprcClip;
else
- {
- if( lprcClip)
- rcClip = *lprcClip;
- else
- GetClipBox( hdc, &rcClip);
- }
- /* Then clip again to get the source rectangle that will remain in the
- * clipping rect */
+ GetClipBox( hdc, &rcClip);
rcSrc = rcClip;
- if (lprcClip)
- {
- OffsetRect( &rcSrc, -dx, -dy);
- IntersectRect( &rcSrc, &rcSrc, &rcClip);
- }
+ OffsetRect( &rcClip, -dx, -dy);
+ IntersectRect( &rcSrc, &rcSrc, &rcClip);
+ /* if an scroll rectangle is specified, only the pixels within that
+ * rectangle are scrolled */
+ if( lprcScroll)
+ IntersectRect( &rcSrc, &rcSrc, lprcScroll);
/* now convert to device coordinates */
LPtoDP(hdc, (LPPOINT)&rcSrc, 2);
TRACE("source rect: %s\n", wine_dbgstr_rect(&rcSrc));
-
/* also dx and dy */
SetRect(&offset, 0, 0, dx, dy);
LPtoDP(hdc, (LPPOINT)&offset, 2);
@@ -160,6 +147,17 @@ BOOL X11DRV_ScrollDC( HDC hdc, INT dx, I
code = X11DRV_END_EXPOSURES;
ExtEscape( hdc, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code,
sizeof(ExpRgn), (LPSTR)&ExpRgn );
+ /* Intersect clip and scroll rectangles, allowing NULL values */
+ if( lprcScroll)
+ if( lprcClip)
+ IntersectRect( &rcClip, lprcClip, lprcScroll);
+ else
+ rcClip = *lprcScroll;
+ else
+ if( lprcClip)
+ rcClip = *lprcClip;
+ else
+ GetClipBox( hdc, &rcClip);
/* Convert the combined clip rectangle to device coordinates */
LPtoDP(hdc, (LPPOINT)&rcClip, 2);
if( hrgn )
More information about the wine-cvs
mailing list