Huw Davies : gdi32: When creating a dib_info from a ddb, always make a copy of the colour map.

Alexandre Julliard julliard at winehq.org
Thu Sep 8 14:52:10 CDT 2011


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Sep  8 09:55:03 2011 +0100

gdi32: When creating a dib_info from a ddb, always make a copy of the colour map.

---

 dlls/gdi32/dibdrv/bitblt.c |   17 +++++++++++++----
 dlls/gdi32/dibdrv/dc.c     |    3 ++-
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/dlls/gdi32/dibdrv/bitblt.c b/dlls/gdi32/dibdrv/bitblt.c
index 356d276..0bb37fb 100644
--- a/dlls/gdi32/dibdrv/bitblt.c
+++ b/dlls/gdi32/dibdrv/bitblt.c
@@ -604,7 +604,7 @@ DWORD dibdrv_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info,
                        struct gdi_image_bits *bits, struct bitblt_coords *src )
 {
     DWORD ret = ERROR_SUCCESS;
-    dib_info *dib, stand_alone;
+    dib_info *dib = NULL, stand_alone;
 
     TRACE( "%p %p %p\n", dev, hbitmap, info );
 
@@ -651,7 +651,12 @@ DWORD dibdrv_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info,
     }
 
 done:
-   if (hbitmap) GDI_ReleaseObj( hbitmap );
+   if (hbitmap)
+   {
+       if (dib) free_dib_info( dib );
+       GDI_ReleaseObj( hbitmap );
+   }
+
    return ret;
 }
 
@@ -707,7 +712,7 @@ DWORD dibdrv_PutImage( PHYSDEV dev, HBITMAP hbitmap, HRGN clip, BITMAPINFO *info
                        const struct gdi_image_bits *bits, struct bitblt_coords *src,
                        struct bitblt_coords *dst, DWORD rop )
 {
-    dib_info *dib, stand_alone;
+    dib_info *dib = NULL, stand_alone;
     DWORD ret;
     dib_info src_dib;
     HRGN saved_clip = NULL;
@@ -780,7 +785,11 @@ update_format:
     ret = ERROR_BAD_FORMAT;
 
 done:
-    if (hbitmap) GDI_ReleaseObj( hbitmap );
+    if (hbitmap)
+    {
+       if (dib) free_dib_info( dib );
+       GDI_ReleaseObj( hbitmap );
+    }
 
     return ret;
 }
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index 8ab7a06..99b441c 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -219,7 +219,8 @@ BOOL init_dib_info_from_bitmapobj(dib_info *dib, BITMAPOBJ *bmp, enum dib_info_f
         BITMAPINFO *info = (BITMAPINFO *)buffer;
 
         get_ddb_bitmapinfo( bmp, info );
-        return init_dib_info_from_bitmapinfo( dib, info, bmp->bitmap.bmBits, flags );
+        return init_dib_info_from_bitmapinfo( dib, info, bmp->bitmap.bmBits,
+                                              flags | private_color_table );
     }
     return init_dib_info( dib, &bmp->dib->dsBmih, bmp->dib->dsBitfields,
                           bmp->color_table, bmp->nb_colors, bmp->dib->dsBm.bmBits, flags );




More information about the wine-cvs mailing list