Stefan Dösinger : wined3d: Implement overlay position tracking.
Alexandre Julliard
julliard at winehq.org
Tue Aug 5 07:26:40 CDT 2008
Module: wine
Branch: master
Commit: e795d842ec092a4d136da078231e5a007292cda0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e795d842ec092a4d136da078231e5a007292cda0
Author: Stefan Dösinger <stefan at 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
More information about the wine-cvs
mailing list