Huw Davies : gdi32: Add helpers to clear and free dib_info structures.

Alexandre Julliard julliard at winehq.org
Thu May 12 13:57:50 CDT 2011


Module: wine
Branch: master
Commit: 5ac51cd24f386d5bb7136f09e1448ffb5cc1b943
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5ac51cd24f386d5bb7136f09e1448ffb5cc1b943

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu May 12 11:27:35 2011 +0100

gdi32: Add helpers to clear and free dib_info structures.

---

 dlls/gdi32/dibdrv/dc.c |   48 +++++++++++++++++++++++++++++++++++-------------
 1 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index e43ec15..a9a53ad 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -27,17 +27,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(dib);
 
-/***********************************************************************
- *           dibdrv_DeleteDC
- */
-static BOOL CDECL dibdrv_DeleteDC( PHYSDEV dev )
-{
-    dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
-    TRACE("(%p)\n", dev);
-    DeleteObject(pdev->clip);
-    return 0;
-}
-
 static void calc_shift_and_len(DWORD mask, int *shift, int *len)
 {
     int s, l;
@@ -74,7 +63,7 @@ static void init_bit_fields(dib_info *dib, const DWORD *bit_fields)
     calc_shift_and_len(dib->blue_mask,  &dib->blue_shift,  &dib->blue_len);
 }
 
-static BOOL init_dib(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD *bit_fields, void *bits)
+static BOOL init_dib_info(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD *bit_fields, void *bits)
 {
     static const DWORD bit_fields_888[3] = {0xff0000, 0x00ff00, 0x0000ff};
 
@@ -119,6 +108,37 @@ static BOOL init_dib(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD *bit
     return TRUE;
 }
 
+static void clear_dib_info(dib_info *dib)
+{
+    dib->bits = NULL;
+}
+
+/**********************************************************************
+ *      free_dib_info
+ *
+ * Free the resources associated with a dib and optionally the bits
+ */
+static void free_dib_info(dib_info *dib, BOOL free_bits)
+{
+    if(free_bits)
+    {
+        HeapFree(GetProcessHeap(), 0, dib->bits);
+        dib->bits = NULL;
+    }
+}
+
+/***********************************************************************
+ *           dibdrv_DeleteDC
+ */
+static BOOL CDECL dibdrv_DeleteDC( PHYSDEV dev )
+{
+    dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
+    TRACE("(%p)\n", dev);
+    DeleteObject(pdev->clip);
+    free_dib_info(&pdev->dib, FALSE);
+    return 0;
+}
+
 /***********************************************************************
  *           dibdrv_SelectBitmap
  */
@@ -135,7 +155,9 @@ static HBITMAP CDECL dibdrv_SelectBitmap( PHYSDEV dev, HBITMAP bitmap )
     pdev->clip = CreateRectRgn(0, 0, 0, 0);
     pdev->defer = 0;
 
-    if(!init_dib(&pdev->dib, &bmp->dib->dsBmih, bmp->dib->dsBitfields, bmp->dib->dsBm.bmBits))
+    clear_dib_info(&pdev->dib);
+
+    if(!init_dib_info(&pdev->dib, &bmp->dib->dsBmih, bmp->dib->dsBitfields, bmp->dib->dsBm.bmBits))
         pdev->defer |= DEFER_FORMAT;
 
     GDI_ReleaseObj( bitmap );




More information about the wine-cvs mailing list