From: John Edmonds <pocketcookies2@gmail.com> Subject: gdi32: Fixes GetDIBits for top-down destination bitmaps (Bug #26236). Message-Id: <AANLkTi=Ewm0P8p_kRyVgjbCskyF9jf7Mt9nA7Wb=giti@mail.gmail.com> Date: Sat, 26 Feb 2011 10:50:23 -0500 Resolves Bug #26236. --- �dlls/gdi32/dib.c | � 14 ++++++++++---- �1 files changed, 10 insertions(+), 4 deletions(-) diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c index eae7f35..0abd833 100644 --- a/dlls/gdi32/dib.c +++ b/dlls/gdi32/dib.c @@ -874,7 +874,7 @@ INT WINAPI GetDIBits( � � � � � � unsigned int srcwidth = bmp->dib->dsBm.bmWidth; � � � � � � int srcwidthb = bmp->dib->dsBm.bmWidthBytes; � � � � � � unsigned int dstwidth = width; - � � � � � �unsigned int dstwidthb = DIB_GetDIBWidthBytes( width, bpp ); + � � � � � �int dstwidthb = DIB_GetDIBWidthBytes( width, bpp ); � � � � � � LPBYTE dbits = bits, sbits = (LPBYTE) bmp->dib->dsBm.bmBits + (startscan * srcwidthb); � � � � � � unsigned int x, y, width, widthb; @@ -888,6 +888,12 @@ INT WINAPI GetDIBits( � � � � � � � � sbits += (srcwidthb * (int)(abs(bmp->dib->dsBmih.biHeight) - 2 * startscan - 1)); � � � � � � � � srcwidthb = -srcwidthb; � � � � � � } + � � � � � �/*Same for the destination.*/ + � � � � � �if (height < 0) + � � � � � �{ + � � � � � � � �dbits = (LPBYTE)bits + (dstwidthb * (lines - 1)); + � � � � � � � �dstwidthb = -dstwidthb; + � � � � � �} � � � � � � switch( bpp ) { � � � � � �case 15: @@ -902,7 +908,7 @@ INT WINAPI GetDIBits( � � � � � � � � � � case 16: /* 16 bpp srcDIB -> 16 bpp dstDIB */ � � � � � � � � � � � � { - � � � � � � � � � � � � � �widthb = min(abs(srcwidthb), dstwidthb); + � � � � � � � � � � � � � �widthb = min(abs(srcwidthb), abs(dstwidthb)); � � � � � � � � � � � � � � /* FIXME: BI_BITFIELDS not supported yet */ � � � � � � � � � � � � � � for (y = 0; y < lines; y++, dbits+=dstwidthb, sbits+=srcwidthb) � � � � � � � � � � � � � � � � memcpy(dbits, sbits, widthb); @@ -980,7 +986,7 @@ INT WINAPI GetDIBits( � � � � � � � � � � case 24: /* 24 bpp srcDIB -> 24 bpp dstDIB */ � � � � � � � � � � � � { - � � � � � � � � � � � � � �widthb = min(abs(srcwidthb), dstwidthb); + � � � � � � � � � � � � � �widthb = min(abs(srcwidthb), abs(dstwidthb)); � � � � � � � � � � � � � � for (y = 0; y < lines; y++, dbits+=dstwidthb, sbits+=srcwidthb) � � � � � � � � � � � � � � � � memcpy(dbits, sbits, widthb); � � � � � � � � � � � � } @@ -1056,7 +1062,7 @@ INT WINAPI GetDIBits( � � � � � � � � � � case 32: /* 32 bpp srcDIB -> 32 bpp dstDIB */ � � � � � � � � � � � � { - � � � � � � � � � � � � � �widthb = min(abs(srcwidthb), dstwidthb); + � � � � � � � � � � � � � �widthb = min(abs(srcwidthb), abs(dstwidthb)); � � � � � � � � � � � � � � /* FIXME: BI_BITFIELDS not supported yet */ � � � � � � � � � � � � � � for (y = 0; y < lines; y++, dbits+=dstwidthb, sbits+=srcwidthb) { � � � � � � � � � � � � � � � � memcpy(dbits, sbits, widthb); -- 1.7.1