Author: jmorlan
Date: Wed Jul  2 12:20:28 2008
New Revision: 34267
URL: 
http://svn.reactos.org/svn/reactos?rev=34267&view=rev
Log:
- NtGdiAlphaBlend: If hDCSrc == hDCDest and a bitmap can't be locked, don't unlock
the DC twice. Fix typo in if condition which prevented detection of bad source bitmap.
- NtGdiBitBlt: Fix null pointer access when cleaning up after failure to lock source
bitmap.
- NtGdiStretchBlt: Fail gracefully if a bitmap can't be locked. Don't delete
XlateObj if it couldn't be created.
- NtGdiPolyPatBlt: Actually *use* the safe copy that so much code was dedicated to
creating. :)
- Trim a few bits of redundant code.
Modified:
    trunk/reactos/subsystems/win32/win32k/objects/bitblt.c
Modified: trunk/reactos/subsystems/win32/win32k/objects/bitblt.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ob…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/bitblt.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/bitblt.c [iso-8859-1] Wed Jul  2
12:20:28 2008
@@ -40,8 +40,8 @@
        BLENDFUNCTION  BlendFunc,
        HANDLE hcmXform)
 {
-       PDC DCDest = NULL;
-       PDC DCSrc  = NULL;
+       PDC DCDest;
+       PDC DCSrc;
        BITMAPOBJ *BitmapDest, *BitmapSrc;
        RECTL DestRect, SourceRect;
        BOOL Status;
@@ -106,7 +106,8 @@
        BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap);
        if (!BitmapDest)
        {
-               DC_UnlockDc(DCSrc);
+               if (hDCSrc != hDCDest)
+                       DC_UnlockDc(DCSrc);
                DC_UnlockDc(DCDest);
                return FALSE;
        }
@@ -115,10 +116,11 @@
        else
        {
                BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap);
-               if (!BitmapDest)
+               if (!BitmapSrc)
                {
                        BITMAPOBJ_UnlockBitmap(BitmapDest);
-                       DC_UnlockDc(DCSrc);
+                       if (hDCSrc != hDCDest)
+                               DC_UnlockDc(DCSrc);
                        DC_UnlockDc(DCDest);
                        return FALSE;
                }
@@ -169,7 +171,7 @@
        IN DWORD crBackColor,
        IN FLONG fl)
 {
-       PDC DCDest = NULL;
+       PDC DCDest;
        PDC DCSrc  = NULL;
        PDC_ATTR Dc_Attr = NULL;
        BITMAPOBJ *BitmapDest, *BitmapSrc = NULL;
@@ -219,10 +221,6 @@
                        DCSrc = DCDest;
                }
        }
-       else
-       {
-               DCSrc = NULL;
-       }
        Dc_Attr = DCDest->pDc_Attr;
        if (!Dc_Attr) Dc_Attr = &DCDest->Dc_Attr;
@@ -265,10 +263,6 @@
                                goto cleanup;
                }
        }
-       else
-       {
-               BitmapSrc = NULL;
-       }
        if (UsesPattern)
        {
@@ -280,10 +274,6 @@
                }
                BrushOrigin = *((PPOINTL)&BrushObj->ptOrigin);
                IntGdiInitBrushInstance(&BrushInst, BrushObj, DCDest->XlateBrush);
-       }
-       else
-       {
-               BrushObj = NULL;
        }
        /* Create the XLATEOBJ. */
@@ -301,7 +291,7 @@
        }
        /* Perform the bitblt operation */
-    Status = IntEngBitBlt( BitmapDest ? &BitmapDest->SurfObj : NULL, BitmapSrc ?
&BitmapSrc->SurfObj : NULL, NULL,
+    Status = IntEngBitBlt(&BitmapDest->SurfObj, BitmapSrc ?
&BitmapSrc->SurfObj : NULL, NULL,
                           DCDest->CombinedClip, XlateObj, &DestRect,
                           &SourcePoint, NULL,
                           BrushObj ? &BrushInst.BrushObject : NULL,
@@ -315,7 +305,7 @@
        {
                BITMAPOBJ_UnlockBitmap(BitmapDest);
        }
-       if (UsesSource && BitmapSrc != BitmapDest)
+       if (BitmapSrc != NULL && BitmapSrc != BitmapDest)
        {
                BITMAPOBJ_UnlockBitmap(BitmapSrc);
        }
@@ -734,13 +724,13 @@
        DWORD  ROP,
        IN DWORD dwBackColor)
 {
-       PDC DCDest = NULL;
+       PDC DCDest;
        PDC DCSrc  = NULL;
        PDC_ATTR Dc_Attr;
-       BITMAPOBJ *BitmapDest, *BitmapSrc;
+       BITMAPOBJ *BitmapDest, *BitmapSrc = NULL;
        RECTL DestRect;
        RECTL SourceRect;
-       BOOL Status;
+       BOOL Status = FALSE;
        XLATEOBJ *XlateObj = NULL;
        PGDIBRUSHOBJ BrushObj = NULL;
        BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000);
@@ -790,10 +780,6 @@
                        DCSrc = DCDest;
                }
        }
-       else
-       {
-               DCSrc = NULL;
-       }
        /* Offset the destination and source by the origin of their DCs. */
        // FIXME: ptlDCOrig is in device coordinates!
@@ -817,12 +803,20 @@
        /* Determine surfaces to be used in the bitblt */
        BitmapDest = BITMAPOBJ_LockBitmap(DCDest->w.hBitmap);
+       if (BitmapDest == NULL)
+               goto failed;
        if (UsesSource)
        {
                if (DCSrc->w.hBitmap == DCDest->w.hBitmap)
+               {
                        BitmapSrc = BitmapDest;
+               }
                else
+               {
                        BitmapSrc = BITMAPOBJ_LockBitmap(DCSrc->w.hBitmap);
+                       if (BitmapSrc == NULL)
+                               goto failed;
+               }
                int sw = BitmapSrc->SurfObj.sizlBitmap.cx;
                int sh = BitmapSrc->SurfObj.sizlBitmap.cy;
@@ -871,7 +865,6 @@
                if (0 == (DestRect.right-DestRect.left) || 0 ==
(DestRect.bottom-DestRect.top) || 0 == (SourceRect.right-SourceRect.left) || 0 ==
(SourceRect.bottom-SourceRect.top))
                {
                        SetLastWin32Error(ERROR_INVALID_PARAMETER);
-                       Status = FALSE;
                        goto failed;
                }
@@ -880,13 +873,9 @@
                if (XlateObj == (XLATEOBJ*)-1)
                {
                        SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
-                       Status = FALSE;
+                       XlateObj = NULL;
                        goto failed;
                }
-       }
-       else
-       {
-               BitmapSrc = NULL;
        }
        if (UsesPattern)
@@ -897,13 +886,8 @@
                if (NULL == BrushObj)
                {
                        SetLastWin32Error(ERROR_INVALID_HANDLE);
-                       Status = FALSE;
                        goto failed;
                }
-       }
-       else
-       {
-               BrushObj = NULL;
        }
        /* Perform the bitblt operation */
@@ -921,11 +905,14 @@
        {
                BRUSHOBJ_UnlockBrush(BrushObj);
        }
-       if (UsesSource && DCSrc->w.hBitmap != DCDest->w.hBitmap)
+       if (BitmapSrc && DCSrc->w.hBitmap != DCDest->w.hBitmap)
        {
                BITMAPOBJ_UnlockBitmap(BitmapSrc);
        }
-       BITMAPOBJ_UnlockBitmap(BitmapDest);
+       if (BitmapDest)
+       {
+               BITMAPOBJ_UnlockBitmap(BitmapDest);
+       }
        if (UsesSource && hDCSrc != hDCDest)
        {
                DC_UnlockDc(DCSrc);
@@ -1162,7 +1149,7 @@
       }
    }
-   Ret = IntGdiPolyPatBlt(hDC, dwRop, (PPATRECT)pRects, cRects, Mode);
+   Ret = IntGdiPolyPatBlt(hDC, dwRop, rb, cRects, Mode);
    if (cRects > 0)
       ExFreePool(rb);