[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