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