Hi all, This should hopefully fix bug : Bug 936 - Incorrect placement of DirectDraw output (offset outside the Windows 'window') Basically, the logic to compute the clipping window was wrong (or at least I did not understand all the subtilities of the code :-) ). At least with this fix, this particular application now runs fine. Changelog: Fix the clipping window computation when blitting on the screen in non-full screen DDraw case. -- Lionel Ulmer - http://www.bbrox.org/
Index: dlls/ddraw/dsurface/user.c =================================================================== RCS file: /home/wine/wine/dlls/ddraw/dsurface/user.c,v retrieving revision 1.11 diff -u -r1.11 user.c --- dlls/ddraw/dsurface/user.c 28 Jun 2002 23:26:57 -0000 1.11 +++ dlls/ddraw/dsurface/user.c 3 Aug 2002 11:59:13 -0000 @@ -522,17 +522,17 @@ if (This->clipper) { RECT xrc; HWND hwnd = This->clipper->hWnd; - if (hwnd && GetWindowRect(hwnd,&xrc)) { - /* Do not forget to honor the offset within the clip window. */ - /* translate the surface to 0.0 of the clip window */ - OffsetRect(&drawrect,offset.x,offset.y); + + if (hwnd && GetClientRect(hwnd,&xrc)) { + /* Do the intersection between the clipper window and the DDraw window */ + OffsetRect(&xrc, offset.x, offset.y); IntersectRect(&drawrect,&drawrect,&xrc); - /* translate it back to its original position */ - OffsetRect(&drawrect,-offset.x,-offset.y); } } - if (rc) + if (rc) { + /* Now intersect the DDraw 'window' and the requested part to draw */ IntersectRect(&drawrect,&drawrect,rc); + } else { /* Only use this if the caller did not pass a rectangle, since * due to double locking this could be the wrong one ... */ @@ -540,7 +540,7 @@ IntersectRect(&drawrect,&drawrect,&This->lastlockrect); } BitBlt(hDisplayDC, - drawrect.left+offset.x, drawrect.top+offset.y, + drawrect.left-offset.x, drawrect.top-offset.y, drawrect.right-drawrect.left, drawrect.bottom-drawrect.top, hSurfaceDC, drawrect.left, drawrect.top,