[PATCH 1/8] gdi32: Don't copy biSizeImage in copy_color_info().

Huw Davies huw at codeweavers.com
Mon Feb 13 08:07:58 CST 2017


It meant there was a hack which incorrectly changed the corresponding value in src_info.

Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/gdi32/dib.c          | 11 +++++++----
 dlls/gdi32/tests/bitmap.c |  2 ++
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c
index 96280f9..0d558b0 100644
--- a/dlls/gdi32/dib.c
+++ b/dlls/gdi32/dib.c
@@ -1051,8 +1051,7 @@ static void copy_color_info(BITMAPINFO *dst, const BITMAPINFO *src, UINT colorus
     }
     else
     {
-        dst->bmiHeader.biClrUsed   = src->bmiHeader.biClrUsed;
-        dst->bmiHeader.biSizeImage = src->bmiHeader.biSizeImage;
+        dst->bmiHeader.biClrUsed = src->bmiHeader.biClrUsed;
 
         if (src->bmiHeader.biCompression == BI_BITFIELDS)
             /* bitfields are always at bmiColors even in larger structures */
@@ -1388,7 +1387,6 @@ INT WINAPI GetDIBits(
             }
             break;
         }
-        src_info->bmiHeader.biSizeImage = get_dib_image_size( dst_info );
         copy_color_info( dst_info, src_info, coloruse );
     }
     else if (dst_info->bmiHeader.biBitCount <= 8) /* otherwise construct a default colour table for the dst, if needed */
@@ -1409,6 +1407,7 @@ INT WINAPI GetDIBits(
             dst_info->bmiHeader.biHeight = src.height;
         else
             dst_info->bmiHeader.biHeight = -src.height;
+        dst_info->bmiHeader.biSizeImage = get_dib_image_size( dst_info );
 
         convert_bitmapinfo( src_info, src_bits.ptr, &src, dst_info, bits );
         if (src_bits.free) src_bits.free( &src_bits );
@@ -1425,7 +1424,11 @@ INT WINAPI GetDIBits(
     }
 
     copy_color_info( info, dst_info, coloruse );
-    if (info->bmiHeader.biSize != sizeof(BITMAPCOREHEADER)) info->bmiHeader.biClrUsed = 0;
+    if (info->bmiHeader.biSize != sizeof(BITMAPCOREHEADER))
+    {
+        info->bmiHeader.biClrUsed = 0;
+        info->bmiHeader.biSizeImage = get_dib_image_size( info );
+    }
 
 done:
     release_dc_ptr( dc );
diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index 88250ca..1c1db17 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -4303,8 +4303,10 @@ static void test_GetDIBits_scanlines(void)
     memset( data, 0xaa, sizeof(data) );
 
     info->bmiHeader.biHeight = 16;
+    info->bmiHeader.biSizeImage = 0;
     ret = GetDIBits( hdc, dib, 1, 12, data, info, DIB_RGB_COLORS );
     ok( ret == 5, "got %d\n", ret );
+    ok( info->bmiHeader.biSizeImage == 128 * 4, "got %d\n", info->bmiHeader.biSizeImage );
     for (i = 0; i < 56; i++) ok( data[i] == 0, "%d: got %08x\n", i, data[i] );
     ok( !memcmp( data + 56, dib_bits, 40 * 4 ), "bits differ\n");
     for (i = 96; i < 128; i++) ok( data[i] == 0xaaaaaaaa, "%d: got %08x\n", i, data[i] );
-- 
2.10.2




More information about the wine-patches mailing list