Stefan Dösinger : wined3d: Track overlay surfaces in the overlayed surface.

Alexandre Julliard julliard at winehq.org
Tue Aug 5 07:26:42 CDT 2008


Module: wine
Branch: master
Commit: dff3a422338b839876b305c288c5fbb654d656d2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=dff3a422338b839876b305c288c5fbb654d656d2

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Wed Jul 30 15:28:25 2008 -0500

wined3d: Track overlay surfaces in the overlayed surface.

---

 dlls/wined3d/device.c          |    1 +
 dlls/wined3d/surface.c         |    4 ++++
 dlls/wined3d/surface_base.c    |   10 ++++++++--
 dlls/wined3d/surface_gdi.c     |    4 ++++
 dlls/wined3d/wined3d_private.h |    2 ++
 5 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index dab4b38..49a72eb 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -660,6 +660,7 @@ static HRESULT  WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U
     object->currentDesc.MultiSampleType    = MultiSample;
     object->currentDesc.MultiSampleQuality = MultisampleQuality;
     object->glDescription.level            = Level;
+    list_init(&object->overlays);
 
     /* Flags */
     object->Flags      = SFLAG_NORMCOORD; /* Default to normalized coords */
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 1ea221c..07c7076 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -474,6 +474,10 @@ ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface) {
         if(iface == device->ddraw_primary)
             device->ddraw_primary = NULL;
 
+        if(This->overlay_dest) {
+            list_remove(&This->overlay_entry);
+        }
+
         TRACE("(%p) Released\n", This);
         HeapFree(GetProcessHeap(), 0, This);
 
diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c
index 3816329..bace476 100644
--- a/dlls/wined3d/surface_base.c
+++ b/dlls/wined3d/surface_base.c
@@ -450,9 +450,15 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_UpdateOverlay(IWineD3DSurface *iface, REC
         This->overlay_destrect.bottom = Dst ? Dst->currentDesc.Height : 0;
     }
 
-    if(Flags & WINEDDOVER_SHOW) {
-        This->overlay_dest = Dst;
+    if(This->overlay_dest && (This->overlay_dest != Dst || Flags & WINEDDOVER_HIDE)) {
+        list_remove(&This->overlay_entry);
+    }
 
+    if(Flags & WINEDDOVER_SHOW) {
+        if(This->overlay_dest != Dst) {
+            This->overlay_dest = Dst;
+            list_add_tail(&Dst->overlays, &This->overlay_entry);
+        }
     } else if(Flags & WINEDDOVER_HIDE) {
         /* tests show that the rectangles are erased on hide */
         This->overlay_srcrect.left   = 0; This->overlay_srcrect.top     = 0;
diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c
index 60564b4..1b1e5db 100644
--- a/dlls/wined3d/surface_gdi.c
+++ b/dlls/wined3d/surface_gdi.c
@@ -160,6 +160,10 @@ ULONG WINAPI IWineGDISurfaceImpl_Release(IWineD3DSurface *iface) {
         if(iface == device->ddraw_primary)
             device->ddraw_primary = NULL;
 
+        if(This->overlay_dest) {
+            list_remove(&This->overlay_entry);
+        }
+
         TRACE("(%p) Released\n", This);
         HeapFree(GetProcessHeap(), 0, This);
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 669e865..91617e8 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1331,6 +1331,8 @@ struct IWineD3DSurfaceImpl
     RECT                      overlay_srcrect;
     RECT                      overlay_destrect;
     IWineD3DSurfaceImpl       *overlay_dest;
+    struct list               overlays;
+    struct list               overlay_entry;
 };
 
 extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl;




More information about the wine-cvs mailing list