http://bugs.winehq.org/show_bug.cgi?id=3902
damjan.jov@gmail.com changed:
What |Removed |Added ---------------------------------------------------------------------------- Attachment #3761 is|0 |1 obsolete| |
------- Additional Comments From damjan.jov@gmail.com 2006-13-10 16:41 ------- Created an attachment (id=3848) --> (http://bugs.winehq.org/attachment.cgi?id=3848&action=view) dirty rectangle patch, v2
Well, found out why the dirty rectangle patch sometimes crashes winecfg (a pointer is sometimes NULL), so I posted a new patch that doesn't crash crash. It's against wine-0.9.23, but it should apply cleanly to 0.9.22 (since the 0.9.22 patch applies cleanly against 0.9.23).
As far as the client-side DIB copy patch goes, the width and height of the source and destination rectangles have to be the same, otherwise X11DRV_BitBlt (and hence my code) never gets called. I did thorough checks against the x-y coordinates and width and height - they're always valid, positive, in-range - perfect in every way.
But I tried to copy the original destination pixels into a buffer, then copy pixels from source to destination, then mark the image DIB_Status_GdiMod and coerce it to DIB_Status_InSync (forcing the image to be downloaded from the X server again), and compare the newly downloaded image with the originally downloaded image. The result? They differ! Somehow, the X server is modifying the image while the pixels are being copied client-side. I've tried using wine_tsx11_lock(), XFlush(), GdiFlush(), glFinish(), tried locking the image in DIB_Status_AppMod or DIB_Status_InSync instead of the current DIB_Status_None, and nothing worked.