Author: jgardou
Date: Fri Jul 25 10:56:50 2014
New Revision: 63735

URL: http://svn.reactos.org/svn/reactos?rev=63735&view=rev
Log:
[WIN32K]
 - Improve parameter checking in NtGdiExtSelectClipRgn
 - Update the DC clipping regions before getting the clipbox

Modified:
    trunk/reactos/win32ss/gdi/ntgdi/cliprgn.c

Modified: trunk/reactos/win32ss/gdi/ntgdi/cliprgn.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/cliprgn.c?rev=63735&r1=63734&r2=63735&view=diff
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/cliprgn.c   [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/cliprgn.c   [iso-8859-1] Fri Jul 25 
10:56:50 2014
@@ -44,9 +44,9 @@
     PREGION prgn,
     int fnMode)
 {
-    if (!prgn)
-    {
-        if (fnMode == RGN_COPY)
+    if (fnMode == RGN_COPY)
+    {
+        if (!prgn)
         {
             if (dc->dclevel.prgnClip != NULL)
             {
@@ -56,12 +56,14 @@
             }
             return SIMPLEREGION;
         }
-        else
-        {
-            EngSetLastError(ERROR_INVALID_PARAMETER);
-            return ERROR;
-        }
-    }
+
+        if (!dc->dclevel.prgnClip)
+            dc->dclevel.prgnClip = IntSysCreateRectpRgn(0, 0, 0, 0);
+
+        return IntGdiCombineRgn(dc->dclevel.prgnClip, prgn, NULL, RGN_COPY);
+    }
+
+    ASSERT(prgn != NULL);
 
     if (!dc->dclevel.prgnClip)
     {
@@ -72,9 +74,6 @@
     }
 
     dc->fs |= DC_FLAG_DIRTY_RAO;
-
-    if(fnMode == RGN_COPY)
-        return IntGdiCombineRgn(dc->dclevel.prgnClip, prgn, 0, fnMode);
 
     return IntGdiCombineRgn(dc->dclevel.prgnClip, dc->dclevel.prgnClip, prgn, 
fnMode);
 }
@@ -99,8 +98,15 @@
 
     prgn = REGION_LockRgn(hrgn);
 
-    /* IntGdiExtSelectClipRgn takes care of checking for NULL region */
-    retval = IntGdiExtSelectClipRgn(dc, prgn, fnMode);
+    if ((prgn == NULL) && (fnMode != RGN_COPY))
+    {
+        EngSetLastError(ERROR_INVALID_HANDLE);
+        retval = ERROR;
+    }
+    else
+    {
+        retval = IntGdiExtSelectClipRgn(dc, prgn, fnMode);
+    }
 
     if (prgn)
         REGION_UnlockRgn(prgn);
@@ -120,6 +126,9 @@
    {
       return ERROR;
    }
+
+   if (dc->fs & DC_FLAG_DIRTY_RAO)
+       CLIPPING_UpdateGCRegion(dc);
 
    /* FIXME: Rao and Vis only! */
    if (dc->prgnAPI) // APIRGN


Reply via email to