http://bugs.winehq.org/show_bug.cgi?id=5161
------- Additional Comments From molle.bestefich@gmail.com 2006-04-05 05:02 ------- A +relay trace shows error occurs in CreateDIBSection:
0009:Call winex11.drv.CreateDIBSection(7fd79bf8,00007ebc,7fbcbf9c,00000000) ret=7f8b35ae 0009:Call ntdll.RtlAllocateHeap(7fce0000,00000008,00000060) ret=7f267550 0009:Ret ntdll.RtlAllocateHeap() retval=7fd79d78 ret=7f267550 0009:Call gdi32.GetObjectW(00007ebc,00000054,7fbcbcb0) ret=7f27a130 0009:Ret gdi32.GetObjectW() retval=00000054 ret=7f27a130 X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 53 (X_CreatePixmap) Value in failed request: 0x0 Serial number of failed request: 633802 Current serial number in output stream: 634565
Added a trace:
--- dlls/x11drv/dib.c.orig +++ dlls/x11drv/dib.c @@ -4674,2 +4674,3 @@ physBitmap->pixmap_depth = (dib.dsBm.bmBitsPixel == 1) ? 1 : screen_depth; + TRACE("(%p) %dx%d %d bpp\n", hbitmap, dib.dsBm.bmWidth, dib.dsBm.bmHeight, physBitmap->pixmap_depth); physBitmap->pixmap = XCreatePixmap( gdi_display, root_window, dib.dsBm.bmWidth,
Gives normal (?) values:
trace:bitmap:DIB_CreateDIBSection format (10,-200), planes 1, bpp 32, size 0, RGB trace:bitmap:CreateBitmapIndirect 10x200, 65536 colors returning 0x7e28 trace:bitmap:X11DRV_CreateDIBSection (0x7e28) 10x200 16 bpp X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 53 (X_CreatePixmap) Value in failed request: 0x0 Serial number of failed request: 627920 Current serial number in output stream: 628685
The above does look a _little_ odd. Comparison: DIB_CreateDIBSection 10, -200, 32 bpp X11DRV_CreateDIBSection 10, 200, 16 bpp
But I'm unsure whether to worry about it.
I think that xorg-server-1.0.2-r3/dix/dispatch.c (attaching momentarily) is where the failure happens. Looking at the source, there are two places where BadValue can be returned.
One of them sets errorValue to bit depth, which would be odd (we're seeing errorValue == 0).
The other sets errorValue explicitly to 0, so I think it's more likely to be the culprit.
Code looks like this: if (!stuff->width || !stuff->height) { client->errorValue = 0; return BadValue; }
Unless width/height got corrupted on the way (I don't know how it propagates from x11drv to dispatch.c), this statement fails: if (!10 || !200)
That would be odd, wouldn't it?