http://bugs.winehq.org/show_bug.cgi?id=30115
--- Comment #2 from Henri Verbeet hverbeet@gmail.com 2012-03-09 09:48:41 CST --- (In reply to comment #1)
After commit 156d24c6 surface_cpu_blt() had been extended to support non-transforming block-based surfaces blits for compressed textures, and this support seems to look very similar to one that had been working correctly inside surface_cpu_bltfast(). Unfortunately something differs between those two implementations and I can't tell what is the difference exactly ATM, but I'm pretty sure that this difference is a bug trigger here. Going to investigate a bit deeper and report back any findings I would come with.
I'm not sure if this is the problem, but I do see a potential issue with the code in surface_cpu_blt(). For the destination surface, it locks the destination rectangle if there is one, but for the source surface it always maps the entire surface and adjusts the pointer later. However, that's after the call to surface_cpu_blt_compressed(). (And wrong for compressed surfaces anyway.)