From e95ffacde05fc6e0d77c9d2af381b1a99cb0ad3d Mon Sep 17 00:00:00 2001 From: Christian Costa Date: Thu, 15 Oct 2009 00:06:26 +0200 Subject: [PATCH] ddraw: Make SetColorKey handle case where dwColorSpaceHighValue < dwColorSpaceLowValue + tests. --- dlls/ddraw/surface.c | 16 +++++++++++----- dlls/ddraw/tests/dsurface.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 3d41d18209..bfe83a4905 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 c0e84befbf..1feab9b74d 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); -- 2.32.0.93.g670b81a890