PATCH: handle NULL XImage in GetBitmapBits

Alexandre Julliard julliard at winehq.org
Tue Dec 13 04:42:38 CST 2005


Marcus Meissner <marcus at jet.franken.de> writes:

> Changelog:
> 	In GetBitmapBits() handle the correct bitmap information
> 	when a DIB is used.

I think for a DIB we want to copy the bits directly, like we already
do in SetBitmapBits. Does this work for you?

diff --git a/dlls/gdi/bitmap.c b/dlls/gdi/bitmap.c
index a0c6b25..5c2b6c3 100644
--- a/dlls/gdi/bitmap.c
+++ b/dlls/gdi/bitmap.c
@@ -307,6 +307,30 @@ LONG WINAPI GetBitmapBits(
 
     if (!bmp) return 0;
 
+    if (bmp->dib)  /* simply copy the bits from the DIB */
+    {
+        DIBSECTION *dib = bmp->dib;
+        const char *src = dib->dsBm.bmBits;
+        DWORD max = dib->dsBm.bmWidthBytes * dib->dsBm.bmHeight;
+        if (count > max) count = max;
+        ret = count;
+        if (!bits) goto done;
+
+        if (bmp->dib->dsBmih.biHeight >= 0)  /* not top-down, need to flip contents vertically */
+        {
+            src += dib->dsBm.bmWidthBytes * dib->dsBm.bmHeight;
+            while (count > 0)
+            {
+                src -= dib->dsBm.bmWidthBytes;
+                memcpy( bits, src, min( count, dib->dsBm.bmWidthBytes ) );
+                bits = (char *)bits + dib->dsBm.bmWidthBytes;
+                count -= dib->dsBm.bmWidthBytes;
+            }
+        }
+        else memcpy( bits, src, count );
+        goto done;
+    }
+
     /* If the bits vector is null, the function should return the read size */
     if(bits == NULL)
     {

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list