=?UTF-8?Q?Ri=C4=8Dardas=20Barkauskas=20?=: ddraw: Don' t allow SetPalette on mipmap sublevels instead of root surfaces.

Alexandre Julliard julliard at winehq.org
Fri Sep 2 13:13:39 CDT 2011


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

Author: Ričardas Barkauskas <rbarkauskas at codeweavers.com>
Date:   Fri Sep  2 16:37:20 2011 +0300

ddraw: Don't allow SetPalette on mipmap sublevels instead of root surfaces.

---

 dlls/ddraw/surface.c        |    2 +-
 dlls/ddraw/tests/d3d.c      |    3 +
 dlls/ddraw/tests/dsurface.c |  101 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 105 insertions(+), 1 deletions(-)

diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index c7d52d7..fecda89 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -4225,7 +4225,7 @@ static HRESULT WINAPI ddraw_surface7_SetPalette(IDirectDrawSurface7 *iface, IDir
         return DDERR_INVALIDPIXELFORMAT;
     }
 
-    if (!This->is_complex_root)
+    if (This->surface_desc.ddsCaps.dwCaps2 & DDSCAPS2_MIPMAPSUBLEVEL)
     {
         return DDERR_NOTONMIPMAPSUBLEVEL;
     }
diff --git a/dlls/ddraw/tests/d3d.c b/dlls/ddraw/tests/d3d.c
index c799678..68d9604 100644
--- a/dlls/ddraw/tests/d3d.c
+++ b/dlls/ddraw/tests/d3d.c
@@ -3029,6 +3029,9 @@ static void DeviceLoadTest(void)
     hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[1][0], NULL, texture_levels[0][0], NULL, 0);
     ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n",hr);
 
+    hr = IDirectDrawSurface7_GetPalette(texture_levels[0][1], &palettes[4]);
+    ok(hr==DDERR_NOPALETTEATTACHED, "IDirectDrawSurface7_GetPalette returned: %x\n", hr);
+
     hr = IDirectDrawSurface7_GetPalette(texture_levels[1][0], &palettes[4]);
     ok(hr==DDERR_NOPALETTEATTACHED, "IDirectDrawSurface7_GetPalette returned: %x\n", hr);
 
diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index b4e158b..b93dd14 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -1632,6 +1632,21 @@ struct compare
     UINT mips;
 };
 
+static HRESULT WINAPI CubeTestPaletteEnum(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *desc, void *context)
+{
+    HRESULT hr;
+
+    hr = IDirectDrawSurface7_SetPalette(surface, context);
+    if (desc->dwWidth == 64) /* This is for first mimpmap */
+        ok(hr == DDERR_NOTONMIPMAPSUBLEVEL, "SetPalette returned: %x\n",hr);
+    else
+        ok(hr == DD_OK, "SetPalette returned: %x\n",hr);
+
+    IDirectDrawSurface7_Release(surface);
+
+    return DDENUMRET_OK;
+}
+
 static HRESULT WINAPI CubeTestLvl2Enum(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *desc, void *context)
 {
     UINT *mips = context;
@@ -1710,11 +1725,23 @@ static void CubeMapTest(void)
 {
     IDirectDraw7 *dd7 = NULL;
     IDirectDrawSurface7 *cubemap = NULL;
+    IDirectDrawPalette *palette = NULL;
     DDSURFACEDESC2 ddsd;
     HRESULT hr;
+    PALETTEENTRY Table[256];
+    int i;
     UINT num = 0;
+    UINT ref;
     struct enumstruct ctx;
 
+    for(i=0; i<256; i++)
+    {
+        Table[i].peRed   = 0xff;
+        Table[i].peGreen = 0;
+        Table[i].peBlue  = 0;
+        Table[i].peFlags = 0;
+    }
+
     hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7);
     ok(hr == DD_OK, "IDirectDraw::QueryInterface returned %08x\n", hr);
     if (FAILED(hr)) goto err;
@@ -1814,6 +1841,41 @@ static void CubeMapTest(void)
     hr = IDirectDraw7_CreateSurface(dd7, &ddsd, &cubemap, NULL);
     ok(hr == DDERR_INVALIDCAPS, "IDirectDraw7::CreateSurface returned %08x\n", hr);
 
+    memset(&ddsd, 0, sizeof(ddsd));
+    ddsd.dwSize = sizeof(ddsd);
+    U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
+    ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_CAPS;
+    ddsd.dwWidth = 128;
+    ddsd.dwHeight = 128;
+    ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP | DDSCAPS_SYSTEMMEMORY;
+    ddsd.ddsCaps.dwCaps2 = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALLFACES;
+
+    U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8;
+    U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 8;
+
+    hr = IDirectDraw7_CreateSurface(dd7, &ddsd, &cubemap, NULL);
+    if (FAILED(hr))
+    {
+        skip("Can't create palletized cubemap surface\n");
+        goto err;
+    }
+
+    hr = IDirectDraw7_CreatePalette(dd7, DDPCAPS_ALLOW256 | DDPCAPS_8BIT, Table, &palette, NULL);
+    ok(hr == DD_OK, "CreatePalette failed with %08x\n", hr);
+
+    hr = IDirectDrawSurface7_EnumAttachedSurfaces(cubemap, palette, CubeTestPaletteEnum);
+    ok(hr == DD_OK, "EnumAttachedSurfaces failed\n");
+
+    ref = getRefcount((IUnknown *) palette);
+    ok(ref == 6, "Refcount is %u, expected 1\n", ref);
+
+    IDirectDrawSurface7_Release(cubemap);
+
+    ref = getRefcount((IUnknown *) palette);
+    todo_wine ok(ref == 1, "Refcount is %u, expected 1\n", ref);
+
+    IDirectDrawPalette_Release(palette);
+
     /* Make sure everything is cleaned up properly. Use the enumSurfaces test infrastructure */
     memset(&ctx, 0, sizeof(ctx));
     memset(&ddsd, 0, sizeof(ddsd));
@@ -2656,6 +2718,8 @@ static void PaletteTest(void)
 {
     HRESULT hr;
     LPDIRECTDRAWSURFACE lpSurf = NULL;
+    IDirectDrawSurface *backbuffer = NULL;
+    DDSCAPS ddscaps;
     DDSURFACEDESC ddsd;
     IDirectDrawPalette *palette = NULL;
     PALETTEENTRY Table[256];
@@ -2760,6 +2824,43 @@ static void PaletteTest(void)
 
     if (lpSurf) IDirectDrawSurface_Release(lpSurf);
     if (palette) IDirectDrawPalette_Release(palette);
+
+    hr = IDirectDraw_CreatePalette(lpDD, DDPCAPS_ALLOW256 | DDPCAPS_8BIT, Table, &palette, NULL);
+    ok(hr == DD_OK, "CreatePalette failed with %08x\n", hr);
+
+    ddsd.dwSize = sizeof(ddsd);
+    ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
+    ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_BACKBUFFERCOUNT;
+    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
+    ddsd.dwWidth = 64;
+    ddsd.dwHeight = 64;
+    ddsd.dwBackBufferCount = 1;
+    ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8;
+    U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 8;
+
+    hr = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpSurf, NULL);
+    ok(hr==DD_OK, "CreateSurface returned: %x\n",hr);
+    if (FAILED(hr))
+    {
+        skip("failed to create surface\n");
+        return;
+    }
+
+    ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
+    hr = IDirectDrawSurface_GetAttachedSurface(lpSurf, &ddscaps, &backbuffer);
+    ok(hr == DD_OK, "GetAttachedSurface returned: %x\n",hr);
+
+    hr = IDirectDrawSurface_SetPalette(backbuffer, palette);
+    ok(hr == DD_OK, "SetPalette returned: %x\n",hr);
+
+    IDirectDrawPalette_Release(palette);
+    palette = NULL;
+
+    hr = IDirectDrawSurface_GetPalette(backbuffer, &palette);
+    ok(hr == DD_OK, "CreateSurface returned: %x\n",hr);
+
+    IDirectDrawSurface_Release(backbuffer);
+    IDirectDrawSurface_Release(lpSurf);
 }
 
 static void StructSizeTest(void)




More information about the wine-cvs mailing list