[PATCH] ddraw: Make SetColorKey handle case where dwColorSpaceHighValue < dwColorSpaceLowValue + tests.
Christian Costa
titan.costa at wanadoo.fr
Wed Oct 14 17:06:26 CDT 2009
---
dlls/ddraw/surface.c | 16 +++++++++++-----
dlls/ddraw/tests/dsurface.c | 31 +++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 5 deletions(-)
-------------- next part --------------
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 3d41d18..bfe83a4 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -2429,31 +2429,37 @@ IDirectDrawSurfaceImpl_SetColorKey(IDirectDrawSurface7 *iface,
DDCOLORKEY *CKey)
{
IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
- struct SCKContext ctx = { DD_OK, (WINEDDCOLORKEY *) CKey, Flags };
+ DDCOLORKEY FixedCKey;
+ struct SCKContext ctx = { DD_OK, (WINEDDCOLORKEY *) (CKey ? &FixedCKey : NULL), Flags };
TRACE("(%p)->(%x,%p)\n", This, Flags, CKey);
EnterCriticalSection(&ddraw_cs);
if (CKey)
{
+ FixedCKey = *CKey;
+ /* Handle case where dwColorSpaceHighValue < dwColorSpaceLowValue */
+ if (FixedCKey.dwColorSpaceHighValue < FixedCKey.dwColorSpaceLowValue)
+ FixedCKey.dwColorSpaceHighValue = FixedCKey.dwColorSpaceLowValue;
+
switch (Flags & ~DDCKEY_COLORSPACE)
{
case DDCKEY_DESTBLT:
- This->surface_desc.ddckCKDestBlt = *CKey;
+ This->surface_desc.ddckCKDestBlt = FixedCKey;
This->surface_desc.dwFlags |= DDSD_CKDESTBLT;
break;
case DDCKEY_DESTOVERLAY:
- This->surface_desc.u3.ddckCKDestOverlay = *CKey;
+ This->surface_desc.u3.ddckCKDestOverlay = FixedCKey;
This->surface_desc.dwFlags |= DDSD_CKDESTOVERLAY;
break;
case DDCKEY_SRCOVERLAY:
- This->surface_desc.ddckCKSrcOverlay = *CKey;
+ This->surface_desc.ddckCKSrcOverlay = FixedCKey;
This->surface_desc.dwFlags |= DDSD_CKSRCOVERLAY;
break;
case DDCKEY_SRCBLT:
- This->surface_desc.ddckCKSrcBlt = *CKey;
+ This->surface_desc.ddckCKSrcBlt = FixedCKey;
This->surface_desc.dwFlags |= DDSD_CKSRCBLT;
break;
diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index c0e84be..1feab9b 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -325,6 +325,37 @@ static void SrcColorKey32BlitTest(void)
ok(ddsd.ddckCKSrcBlt.dwColorSpaceLowValue == 0x00FF00 && ddsd.ddckCKSrcBlt.dwColorSpaceHighValue == 0x00FF00,
"GetSurfaceDesc does not return the colorkey set with SetColorKey\n");
+ /* Test SetColorKey with dwColorSpaceHighValue < dwColorSpaceLowValue */
+ DDColorKey.dwColorSpaceLowValue = 0x0000FF;
+ DDColorKey.dwColorSpaceHighValue = 0x000000;
+ IDirectDrawSurface_SetColorKey(lpSrc, DDCKEY_SRCBLT, &DDColorKey);
+
+ DDColorKey.dwColorSpaceLowValue = 0;
+ DDColorKey.dwColorSpaceHighValue = 0;
+ IDirectDrawSurface_GetColorKey(lpSrc, DDCKEY_SRCBLT, &DDColorKey);
+ ok(DDColorKey.dwColorSpaceLowValue == 0x0000FF && DDColorKey.dwColorSpaceHighValue == 0x0000FF,
+ "GetColorKey does not return the colorkey set with SetColorKey (%x %x)\n", DDColorKey.dwColorSpaceLowValue, DDColorKey.dwColorSpaceHighValue);
+
+ DDColorKey.dwColorSpaceLowValue = 0x0000FF;
+ DDColorKey.dwColorSpaceHighValue = 0x000001;
+ IDirectDrawSurface_SetColorKey(lpSrc, DDCKEY_SRCBLT, &DDColorKey);
+
+ DDColorKey.dwColorSpaceLowValue = 0;
+ DDColorKey.dwColorSpaceHighValue = 0;
+ IDirectDrawSurface_GetColorKey(lpSrc, DDCKEY_SRCBLT, &DDColorKey);
+ ok(DDColorKey.dwColorSpaceLowValue == 0x0000FF && DDColorKey.dwColorSpaceHighValue == 0x0000FF,
+ "GetColorKey does not return the colorkey set with SetColorKey (%x %x)\n", DDColorKey.dwColorSpaceLowValue, DDColorKey.dwColorSpaceHighValue);
+
+ DDColorKey.dwColorSpaceLowValue = 0x0000FF;
+ DDColorKey.dwColorSpaceHighValue = 0x0000FE;
+ IDirectDrawSurface_SetColorKey(lpSrc, DDCKEY_SRCBLT, &DDColorKey);
+
+ DDColorKey.dwColorSpaceLowValue = 0;
+ DDColorKey.dwColorSpaceHighValue = 0;
+ IDirectDrawSurface_GetColorKey(lpSrc, DDCKEY_SRCBLT, &DDColorKey);
+ ok(DDColorKey.dwColorSpaceLowValue == 0x0000FF && DDColorKey.dwColorSpaceHighValue == 0x0000FF,
+ "GetColorKey does not return the colorkey set with SetColorKey (%x %x)\n", DDColorKey.dwColorSpaceLowValue, DDColorKey.dwColorSpaceHighValue);
+
IDirectDrawSurface_Release(lpSrc);
IDirectDrawSurface_Release(lpDst);
More information about the wine-patches
mailing list