Author: tkreuzer
Date: Thu Dec 18 08:13:14 2014
New Revision: 65739

URL: http://svn.reactos.org/svn/reactos?rev=65739&view=rev
Log:
[GDI32]
- Rename SetRectRgnEx to IntSetRectRgn and make it usermode only
- Implement IntSetNullRgn
- Improve SetRectRgn code and enable the usermode part

Modified:
    trunk/reactos/win32ss/gdi/gdi32/objects/region.c

Modified: trunk/reactos/win32ss/gdi/gdi32/objects/region.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/gdi32/objects/region.c?rev=65739&r1=65738&r2=65739&view=diff
==============================================================================
--- trunk/reactos/win32ss/gdi/gdi32/objects/region.c    [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/gdi32/objects/region.c    [iso-8859-1] Thu Dec 18 
08:13:14 2014
@@ -189,21 +189,36 @@
 
 FORCEINLINE
 ULONG
-SetRectRgnEx(
-    HRGN hrgn,
-    PRGN_ATTR prgnattr,
-    INT xLeft,
-    INT yTop,
-    INT xRight,
-    INT yBottom)
-{
-    if (!SetRectRgn(hrgn, xLeft, yTop, xRight, yBottom))
-    {
-        return ERROR;
-    }
-
-    return prgnattr->iComplexity;
-
+IntSetNullRgn(
+    _Inout_ PRGN_ATTR prgnattr)
+{
+    prgnattr->iComplexity = NULLREGION;
+    prgnattr->AttrFlags |= ATTR_RGN_DIRTY;
+    return NULLREGION;
+}
+
+FORCEINLINE
+ULONG
+IntSetRectRgn(
+    _Inout_ PRGN_ATTR prgnattr,
+    _In_ INT xLeft,
+    _In_ INT yTop,
+    _In_ INT xRight,
+    _In_ INT yBottom)
+{
+    ASSERT(xLeft <= xRight);
+    ASSERT(yTop <= yBottom);
+
+    if ((xLeft == xRight) || (yTop == yBottom))
+        return IntSetNullRgn(prgnattr);
+
+    prgnattr->iComplexity = SIMPLEREGION;
+    prgnattr->Rect.left = xLeft;
+    prgnattr->Rect.top = yTop;
+    prgnattr->Rect.right = xRight;
+    prgnattr->Rect.bottom = yBottom;
+    prgnattr->AttrFlags |= ATTR_RGN_DIRTY;
+    return SIMPLEREGION;
 }
 
 /*
@@ -240,17 +255,16 @@
         if (prngattrSrc1->iComplexity == NULLREGION)
         {
             /* The dest region is a NULLREGION, too */
-            return SetRectRgn(hrgnDest, 0, 0, 0, 0) ? NULLREGION : ERROR;
+            return IntSetNullRgn(prngattrDest);
         }
 
         /* We already know that the source region cannot be complex, so
            create a rect region from the bounds of the source rect */
-        return SetRectRgnEx(hrgnDest,
-                            prngattrDest,
-                            prngattrSrc1->Rect.left,
-                            prngattrSrc1->Rect.top,
-                            prngattrSrc1->Rect.right,
-                            prngattrSrc1->Rect.bottom);
+        return IntSetRectRgn(prngattrDest,
+                             prngattrSrc1->Rect.left,
+                             prngattrSrc1->Rect.top,
+                             prngattrSrc1->Rect.right,
+                             prngattrSrc1->Rect.bottom);
     }
 
     /* For all other operations we need hrgnSrc2 */
@@ -270,23 +284,22 @@
             (prngattrSrc2->iComplexity == NULLREGION))
         {
             /* Result is also a NULLREGION */
-            return SetRectRgn(hrgnDest, 0, 0, 0, 0) ? NULLREGION : ERROR;
+            return IntSetNullRgn(prngattrDest);
         }
 
         /* Get the intersection of the 2 rects */
         if (!IntersectRect(&rcTemp, &prngattrSrc1->Rect, &prngattrSrc2->Rect))
         {
             /* The rects do not intersect, result is a NULLREGION */
-            return SetRectRgn(hrgnDest, 0, 0, 0, 0) ? NULLREGION : ERROR;
+            return IntSetNullRgn(prngattrDest);
         }
 
         /* Use the intersection of the rects */
-        return SetRectRgnEx(hrgnDest,
-                            prngattrDest,
-                            rcTemp.left,
-                            rcTemp.top,
-                            rcTemp.right,
-                            rcTemp.bottom);
+        return IntSetRectRgn(prngattrDest,
+                             rcTemp.left,
+                             rcTemp.top,
+                             rcTemp.right,
+                             rcTemp.bottom);
     }
 
     /* Handle RGN_DIFF */
@@ -296,7 +309,7 @@
         if (prngattrSrc1->iComplexity == NULLREGION)
         {
             /* The result is a NULLREGION as well */
-            return SetRectRgn(hrgnDest, 0, 0, 0, 0) ? NULLREGION : ERROR;
+            return IntSetNullRgn(prngattrDest);
         }
 
         /* Get the intersection of the 2 rects */
@@ -304,12 +317,11 @@
             !IntersectRect(&rcTemp, &prngattrSrc1->Rect, &prngattrSrc2->Rect))
         {
             /* The rects do not intersect, dest equals source 1 */
-            return SetRectRgnEx(hrgnDest,
-                                prngattrDest,
-                                prngattrSrc1->Rect.left,
-                                prngattrSrc1->Rect.top,
-                                prngattrSrc1->Rect.right,
-                                prngattrSrc1->Rect.bottom);
+            return IntSetRectRgn(prngattrDest,
+                                 prngattrSrc1->Rect.left,
+                                 prngattrSrc1->Rect.top,
+                                 prngattrSrc1->Rect.right,
+                                 prngattrSrc1->Rect.bottom);
         }
 
         /* We need to check is whether we can subtract the rects. For that
@@ -319,7 +331,7 @@
         if (!SubtractRect(&rcTemp, &prngattrSrc1->Rect, &rcTemp))
         {
             /* The result is a NULLREGION */
-            return SetRectRgn(hrgnDest, 0, 0, 0, 0) ? NULLREGION : ERROR;
+            return IntSetNullRgn(prngattrDest);
         }
 
         /* Now check if the result of SubtractRect matches the source 1 rect.
@@ -330,12 +342,11 @@
         if (!EqualRect(&rcTemp, &prngattrSrc1->Rect))
         {
             /* We got a properly subtracted rect, so use it. */
-            return SetRectRgnEx(hrgnDest,
-                                prngattrDest,
-                                rcTemp.left,
-                                rcTemp.top,
-                                rcTemp.right,
-                                rcTemp.bottom);
+            return IntSetRectRgn(prngattrDest,
+                                 rcTemp.left,
+                                 rcTemp.top,
+                                 rcTemp.right,
+                                 rcTemp.bottom);
         }
 
         /* The result would be a complex region, go to win32k */
@@ -352,28 +363,26 @@
             if (prngattrSrc2->iComplexity == NULLREGION)
             {
                 /* Both are NULLREGIONs, result is also a NULLREGION */
-                return SetRectRgn(hrgnDest, 0, 0, 0, 0) ? NULLREGION : ERROR;
+                return IntSetNullRgn(prngattrDest);
             }
 
             /* The result is equal to source 2 */
-            return SetRectRgnEx(hrgnDest,
-                                prngattrDest,
-                                prngattrSrc2->Rect.left,
-                                prngattrSrc2->Rect.top,
-                                prngattrSrc2->Rect.right,
-                                prngattrSrc2->Rect.bottom );
+            return IntSetRectRgn(prngattrDest,
+                                 prngattrSrc2->Rect.left,
+                                 prngattrSrc2->Rect.top,
+                                 prngattrSrc2->Rect.right,
+                                 prngattrSrc2->Rect.bottom );
         }
 
         /* Check if only source 2 is a NULLREGION */
         if (prngattrSrc2->iComplexity == NULLREGION)
         {
             /* The result is equal to source 1 */
-            return SetRectRgnEx(hrgnDest,
-                                prngattrDest,
-                                prngattrSrc1->Rect.left,
-                                prngattrSrc1->Rect.top,
-                                prngattrSrc1->Rect.right,
-                                prngattrSrc1->Rect.bottom);
+            return IntSetRectRgn(prngattrDest,
+                                 prngattrSrc1->Rect.left,
+                                 prngattrSrc1->Rect.top,
+                                 prngattrSrc1->Rect.right,
+                                 prngattrSrc1->Rect.bottom);
         }
 
         /* Do the rects have the same x extent */
@@ -388,17 +397,16 @@
                 if (iCombineMode == RGN_OR)
                 {
                     /* The result is equal to source 1 */
-                    return SetRectRgnEx(hrgnDest,
-                                        prngattrDest,
-                                        prngattrSrc1->Rect.left,
-                                        prngattrSrc1->Rect.top,
-                                        prngattrSrc1->Rect.right,
-                                        prngattrSrc1->Rect.bottom );
+                    return IntSetRectRgn(prngattrDest,
+                                         prngattrSrc1->Rect.left,
+                                         prngattrSrc1->Rect.top,
+                                         prngattrSrc1->Rect.right,
+                                         prngattrSrc1->Rect.bottom );
                 }
                 else
                 {
                     /* XORing with itself yields an empty region */
-                    return SetRectRgn(hrgnDest, 0, 0, 0, 0) ? NULLREGION : 
ERROR;
+                    return IntSetNullRgn(prngattrDest);
                 }
             }
 
@@ -414,34 +422,31 @@
             if (iCombineMode == RGN_OR)
             {
                 /* Use the maximum extent of both rects combined */
-                return SetRectRgnEx(hrgnDest,
-                                    prngattrDest,
-                                    prngattrSrc1->Rect.left,
-                                    min(prngattrSrc1->Rect.top, 
prngattrSrc2->Rect.top),
-                                    prngattrSrc1->Rect.right,
-                                    max(prngattrSrc1->Rect.bottom, 
prngattrSrc2->Rect.bottom));
+                return IntSetRectRgn(prngattrDest,
+                                     prngattrSrc1->Rect.left,
+                                     min(prngattrSrc1->Rect.top, 
prngattrSrc2->Rect.top),
+                                     prngattrSrc1->Rect.right,
+                                     max(prngattrSrc1->Rect.bottom, 
prngattrSrc2->Rect.bottom));
             }
 
             /* Check if the rects are adjacent */
             if (prngattrSrc2->Rect.bottom == prngattrSrc1->Rect.top)
             {
                 /* The result is the combined rects */
-                return SetRectRgnEx(hrgnDest,
-                                    prngattrDest,
-                                    prngattrSrc1->Rect.left,
-                                    prngattrSrc2->Rect.top,
-                                    prngattrSrc1->Rect.right,
-                                    prngattrSrc1->Rect.bottom );
+                return IntSetRectRgn(prngattrDest,
+                                     prngattrSrc1->Rect.left,
+                                     prngattrSrc2->Rect.top,
+                                     prngattrSrc1->Rect.right,
+                                     prngattrSrc1->Rect.bottom );
             }
             else if (prngattrSrc2->Rect.top == prngattrSrc1->Rect.bottom)
             {
                 /* The result is the combined rects */
-                return SetRectRgnEx(hrgnDest,
-                                    prngattrDest,
-                                    prngattrSrc1->Rect.left,
-                                    prngattrSrc1->Rect.top,
-                                    prngattrSrc1->Rect.right,
-                                    prngattrSrc2->Rect.bottom );
+                return IntSetRectRgn(prngattrDest,
+                                     prngattrSrc1->Rect.left,
+                                     prngattrSrc1->Rect.top,
+                                     prngattrSrc1->Rect.right,
+                                     prngattrSrc2->Rect.bottom );
             }
 
             /* When we are here, this is RGN_XOR and the rects overlap */
@@ -464,34 +469,31 @@
             if (iCombineMode == RGN_OR)
             {
                 /* Use the maximum extent of both rects combined */
-                return SetRectRgnEx(hrgnDest,
-                                    prngattrDest,
-                                    min(prngattrSrc1->Rect.left, 
prngattrSrc2->Rect.left),
-                                    prngattrSrc1->Rect.top,
-                                    max(prngattrSrc1->Rect.right, 
prngattrSrc2->Rect.right),
-                                    prngattrSrc1->Rect.bottom);
+                return IntSetRectRgn(prngattrDest,
+                                     min(prngattrSrc1->Rect.left, 
prngattrSrc2->Rect.left),
+                                     prngattrSrc1->Rect.top,
+                                     max(prngattrSrc1->Rect.right, 
prngattrSrc2->Rect.right),
+                                     prngattrSrc1->Rect.bottom);
             }
 
             /* Check if the rects are adjacent */
             if (prngattrSrc2->Rect.right == prngattrSrc1->Rect.left)
             {
                 /* The result is the combined rects */
-                return SetRectRgnEx(hrgnDest,
-                                    prngattrDest,
-                                    prngattrSrc2->Rect.left,
-                                    prngattrSrc1->Rect.top,
-                                    prngattrSrc1->Rect.right,
-                                    prngattrSrc1->Rect.bottom );
+                return IntSetRectRgn(prngattrDest,
+                                     prngattrSrc2->Rect.left,
+                                     prngattrSrc1->Rect.top,
+                                     prngattrSrc1->Rect.right,
+                                     prngattrSrc1->Rect.bottom );
             }
             else if (prngattrSrc2->Rect.left == prngattrSrc1->Rect.right)
             {
                 /* The result is the combined rects */
-                return SetRectRgnEx(hrgnDest,
-                                    prngattrDest,
-                                    prngattrSrc1->Rect.left,
-                                    prngattrSrc1->Rect.top,
-                                    prngattrSrc2->Rect.right,
-                                    prngattrSrc1->Rect.bottom );
+                return IntSetRectRgn(prngattrDest,
+                                     prngattrSrc1->Rect.left,
+                                     prngattrSrc1->Rect.top,
+                                     prngattrSrc2->Rect.right,
+                                     prngattrSrc1->Rect.bottom );
             }
 
             /* When we are here, this is RGN_XOR and the rects overlap */
@@ -510,12 +512,11 @@
                     (prngattrSrc1->Rect.bottom >= prngattrSrc2->Rect.bottom))
                 {
                     /* Rect 1 contains rect 2, use it */
-                    return SetRectRgnEx(hrgnDest,
-                                        prngattrDest,
-                                        prngattrSrc1->Rect.left,
-                                        prngattrSrc1->Rect.top,
-                                        prngattrSrc1->Rect.right,
-                                        prngattrSrc1->Rect.bottom );
+                    return IntSetRectRgn(prngattrDest,
+                                         prngattrSrc1->Rect.left,
+                                         prngattrSrc1->Rect.top,
+                                         prngattrSrc1->Rect.right,
+                                         prngattrSrc1->Rect.bottom );
                 }
             }
             else
@@ -526,12 +527,11 @@
                     (prngattrSrc2->Rect.bottom >= prngattrSrc1->Rect.bottom))
                 {
                     /* Rect 2 contains rect 1, use it */
-                    return SetRectRgnEx(hrgnDest,
-                                        prngattrDest,
-                                        prngattrSrc2->Rect.left,
-                                        prngattrSrc2->Rect.top,
-                                        prngattrSrc2->Rect.right,
-                                        prngattrSrc2->Rect.bottom );
+                    return IntSetRectRgn(prngattrDest,
+                                         prngattrSrc2->Rect.left,
+                                         prngattrSrc2->Rect.top,
+                                         prngattrSrc2->Rect.right,
+                                         prngattrSrc2->Rect.bottom );
                 }
             }
         }
@@ -1154,44 +1154,54 @@
  */
 BOOL
 WINAPI
-SetRectRgn(HRGN hrgn,
-           int nLeftRect,
-           int nTopRect,
-           int nRightRect,
-           int nBottomRect)
-{
-    PRGN_ATTR Rgn_Attr;
-
-    //if (!GdiGetHandleUserData((HGDIOBJ) hrgn, GDI_OBJECT_TYPE_REGION, 
(PVOID) &Rgn_Attr))
-    return NtGdiSetRectRgn(hrgn, nLeftRect, nTopRect, nRightRect, nBottomRect);
-
-    if ((nLeftRect == nRightRect) || (nTopRect == nBottomRect))
-    {
-        Rgn_Attr->AttrFlags |= ATTR_RGN_DIRTY;
-        Rgn_Attr->iComplexity = NULLREGION;
-        Rgn_Attr->Rect.left = Rgn_Attr->Rect.top =
-                                  Rgn_Attr->Rect.right = Rgn_Attr->Rect.bottom 
= 0;
+SetRectRgn(
+    _In_ HRGN hrgn,
+    _In_ INT xLeft,
+    _In_ INT yTop,
+    _In_ INT xRight,
+    _In_ INT yBottom)
+{
+    PRGN_ATTR prngattr;
+
+    /* Try to get the region attribute */
+    prngattr = GdiGetRgnAttr(hrgn);
+    if (prngattr == NULL)
+    {
+        return NtGdiSetRectRgn(hrgn, xLeft, yTop, xRight, yBottom);
+    }
+
+    /* check for NULL region */
+    if ((xLeft == xRight) || (yTop == yBottom))
+    {
+        IntSetNullRgn(prngattr);
         return TRUE;
     }
 
-    Rgn_Attr->Rect.left   = nLeftRect;
-    Rgn_Attr->Rect.top    = nTopRect;
-    Rgn_Attr->Rect.right  = nRightRect;
-    Rgn_Attr->Rect.bottom = nBottomRect;
-
-    if(nLeftRect > nRightRect)
-    {
-        Rgn_Attr->Rect.left   = nRightRect;
-        Rgn_Attr->Rect.right  = nLeftRect;
-    }
-    if(nTopRect > nBottomRect)
-    {
-        Rgn_Attr->Rect.top    = nBottomRect;
-        Rgn_Attr->Rect.bottom = nTopRect;
-    }
-
-    Rgn_Attr->AttrFlags |= ATTR_RGN_DIRTY ;
-    Rgn_Attr->iComplexity = SIMPLEREGION;
+    if (xLeft > xRight)
+    {
+        prngattr->Rect.left   = xRight;
+        prngattr->Rect.right  = xLeft;
+    }
+    else
+    {
+        prngattr->Rect.left   = xLeft;
+        prngattr->Rect.right  = xRight;
+    }
+
+    if (yTop > yBottom)
+    {
+        prngattr->Rect.top    = yBottom;
+        prngattr->Rect.bottom = yTop;
+    }
+    else
+    {
+        prngattr->Rect.top    = yTop;
+        prngattr->Rect.bottom = yBottom;
+    }
+
+    prngattr->AttrFlags |= ATTR_RGN_DIRTY ;
+    prngattr->iComplexity = SIMPLEREGION;
+
     return TRUE;
 }
 


Reply via email to