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