compatible DC/Bitmap fixes

eric pouech eric.pouech at wanadoo.fr
Sat Dec 1 14:29:05 CST 2001


as Marcus reported, the console was only working in black & white
the cause of the error comes from the following flow

1/ GetDC (physical and/or display)
2/ CreateCompatibleDC (on DC gotten from 1/)
3/ CreateCompatibleBitmap (on DC gotten from 2/)

the trouble is as follows :
- when a mem DC is created, its bits per pixel is always set to 1 
(the x11 driver sets in fact its bits per pixel count to the depth of
the bitmap set before creation in driver, which is the DEFAULT_BITMAP
(1x1 monochrome)
- when the compatible bitmap is created, its depth is set to the one
of the DC in parameter, hence 1

creating the bitmap in 3 with either a non memory DC or with 
CreateBitmap with the correct depth solves the issue

I'm not 100% sure the attached patch is the best way to solve this
issue (it mostly tests in CreateCompatibleBitmap that the DC isn't
a memory one, if so, it gets the depth from the funcs attached to
the DC)

feel free to propose a better solution, if any. This lets the console
blush again

A+
-- 
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle
-------------- next part --------------
Name: ccbmem
ChangeLog: fixed CreateCompatibleBitmap on memory DC
GenDate: 2001/12/01 20:06:31 UTC
ModifiedFiles: objects/bitmap.c
AddedFiles: 
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/objects/bitmap.c,v
retrieving revision 1.44
diff -u -u -r1.44 bitmap.c
--- objects/bitmap.c	2001/07/25 00:43:36	1.44
+++ objects/bitmap.c	2001/12/01 12:21:15
@@ -181,9 +181,11 @@
     } else {
         /* MS doc says if width or height is 0, return 1-by-1 pixel, monochrome bitmap */
         if (!width || !height) 
-	   hbmpRet = CreateBitmap( 1, 1, 1, 1, NULL );
-	else 
-	   hbmpRet = CreateBitmap( width, height, 1, dc->bitsPerPixel, NULL );
+            hbmpRet = CreateBitmap( 1, 1, 1, 1, NULL );
+	else if ((dc->flags & DC_MEMORY) && dc->funcs->pGetDeviceCaps)
+            hbmpRet = CreateBitmap( width, height, 1, dc->funcs->pGetDeviceCaps(dc, BITSPIXEL), NULL);
+        else
+            hbmpRet = CreateBitmap( width, height, 1, dc->bitsPerPixel, NULL );
 	if(dc->funcs->pCreateBitmap)
 	    dc->funcs->pCreateBitmap( hbmpRet );
     }


More information about the wine-patches mailing list