From: James Tabor Date: Wed, 22 Feb 2017 17:50:38 +0000 (+0000) Subject: [Win32SS] X-Git-Tag: ReactOS-0.4.4-CLT2017~202 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=81652fd827a4997c2461e7d13a1baacecfb3ad35 [Win32SS] - Implement Exclude Update Region, for testing. See CORE-12649. svn path=/trunk/; revision=73888 --- diff --git a/reactos/win32ss/include/ntuser.h b/reactos/win32ss/include/ntuser.h index 6d305010a26..af74bf270b6 100644 --- a/reactos/win32ss/include/ntuser.h +++ b/reactos/win32ss/include/ntuser.h @@ -2063,7 +2063,7 @@ NTAPI NtUserEvent( DWORD Unknown0); -DWORD +INT NTAPI NtUserExcludeUpdateRgn( HDC hDC, @@ -2470,7 +2470,7 @@ NtUserGetUpdateRect( LPRECT lpRect, BOOL fErase); -int +INT NTAPI NtUserGetUpdateRgn( HWND hWnd, diff --git a/reactos/win32ss/user/ntuser/ntstubs.c b/reactos/win32ss/user/ntuser/ntstubs.c index a044232a744..9fb372d6d41 100644 --- a/reactos/win32ss/user/ntuser/ntstubs.c +++ b/reactos/win32ss/user/ntuser/ntstubs.c @@ -104,17 +104,6 @@ NtUserEvent( return 0; } -DWORD -APIENTRY -NtUserExcludeUpdateRgn( - HDC hDC, - HWND hWnd) -{ - STUB - - return 0; -} - BOOL APIENTRY NtUserGetAltTabInfo( diff --git a/reactos/win32ss/user/ntuser/painting.c b/reactos/win32ss/user/ntuser/painting.c index 6e2f4326d45..b6db6716005 100644 --- a/reactos/win32ss/user/ntuser/painting.c +++ b/reactos/win32ss/user/ntuser/painting.c @@ -2473,6 +2473,81 @@ NtUserDrawCaption(HWND hWnd, return NtUserDrawCaptionTemp(hWnd, hDC, lpRc, 0, 0, NULL, uFlags); } +INT FASTCALL +co_UserExcludeUpdateRgn(HDC hDC, PWND Window) +{ + POINT pt; + RECT rc; + + if (Window->hrgnUpdate) + { + if (Window->hrgnUpdate == HRGN_WINDOW) + { + return NtGdiIntersectClipRect(hDC, 0, 0, 0, 0); + } + else + { + INT ret = ERROR; + HRGN hrgn = NtGdiCreateRectRgn(0,0,0,0); + + if ( hrgn && GreGetDCPoint( hDC, GdiGetDCOrg, &pt) ) + { + if ( NtGdiGetRandomRgn( hDC, hrgn, CLIPRGN) == NULLREGION ) + { + NtGdiOffsetRgn(hrgn, pt.x, pt.y); + } + else + { + HRGN hrgnScreen; + PMONITOR pm = UserGetPrimaryMonitor(); + hrgnScreen = NtGdiCreateRectRgn(0,0,0,0); + NtGdiCombineRgn(hrgnScreen, hrgnScreen, pm->hrgnMonitor, RGN_OR); + + NtGdiCombineRgn(hrgn, hrgnScreen, NULL, RGN_COPY); + + GreDeleteObject(hrgnScreen); + } + + NtGdiCombineRgn(hrgn, hrgn, Window->hrgnUpdate, RGN_DIFF); + + NtGdiOffsetRgn(hrgn, -pt.x, -pt.y); + + ret = NtGdiExtSelectClipRgn(hDC, hrgn, RGN_COPY); + + GreDeleteObject(hrgn); + } + return ret; + } + } + else + { + return GdiGetClipBox( hDC, &rc); + } +} + +INT +APIENTRY +NtUserExcludeUpdateRgn( + HDC hDC, + HWND hWnd) +{ + INT ret = ERROR; + PWND pWnd; + + TRACE("Enter NtUserExcludeUpdateRgn\n"); + UserEnterExclusive(); + + pWnd = UserGetWindowObject(hWnd); + + if (hDC && pWnd) + ret = co_UserExcludeUpdateRgn(hDC, pWnd); + + TRACE("Leave NtUserExcludeUpdateRgn, ret=%i\n", ret); + + UserLeave(); + return ret; +} + BOOL APIENTRY NtUserInvalidateRect(