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