[Win32SS]
authorJames Tabor <james.tabor@reactos.org>
Wed, 22 Feb 2017 17:50:38 +0000 (17:50 +0000)
committerJames Tabor <james.tabor@reactos.org>
Wed, 22 Feb 2017 17:50:38 +0000 (17:50 +0000)
- Implement Exclude Update Region, for testing. See CORE-12649.

svn path=/trunk/; revision=73888

reactos/win32ss/include/ntuser.h
reactos/win32ss/user/ntuser/ntstubs.c
reactos/win32ss/user/ntuser/painting.c

index 6d30501..af74bf2 100644 (file)
@@ -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,
index a044232..9fb372d 100644 (file)
@@ -104,17 +104,6 @@ NtUserEvent(
    return 0;
 }
 
-DWORD
-APIENTRY
-NtUserExcludeUpdateRgn(
-  HDC hDC,
-  HWND hWnd)
-{
-   STUB
-
-   return 0;
-}
-
 BOOL
 APIENTRY
 NtUserGetAltTabInfo(
index 6e2f432..b6db671 100644 (file)
@@ -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(