Module: wine Branch: master Commit: e795d842ec092a4d136da078231e5a007292cda0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e795d842ec092a4d136da07823...
Author: Stefan Dösinger stefan@codeweavers.com Date: Tue Aug 5 12:19:43 2008 +0200
wined3d: Implement overlay position tracking.
---
dlls/ddraw/surface.c | 8 ++++- dlls/wined3d/surface_base.c | 59 +++++++++++++++++++++++++++++++++++-- dlls/wined3d/wined3d_private.h | 5 +++ include/wine/wined3d_interface.h | 1 + include/wine/wined3d_types.h | 24 +++++++++++++++ 5 files changed, 92 insertions(+), 5 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index a716149..bc25218 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -1841,7 +1841,13 @@ IDirectDrawSurfaceImpl_UpdateOverlay(IDirectDrawSurface7 *iface, Flags, (WINEDDOVERLAYFX *) FX); LeaveCriticalSection(&ddraw_cs); - return hr; + switch(hr) { + case WINED3DERR_INVALIDCALL: return DDERR_INVALIDPARAMS; + case WINEDDERR_NOTAOVERLAYSURFACE: return DDERR_NOTAOVERLAYSURFACE; + case WINEDDERR_OVERLAYNOTVISIBLE: return DDERR_OVERLAYNOTVISIBLE; + default: + return hr; + } }
/***************************************************************************** diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c index 400c7a7..59d0958 100644 --- a/dlls/wined3d/surface_base.c +++ b/dlls/wined3d/surface_base.c @@ -357,8 +357,9 @@ DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPitch(IWineD3DSurface *iface) {
HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetOverlayPosition(IWineD3DSurface *iface, LONG X, LONG Y) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; + LONG w, h;
- FIXME("(%p)->(%d,%d) Stub!\n", This, X, Y); + TRACE("(%p)->(%d,%d) Stub!\n", This, X, Y);
if(!(This->resource.usage & WINED3DUSAGE_OVERLAY)) { @@ -366,21 +367,38 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetOverlayPosition(IWineD3DSurface *iface return WINEDDERR_NOTAOVERLAYSURFACE; }
+ w = This->overlay_destrect.right - This->overlay_destrect.left; + h = This->overlay_destrect.bottom - This->overlay_destrect.top; + This->overlay_destrect.left = X; + This->overlay_destrect.top = Y; + This->overlay_destrect.right = X + w; + This->overlay_destrect.bottom = Y + h; + return WINED3D_OK; }
HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetOverlayPosition(IWineD3DSurface *iface, LONG *X, LONG *Y) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; + HRESULT hr;
- FIXME("(%p)->(%p,%p) Stub!\n", This, X, Y); + TRACE("(%p)->(%p,%p)\n", This, X, Y);
if(!(This->resource.usage & WINED3DUSAGE_OVERLAY)) { TRACE("(%p): Not an overlay surface\n", This); return WINEDDERR_NOTAOVERLAYSURFACE; } + if(This->overlay_dest == NULL) { + *X = 0; *Y = 0; + hr = WINEDDERR_OVERLAYNOTVISIBLE; + } else { + *X = This->overlay_destrect.left; + *Y = This->overlay_destrect.top; + hr = WINED3D_OK; + }
- return WINED3D_OK; + TRACE("Returning 0x%08x, position %d, %d\n", hr, *X, *Y); + return hr; }
HRESULT WINAPI IWineD3DBaseSurfaceImpl_UpdateOverlayZOrder(IWineD3DSurface *iface, DWORD Flags, IWineD3DSurface *Ref) { @@ -405,8 +423,41 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_UpdateOverlay(IWineD3DSurface *iface, REC
if(!(This->resource.usage & WINED3DUSAGE_OVERLAY)) { - TRACE("(%p): Not an overlay surface\n", This); + WARN("(%p): Not an overlay surface\n", This); return WINEDDERR_NOTAOVERLAYSURFACE; + } else if(!DstSurface) { + WARN("(%p): Dest surface is NULL\n", This); + return WINED3DERR_INVALIDCALL; + } + + if(SrcRect) { + This->overlay_srcrect = *SrcRect; + } else { + This->overlay_srcrect.left = 0; + This->overlay_srcrect.top = 0; + This->overlay_srcrect.right = This->currentDesc.Width; + This->overlay_srcrect.bottom = This->currentDesc.Height; + } + + if(DstRect) { + This->overlay_destrect = *DstRect; + } else { + This->overlay_destrect.left = 0; + This->overlay_destrect.top = 0; + This->overlay_destrect.right = Dst ? Dst->currentDesc.Width : 0; + This->overlay_destrect.bottom = Dst ? Dst->currentDesc.Height : 0; + } + + if(Flags & WINEDDOVER_SHOW) { + This->overlay_dest = Dst; + + } else if(Flags & WINEDDOVER_HIDE) { + /* tests show that the rectangles are erased on hide */ + This->overlay_srcrect.left = 0; This->overlay_srcrect.top = 0; + This->overlay_srcrect.right = 0; This->overlay_srcrect.bottom = 0; + This->overlay_destrect.left = 0; This->overlay_destrect.top = 0; + This->overlay_destrect.right = 0; This->overlay_destrect.bottom = 0; + This->overlay_dest = NULL; }
return WINED3D_OK; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index c1432ec..4d31b8c 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1326,6 +1326,11 @@ struct IWineD3DSurfaceImpl
/* DirectDraw clippers */ IWineD3DClipper *clipper; + + /* DirectDraw Overlay handling */ + RECT overlay_srcrect; + RECT overlay_destrect; + IWineD3DSurfaceImpl *overlay_dest; };
extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl; diff --git a/include/wine/wined3d_interface.h b/include/wine/wined3d_interface.h index 76d5843..a99a37c 100644 --- a/include/wine/wined3d_interface.h +++ b/include/wine/wined3d_interface.h @@ -80,6 +80,7 @@ struct IWineD3DSurface; #define WINEDDERR_SURFACEBUSY MAKE_WINED3DHRESULT(430) #define WINEDDERR_INVALIDRECT MAKE_WINED3DHRESULT(150) #define WINEDDERR_NOCLIPLIST MAKE_WINED3DHRESULT(205) +#define WINEDDERR_OVERLAYNOTVISIBLE MAKE_WINED3DHRESULT(577) #define WINED3DOK_NOAUTOGEN MAKE_WINED3DSTATUS(2159)
/***************************************************************************** diff --git a/include/wine/wined3d_types.h b/include/wine/wined3d_types.h index c4d10f5..bbfbcff 100644 --- a/include/wine/wined3d_types.h +++ b/include/wine/wined3d_types.h @@ -1803,4 +1803,28 @@ typedef struct _WINEDDOVERLAYFX #define WINEDDFLIP_INTERVAL3 0x03000000 #define WINEDDFLIP_INTERVAL4 0x04000000
+#define WINEDDOVER_ALPHADEST 0x00000001 +#define WINEDDOVER_ALPHADESTCONSTOVERRIDE 0x00000002 +#define WINEDDOVER_ALPHADESTNEG 0x00000004 +#define WINEDDOVER_ALPHADESTSURFACEOVERRIDE 0x00000008 +#define WINEDDOVER_ALPHAEDGEBLEND 0x00000010 +#define WINEDDOVER_ALPHASRC 0x00000020 +#define WINEDDOVER_ALPHASRCCONSTOVERRIDE 0x00000040 +#define WINEDDOVER_ALPHASRCNEG 0x00000080 +#define WINEDDOVER_ALPHASRCSURFACEOVERRIDE 0x00000100 +#define WINEDDOVER_HIDE 0x00000200 +#define WINEDDOVER_KEYDEST 0x00000400 +#define WINEDDOVER_KEYDESTOVERRIDE 0x00000800 +#define WINEDDOVER_KEYSRC 0x00001000 +#define WINEDDOVER_KEYSRCOVERRIDE 0x00002000 +#define WINEDDOVER_SHOW 0x00004000 +#define WINEDDOVER_ADDDIRTYRECT 0x00008000 +#define WINEDDOVER_REFRESHDIRTYRECTS 0x00010000 +#define WINEDDOVER_REFRESHALL 0x00020000 +#define WINEDDOVER_DDFX 0x00080000 +#define WINEDDOVER_AUTOFLIP 0x00100000 +#define WINEDDOVER_BOB 0x00200000 +#define WINEDDOVER_OVERRIDEBOBWEAVE 0x00400000 +#define WINEDDOVER_INTERLEAVED 0x00800000 + #endif