http://bugs.winehq.org/show_bug.cgi?id=17505
Summary: Riven: mouse cursor is drawn on a checkerboard background Product: Wine Version: 1.1.15 Platform: PC OS/Version: Linux Status: UNCONFIRMED Severity: minor Priority: P2 Component: winex11.drv AssignedTo: wine-bugs@winehq.org ReportedBy: skuller@skuller.ath.cx
Created an attachment (id=19612) --> (http://bugs.winehq.org/attachment.cgi?id=19612) Mark nearly black samples as entirely transparent
When running the DVD version of Riven in Wine, in-game mouse cursor is drawn on a semi-transparent checkerboard background [1]. This bug seems to be related to the Xcursor code path in dlls/winex11.drv/mouse.c, since when I remove libXcursor.so.1 out of the way so that Wine falls back to the original pixmap cursor handling code, in-game cursor is drawn correctly [2].
[1] http://skuller.ath.cx/tmp/riven1.png [2] http://skuller.ath.cx/tmp/riven2.png
As far as I understand the code, checkerboard pattern results from the way inverted colors are emulated in the create_cursor_image() function. Riven creates a 32 bit bitmap with an empty alpha channel, with transparent pixels (as defined by AND mask) being nearly black (but not quite, 0x040404 to be precise). Then the sampled grayscale value of 0x04 is mapped to the alpha channel and the pixel color is inverted, resulting in a semi-transparent background (which is very visible — perhaps X supports only discrete values for alpha?).
Attached patch attempts to fix this issue by checking for small grayscale samples being mapped to the alpha channel (less than 5% opacity) and marking the resulting pixel entirely transparent for such samples.