dib: fix stretchdibits

Huw D M Davies h.davies1 at physics.ox.ac.uk
Wed Nov 12 08:06:31 CST 2003


        Huw Davies <huw at codeweavers.com>
	Make sure we create a polychrome bitmap from the dib.  CreateDIBitmap
	doesn't do this when the dib is 1bpp and has a black/white colour
	table.  In such cases this resulted in a monochrome bitmap being
	StretchBlt'ed which is clearly incorrect since we then start using
	text and bkgnd colours.
	
	It's not clear to me that CreateDIBitmap should generate a monochrome
	bitmap (tests under Windows show that it doesn't), however other areas
	of Wine rely on this behaviour (in particular the cursor code) and I'm
	not going to mess with those at the moment.  Besides the new
	StretchDIBits is more symmetric when written this way.        
-- 
Huw Davies
huw at codeweavers.com
Index: objects/dib.c
===================================================================
RCS file: /home/wine/wine/objects/dib.c,v
retrieving revision 1.77
diff -u -r1.77 dib.c
--- objects/dib.c	11 Nov 2003 00:27:10 -0000	1.77
+++ objects/dib.c	12 Nov 2003 14:04:00 -0000
@@ -164,7 +164,7 @@
 
     dc = DC_GetDCUpdate( hdc );
     if(!dc) return FALSE;
-    
+
     if(dc->funcs->pStretchDIBits)
     {
         heightSrc = dc->funcs->pStretchDIBits(dc->physDev, xDst, yDst, widthDst,
@@ -179,6 +179,10 @@
 
         GDI_ReleaseObj( hdc );
 	hdcMem = CreateCompatibleDC( hdc );
+        hBitmap = CreateCompatibleBitmap(hdc, info->bmiHeader.biWidth,
+                                         info->bmiHeader.biHeight);
+        hOldBitmap = SelectObject( hdcMem, hBitmap );
+
 	if (info->bmiHeader.biCompression == BI_RLE4 ||
 	    info->bmiHeader.biCompression == BI_RLE8) {
 
@@ -196,22 +200,15 @@
 	    * pStretchDIBits function shall be implemented.
 	    * ericP (2000/09/09)
 	    */
-	   hBitmap = CreateCompatibleBitmap(hdc, info->bmiHeader.biWidth,
-					    info->bmiHeader.biHeight);
-	   hOldBitmap = SelectObject( hdcMem, hBitmap );
-
-	   /* copy existing bitmap from destination dc */
-	   StretchBlt( hdcMem, xSrc, abs(info->bmiHeader.biHeight) - heightSrc - ySrc,
-		       widthSrc, heightSrc, hdc, xDst, yDst, widthDst, heightDst,
-		       dwRop );
-	   SetDIBits(hdcMem, hBitmap, 0, info->bmiHeader.biHeight, bits,
-		     info, DIB_RGB_COLORS);
-
-	} else {
-	   hBitmap = CreateDIBitmap( hdc, &info->bmiHeader, CBM_INIT,
-				     bits, info, wUsage );
-	   hOldBitmap = SelectObject( hdcMem, hBitmap );
-	}
+
+            /* copy existing bitmap from destination dc */
+            StretchBlt( hdcMem, xSrc, abs(info->bmiHeader.biHeight) - heightSrc - ySrc,
+                        widthSrc, heightSrc, hdc, xDst, yDst, widthDst, heightDst,
+                        dwRop );
+        }
+
+        SetDIBits(hdcMem, hBitmap, 0, info->bmiHeader.biHeight, bits,
+		     info, wUsage);
 
         /* Origin for DIBitmap may be bottom left (positive biHeight) or top
            left (negative biHeight) */



More information about the wine-patches mailing list