- Intersect the paint rectangle in NtUserBeginPaint with the client
window rectangle.
- Fix the data returned by co_UserGetUpdateRgn and NtUserGetUpdateRect.
Modified: trunk/reactos/subsys/win32k/ntuser/painting.c
_____
Modified: trunk/reactos/subsys/win32k/ntuser/painting.c
--- trunk/reactos/subsys/win32k/ntuser/painting.c 2005-09-25
11:05:00 UTC (rev 18045)
+++ trunk/reactos/subsys/win32k/ntuser/painting.c 2005-09-25
11:16:54 UTC (rev 18046)
@@ -755,7 +755,7 @@
Ps.hdc = UserGetDCEx(Window, Window->UpdateRegion, DCX_INTERSECTRGN
| DCX_USESTYLE);
if (!Ps.hdc)
{
- RETURN( NULL);
+ RETURN(NULL);
}
if (Window->UpdateRegion != NULL)
@@ -766,6 +766,7 @@
{
UnsafeIntGetRgnBox(Rgn, &Ps.rcPaint);
RGNDATA_UnlockRgn(Rgn);
+ IntGdiIntersectRect(&Ps.rcPaint, &Ps.rcPaint,
&Window->ClientRect);
IntGdiOffsetRect(&Ps.rcPaint,
-Window->ClientRect.left,
-Window->ClientRect.top);
@@ -801,10 +802,10 @@
if (! NT_SUCCESS(Status))
{
SetLastNtError(Status);
- RETURN( NULL);
+ RETURN(NULL);
}
- RETURN( Ps.hdc);
+ RETURN(Ps.hdc);
CLEANUP:
if (Window) UserDerefObjectCo(Window);
@@ -855,6 +856,7 @@
co_UserGetUpdateRgn(PWINDOW_OBJECT Window, HRGN hRgn, BOOL bErase)
{
int RegionType;
+ RECT Rect;
ASSERT_REFS_CO(Window);
@@ -864,7 +866,10 @@
}
else
{
- RegionType = NtGdiCombineRgn(hRgn, Window->UpdateRegion, hRgn,
RGN_COPY);
+ Rect = Window->ClientRect;
+ IntIntersectWithParents(Window, &Rect);
+ NtGdiSetRectRgn(hRgn, Rect.left, Rect.top, Rect.right,
Rect.bottom);
+ RegionType = NtGdiCombineRgn(hRgn, hRgn, Window->UpdateRegion,
RGN_AND);
NtGdiOffsetRgn(hRgn, -Window->ClientRect.left,
-Window->ClientRect.top);
}
@@ -875,6 +880,7 @@
return RegionType;
}
+
/*
* NtUserGetUpdateRgn
*
@@ -923,7 +929,6 @@
RECT Rect;
INT RegionType;
PROSRGNDATA RgnData;
- BOOL AlwaysPaint;
NTSTATUS Status;
DECLARE_RETURN(BOOL);
@@ -932,7 +937,7 @@
if (!(Window = UserGetWindowObject(hWnd)))
{
- RETURN( ERROR);
+ RETURN(FALSE);
}
if (Window->UpdateRegion == NULL)
@@ -941,16 +946,34 @@
}
else
{
- RgnData = RGNDATA_LockRgn(Window->UpdateRegion);
- ASSERT(RgnData != NULL);
- RegionType = UnsafeIntGetRgnBox(RgnData, &Rect);
- ASSERT(RegionType != ERROR);
- RGNDATA_UnlockRgn(RgnData);
+ /* Get the update region bounding box. */
+ if (Window->UpdateRegion == (HRGN)1)
+ {
+ Rect = Window->ClientRect;
+ }
+ else
+ {
+ RgnData = RGNDATA_LockRgn(Window->UpdateRegion);
+ ASSERT(RgnData != NULL);
+ RegionType = UnsafeIntGetRgnBox(RgnData, &Rect);
+ RGNDATA_UnlockRgn(RgnData);
+
+ if (RegionType != ERROR && RegionType != NULLREGION)
+ IntGdiIntersectRect(&Rect, &Rect, &Window->ClientRect);
+ }
+
+ if (IntIntersectWithParents(Window, &Rect))
+ {
+ IntGdiOffsetRect(&Rect,
+ -Window->ClientRect.left,
+ -Window->ClientRect.top);
+ } else
+ {
+ Rect.left = Rect.top = Rect.right = Rect.bottom = 0;
+ }
}
- AlwaysPaint = (Window->Flags & WINDOWOBJECT_NEED_NCPAINT) ||
- (Window->Flags & WINDOWOBJECT_NEED_INTERNALPAINT);
- if (bErase && Rect.left < Rect.right && Rect.top < Rect.bottom)
+ if (bErase && !IntGdiIsEmptyRect(&Rect))
{
UserRefObjectCo(Window);
co_UserRedrawWindow(Window, NULL, NULL, RDW_ERASENOW |
RDW_NOCHILDREN);
@@ -963,11 +986,11 @@
if (!NT_SUCCESS(Status))
{
SetLastWin32Error(ERROR_INVALID_PARAMETER);
- RETURN( FALSE);
+ RETURN(FALSE);
}
}
- RETURN( (Rect.left < Rect.right && Rect.top < Rect.bottom) ||
AlwaysPaint);
+ RETURN(Window->UpdateRegion != NULL);
CLEANUP:
DPRINT("Leave NtUserGetUpdateRect, ret=%i\n",_ret_);
@@ -1314,7 +1337,7 @@
UserDerefObjectCo(CaretWnd);
}
- RETURN( Result);
+ RETURN(Result);
CLEANUP:
if (Window)