From 9b29fb68605c0cc74a8012ce6f879f904c0117d4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20D=C3=B6singer?= Date: Tue, 9 May 2006 19:37:38 +0200 Subject: [PATCH] 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 e6fc8cce4a7..497b22afe76 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -1739,8 +1739,89 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetPalette(IWineD3DSurface *iface, IWineD3DPa } 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 efdafd10f53..389d475b8de 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -835,6 +835,14 @@ struct IWineD3DSurfaceImpl /* 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; -- 2.11.4.GIT