Stefan Dösinger : wined3d: Implement IWineD3DSurface:: SetColorKey.

Alexandre Julliard julliard at wine.codeweavers.com
Tue May 9 14:15:38 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 9b29fb68605c0cc74a8012ce6f879f904c0117d4
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=9b29fb68605c0cc74a8012ce6f879f904c0117d4

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Tue May  9 19:37:38 2006 +0200

wined3d: Implement IWineD3DSurface::SetColorKey.

---

 dlls/wined3d/surface.c         |   85 +++++++++++++++++++++++++++++++++++++++-
 dlls/wined3d/wined3d_private.h |    8 ++++
 2 files changed, 91 insertions(+), 2 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index e6fc8cc..497b22a 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1739,8 +1739,89 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetPa
 }
 
 HRESULT WINAPI IWineD3DSurfaceImpl_SetColorKey(IWineD3DSurface *iface, DWORD Flags, DDCOLORKEY *CKey) {
-    FIXME("This is unimplemented for now(d3d7 merge)\n");
-    return WINED3DERR_INVALIDCALL;
+    IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
+    BOOL dirtify = FALSE;
+    TRACE("(%p)->(%08lx,%p)\n", This, Flags, CKey);
+
+    if ((Flags & DDCKEY_COLORSPACE) != 0) {
+        FIXME(" colorkey value not supported (%08lx) !\n", Flags);
+        return DDERR_INVALIDPARAMS;
+    }
+
+    /* Dirtify the surface, but only if a key was changed */
+    if(CKey) {
+        switch (Flags & ~DDCKEY_COLORSPACE) {
+            case DDCKEY_DESTBLT:
+                if(!(This->CKeyFlags & DDSD_CKDESTBLT)) {
+                    dirtify = TRUE;
+                } else {
+                    dirtify = memcmp(&This->DestBltCKey, CKey, sizeof(*CKey) ) != 0;
+                }
+                This->DestBltCKey = *CKey;
+                This->CKeyFlags |= DDSD_CKDESTBLT;
+                break;
+
+            case DDCKEY_DESTOVERLAY:
+                if(!(This->CKeyFlags & DDSD_CKDESTOVERLAY)) {
+                    dirtify = TRUE;
+                } else {
+                    dirtify = memcmp(&This->DestOverlayCKey, CKey, sizeof(*CKey)) != 0;
+                }
+                This->DestOverlayCKey = *CKey;
+                This->CKeyFlags |= DDSD_CKDESTOVERLAY;
+                break;
+
+            case DDCKEY_SRCOVERLAY:
+                if(!(This->CKeyFlags & DDSD_CKSRCOVERLAY)) {
+                    dirtify = TRUE;
+                } else {
+                    dirtify = memcmp(&This->SrcOverlayCKey, CKey, sizeof(*CKey)) != 0;
+                }
+                This->SrcOverlayCKey = *CKey;
+                This->CKeyFlags |= DDSD_CKSRCOVERLAY;
+                break;
+
+            case DDCKEY_SRCBLT:
+                if(!(This->CKeyFlags & DDSD_CKSRCBLT)) {
+                    dirtify = TRUE;
+                } else {
+                    dirtify = memcmp(&This->SrcBltCKey, CKey, sizeof(*CKey)) != 0;
+                }
+                This->SrcBltCKey = *CKey;
+                This->CKeyFlags |= DDSD_CKSRCBLT;
+                break;
+        }
+    }
+    else {
+        switch (Flags & ~DDCKEY_COLORSPACE) {
+            case DDCKEY_DESTBLT:
+                dirtify = This->CKeyFlags & DDSD_CKDESTBLT;
+                This->CKeyFlags &= ~DDSD_CKDESTBLT;
+                break;
+
+            case DDCKEY_DESTOVERLAY:
+                dirtify = This->CKeyFlags & DDSD_CKDESTOVERLAY;
+                This->CKeyFlags &= ~DDSD_CKDESTOVERLAY;
+                break;
+
+            case DDCKEY_SRCOVERLAY:
+                dirtify = This->CKeyFlags & DDSD_CKSRCOVERLAY;
+                This->CKeyFlags &= ~DDSD_CKSRCOVERLAY;
+                break;
+
+            case DDCKEY_SRCBLT:
+                dirtify = This->CKeyFlags & DDSD_CKSRCBLT;
+                This->CKeyFlags &= ~DDSD_CKSRCBLT;
+                break;
+        }
+    }
+
+    if(dirtify) {
+        TRACE("Color key changed, dirtifing surface\n");
+        This->Flags |= SFLAG_DIRTY;
+    }
+
+    return WINED3D_OK;
 }
 
 HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index efdafd1..389d475 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -835,6 +835,14 @@ #endif
     /* For GetDC */
     wineD3DSurface_DIB        dib;
     HDC                       hDC;
+
+    /* Color keys for DDraw */
+    DDCOLORKEY                DestBltCKey;
+    DDCOLORKEY                DestOverlayCKey;
+    DDCOLORKEY                SrcOverlayCKey;
+    DDCOLORKEY                SrcBltCKey;
+    DWORD                     CKeyFlags;
+
 };
 
 extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl;




More information about the wine-cvs mailing list