PATCH: x11 SelectBitmap / CreateBitmap

Marcus Meissner meissner at suse.de
Tue Nov 26 04:23:43 CST 2002


Hi,

Lotus Notes does the following to support a Print Preview:

- Creates a printer DC.
- Creates a compatible bitmap within that DC.
- Selects this bitmap into a display DC.
- Tries to render text into it.

This crashes in xrendering, since no physBitmap has been assigned to the
bitmap, so drawable is 0 leading to a crash in XFillRectangle.

This code works around the problem, but it is mostly a hack I guess.

(Should we be able to select a compatible bitmap from a different DC into
 another one?)

Ciao, Marcus

Changelog:
	If we select a non display bitmap into a display DC, create
	a respective physmap and x11 drawable.

Index: graphics/x11drv/bitmap.c
===================================================================
RCS file: /home/wine/wine/graphics/x11drv/bitmap.c,v
retrieving revision 1.44
diff -u -r1.44 bitmap.c
--- graphics/x11drv/bitmap.c	14 Nov 2002 22:31:35 -0000	1.44
+++ graphics/x11drv/bitmap.c	26 Nov 2002 10:16:57 -0000
@@ -88,6 +88,26 @@
     else
         physDev->drawable = (Pixmap)bmp->physBitmap;
 
+    /* This happens if we create a compatible bitmap in a non display DC,
+     * but select it in a X11 display DC.
+     * It is probably broken by design.
+     */
+    if (!physDev->drawable) {
+	    FIXME("Creating a drawable / physical bitmap for compatible bitmap.\n");
+	    if (!(physDev->drawable = (Pixmap)bmp->physBitmap = (void *)TSXCreatePixmap(gdi_display, root_window,
+							    bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
+							    bmp->bitmap.bmBitsPixel)))
+	    {
+		FIXME("Cannot create Pixmap!\n");
+		GDI_ReleaseObj( hbitmap );
+		return 0;
+	    }
+
+	    if (bmp->bitmap.bmBits) /* Set bitmap bits */
+		X11DRV_SetBitmapBits( hbitmap, bmp->bitmap.bmBits,
+				      bmp->bitmap.bmHeight * bmp->bitmap.bmWidthBytes );
+    }
+
       /* Change GC depth if needed */
 
     if (dc->bitsPerPixel != bmp->bitmap.bmBitsPixel)
@@ -149,7 +169,7 @@
                                                     bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
                                                     bmp->bitmap.bmBitsPixel)))
     {
-        WARN("Can't create Pixmap\n");
+        FIXME("Cannot create Pixmap!\n");
 	GDI_ReleaseObj( hbitmap );
 	return FALSE;
     }



More information about the wine-patches mailing list