Stefan Dösinger : ddraw: Primary surfaces always have screen size.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 7 15:26:47 CDT 2007


Module: wine
Branch: master
Commit: 00e37a81b244a67771a4aef72a457027cfac73fe
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=00e37a81b244a67771a4aef72a457027cfac73fe

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Sat Apr 28 17:29:17 2007 +0200

ddraw: Primary surfaces always have screen size.

---

 dlls/ddraw/ddraw.c          |   37 ++++-------------
 dlls/ddraw/tests/dsurface.c |   95 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 103 insertions(+), 29 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 59d82b2..a3a9199 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2328,43 +2328,22 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface,
         }
     }
 
-    /* No Width or no Height? Use the current window size or
-     * the original screen size
+    /* No Width or no Height? Use the original screen size
      */
     if(!(desc2.dwFlags & DDSD_WIDTH) ||
        !(desc2.dwFlags & DDSD_HEIGHT) )
     {
-        HWND window;
+        /* Invalid for non-render targets */
+        if(!(desc2.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE))
+        {
+            WARN("Creating a non-Primary surface without Width or Height info, returning DDERR_INVALIDPARAMS\n");
+            *Surf = NULL;
+            return DDERR_INVALIDPARAMS;
+        }
 
-        /* Fallback: From WineD3D / original mode */
         desc2.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT;
         desc2.dwWidth = Mode.Width;
         desc2.dwHeight = Mode.Height;
-
-        hr = IWineD3DDevice_GetHWND(This->wineD3DDevice,
-                                    &window);
-        if( (hr == D3D_OK) && (window != 0) )
-        {
-            RECT rect;
-            if(GetWindowRect(window, &rect) )
-            {
-                /* This is a hack until I find a better solution */
-                if( (rect.right - rect.left) <= 1 ||
-                    (rect.bottom - rect.top) <= 1 )
-                {
-                    FIXME("Wanted to get surface dimensions from window %p, but it has only "
-                           "a size of %dx%d. Using full screen dimensions\n",
-                           window, rect.right - rect.left, rect.bottom - rect.top);
-                }
-                else
-                {
-                    /* Not sure if this is correct */
-                    desc2.dwWidth = rect.right - rect.left;
-                    desc2.dwHeight = rect.bottom - rect.top;
-                    TRACE("Using window %p's dimensions: %dx%d\n", window, desc2.dwWidth, desc2.dwHeight);
-                }
-            }
-        }
     }
 
     /* Mipmap count fixes */
diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index c901f66..a2fd5d6 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -4,6 +4,7 @@
  * Copyright (C) 2005 Antoine Chavasse (a.chavasse at gmail.com)
  * Copyright (C) 2005 Christian Costa
  * Copyright 2005 Ivan Leo Puoti
+ * Copyright (C) 2007 Stefan Dösinger
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1724,6 +1725,99 @@ static void CompressedTest(void)
     IDirectDraw7_Release(dd7);
 }
 
+static void SizeTest(void)
+{
+    LPDIRECTDRAWSURFACE dsurface = NULL;
+    DDSURFACEDESC desc;
+    HRESULT ret;
+    HWND window = CreateWindow( "static", "ddraw_test", WS_OVERLAPPEDWINDOW, 100, 100, 160, 160, NULL, NULL, NULL, NULL );
+
+    /* Create an offscreen surface surface without a size */
+    ZeroMemory(&desc, sizeof(desc));
+    desc.dwSize = sizeof(desc);
+    desc.dwFlags = DDSD_CAPS;
+    desc.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN;
+    ret = IDirectDraw_CreateSurface(lpDD, &desc, &dsurface, NULL);
+    ok(ret == DDERR_INVALIDPARAMS, "Creating an offscreen plain surface without a size info returned %08x\n", ret);
+    if(dsurface)
+    {
+        trace("Surface at %p\n", dsurface);
+        IDirectDrawSurface_Release(dsurface);
+        dsurface = NULL;
+    }
+
+    /* Create an offscreen surface surface with only a width parameter */
+    ZeroMemory(&desc, sizeof(desc));
+    desc.dwSize = sizeof(desc);
+    desc.dwFlags = DDSD_CAPS | DDSD_WIDTH;
+    desc.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN;
+    desc.dwWidth = 128;
+    ret = IDirectDraw_CreateSurface(lpDD, &desc, &dsurface, NULL);
+    ok(ret == DDERR_INVALIDPARAMS, "Creating an offscreen plain surface without hight info returned %08x\n", ret);
+    if(dsurface)
+    {
+        IDirectDrawSurface_Release(dsurface);
+        dsurface = NULL;
+    }
+
+    /* Create an offscreen surface surface with only a height parameter */
+    ZeroMemory(&desc, sizeof(desc));
+    desc.dwSize = sizeof(desc);
+    desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT;
+    desc.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN;
+    desc.dwHeight = 128;
+    ret = IDirectDraw_CreateSurface(lpDD, &desc, &dsurface, NULL);
+    ok(ret == DDERR_INVALIDPARAMS, "Creating an offscreen plain surface without width info returned %08x\n", ret);
+    if(dsurface)
+    {
+        IDirectDrawSurface_Release(dsurface);
+        dsurface = NULL;
+    }
+
+    /* Sanity check */
+    ZeroMemory(&desc, sizeof(desc));
+    desc.dwSize = sizeof(desc);
+    desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
+    desc.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN;
+    desc.dwHeight = 128;
+    desc.dwWidth = 128;
+    ret = IDirectDraw_CreateSurface(lpDD, &desc, &dsurface, NULL);
+    ok(ret == DD_OK, "Creating an offscreen plain surface with width and height info returned %08x\n", ret);
+    if(dsurface)
+    {
+        IDirectDrawSurface_Release(dsurface);
+        dsurface = NULL;
+    }
+
+    /* Test a primary surface size */
+    ret = IDirectDraw_SetCooperativeLevel(lpDD, window, DDSCL_NORMAL);
+    ok(ret == DD_OK, "SetCooperativeLevel failed with %08x\n", ret);
+
+    ZeroMemory(&desc, sizeof(desc));
+    desc.dwSize = sizeof(desc);
+    desc.dwFlags = DDSD_CAPS;
+    desc.ddsCaps.dwCaps |= DDSCAPS_PRIMARYSURFACE;
+    desc.dwHeight = 128; /* Keep them set to  check what happens */
+    desc.dwWidth = 128; /* Keep them set to  check what happens */
+    ret = IDirectDraw_CreateSurface(lpDD, &desc, &dsurface, NULL);
+    ok(ret == DD_OK, "Creating a primary surface without width and height info returned %08x\n", ret);
+    if(dsurface)
+    {
+        ret = IDirectDrawSurface_GetSurfaceDesc(dsurface, &desc);
+        ok(ret == DD_OK, "GetSurfaceDesc returned %x\n", ret);
+
+        IDirectDrawSurface_Release(dsurface);
+        dsurface = NULL;
+
+        ok(desc.dwFlags & DDSD_WIDTH, "Primary surface doesn't have width set\n");
+        ok(desc.dwFlags & DDSD_HEIGHT, "Primary surface doesn't have hight set\n");
+        ok(desc.dwWidth == GetSystemMetrics(SM_CXSCREEN), "Surface Width differs from screen Width\n");
+        ok(desc.dwHeight == GetSystemMetrics(SM_CYSCREEN), "Surface Width differs from screen Width\n");
+    }
+    ret = IDirectDraw_SetCooperativeLevel(lpDD, NULL, DDSCL_NORMAL);
+    ok(ret == DD_OK, "SetCooperativeLevel failed with %08x\n", ret);
+}
+
 START_TEST(dsurface)
 {
     if (!CreateDirectDraw())
@@ -1740,5 +1834,6 @@ START_TEST(dsurface)
     CubeMapTest();
     test_lockrect_invalid();
     CompressedTest();
+    SizeTest();
     ReleaseDirectDraw();
 }




More information about the wine-cvs mailing list