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