~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Wine Cross Reference
wine/dlls/ddraw/tests/dsurface.c

Version: ~ [ wine-1.1.3 ] ~ [ wine-1.1.2 ] ~ [ wine-1.1.1 ] ~ [ wine-1.1.0 ] ~ [ wine-1.0 ] ~ [ wine-1.0-rc5 ] ~ [ wine-1.0-rc4 ] ~ [ wine-1.0-rc3 ] ~ [ wine-1.0-rc2 ] ~ [ wine-1.0-rc1 ] ~ [ wine-0.9.61 ] ~ [ wine-0.9.60 ] ~ [ wine-0.9.59 ] ~ [ wine-0.9.58 ] ~ [ wine-0.9.57 ] ~ [ wine-0.9.56 ] ~ [ wine-0.9.55 ] ~ [ wine-0.9.54 ] ~ [ wine-0.9.53 ] ~ [ wine-0.9.52 ] ~ [ wine-0.9.51 ] ~ [ wine-0.9.50 ] ~ [ wine-0.9.49 ] ~ [ wine-0.9.48 ] ~ [ wine-0.9.47 ] ~ [ wine-0.9.46 ] ~ [ wine-0.9.45 ] ~ [ wine-0.9.44 ] ~ [ wine-0.9.43 ] ~ [ wine-0.9.42 ] ~ [ wine-0.9.41 ] ~ [ wine-0.9.40 ] ~ [ wine-0.9.39 ] ~ [ wine-0.9.38 ] ~ [ wine-0.9.37 ] ~ [ wine-0.9.36 ] ~ [ wine-0.9.35 ] ~ [ wine-0.9.34 ] ~ [ wine-0.9.33 ] ~ [ wine-0.9.32 ] ~ [ wine-0.9.31 ] ~ [ wine-0.9.30 ] ~ [ wine-0.9.29 ] ~ [ wine-0.9.28 ] ~ [ wine-0.9.27 ] ~ [ wine-0.9.26 ] ~ [ wine-0.9.25 ] ~ [ wine-0.9.24 ] ~ [ wine-0.9.23 ] ~ [ wine-0.9.22 ] ~ [ wine-0.9.21 ] ~ [ wine-0.9.20 ] ~ [ wine-0.9.19 ] ~ [ wine-0.9.18 ] ~ [ wine-0.9.17 ] ~ [ wine-0.9.16 ] ~ [ wine-0.9.15 ] ~ [ wine-0.9.14 ] ~ [ wine-0.9.13 ] ~ [ wine-0.9.12 ] ~ [ wine-0.9.11 ] ~ [ wine-0.9.10 ] ~ [ wine-0.9.9 ] ~ [ wine-0.9.8 ] ~ [ wine-0.9.7 ] ~ [ wine-0.9.6 ] ~ [ wine-0.9.5 ] ~ [ wine-0.9.4 ] ~ [ wine-0.9.3 ] ~ [ wine-0.9.2 ] ~ [ wine-0.9.1 ] ~ [ wine-0.9 ] ~ [ wine20050930 ] ~ [ wine20050830 ] ~ [ wine20050725 ] ~ [ wine20050628 ] ~ [ wine20050524 ] ~ [ wine20050419 ] ~ [ wine20050310 ] ~ [ wine20050211 ] ~ [ wine20050111 ] ~ [ wine20041201 ] ~ [ wine20041019 ] ~ [ wine20040914 ] ~ [ wine20040813 ] ~ [ wine20040716 ] ~ [ wine20040615 ] ~ [ wine20040505 ] ~ [ wine20040408 ] ~ [ wine20040309 ] ~ [ wine20040213 ] ~ [ wine20040121 ] ~ [ wine20031212 ] ~ [ wine20031118 ] ~ [ wine20031016 ] ~ [ wine20030911 ] ~ [ wine20030813 ] ~ [ wine20030709 ] ~ [ wine20030618 ] ~ [ wine20030508 ] ~ [ wine20030408 ] ~ [ wine20030318 ] ~ [ wine20030219 ] ~ [ wine20030115 ] ~ [ wine20021219 ] ~ [ wine20021125 ] ~ [ wine20021031 ] ~ [ wine20021007 ] ~ [ wine20020904 ] ~ [ wine20020804 ] ~ [ wine20020710 ] ~ [ wine20020605 ] ~ [ wine20020509 ] ~ [ wine20020411 ] ~ [ wine20020310 ] ~ [ wine20020228 ] ~ [ wine20011226 ] ~ [ wine20011108 ] ~ [ wine20011004 ] ~ [ wine20010824 ] ~ [ wine20010731 ] ~ [ wine20010629 ] ~ [ wine20010510 ] ~ [ wine20010418 ] ~ [ wine20010326 ] ~ [ wine20010305 ] ~ [ wine20010216 ] ~ [ wine20010112 ] ~ [ wine20001222 ] ~ [ wine20001202 ] ~ [ wine20001026 ] ~ [ wine20001002 ] ~ [ wine20000909 ] ~ [ wine20000821 ] ~ [ wine20000801 ] ~ [ wine20000716 ] ~ [ wine20000326 ] ~ [ wine20000227 ] ~ [ wine20000130 ] ~ [ wine20000109 ] ~

  1 /*
  2  * Unit tests for (a few) ddraw surface functions
  3  *
  4  * Copyright (C) 2005 Antoine Chavasse (a.chavasse@gmail.com)
  5  * Copyright (C) 2005 Christian Costa
  6  * Copyright 2005 Ivan Leo Puoti
  7  * Copyright (C) 2007 Stefan Dösinger
  8  * Copyright (C) 2008 Alexander Dorofeyev
  9  *
 10  * This library is free software; you can redistribute it and/or
 11  * modify it under the terms of the GNU Lesser General Public
 12  * License as published by the Free Software Foundation; either
 13  * version 2.1 of the License, or (at your option) any later version.
 14  *
 15  * This library is distributed in the hope that it will be useful,
 16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 18  * Lesser General Public License for more details.
 19  *
 20  * You should have received a copy of the GNU Lesser General Public
 21  * License along with this library; if not, write to the Free Software
 22  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 23  */
 24 #define COBJMACROS
 25 
 26 #include <assert.h>
 27 #include "wine/test.h"
 28 #include "ddraw.h"
 29 #include "unknwn.h"
 30 
 31 static LPDIRECTDRAW lpDD = NULL;
 32 
 33 static BOOL CreateDirectDraw(void)
 34 {
 35     HRESULT rc;
 36 
 37     rc = DirectDrawCreate(NULL, &lpDD, NULL);
 38     ok(rc==DD_OK || rc==DDERR_NODIRECTDRAWSUPPORT, "DirectDrawCreateEx returned: %x\n", rc);
 39     if (!lpDD) {
 40         trace("DirectDrawCreateEx() failed with an error %x\n", rc);
 41         return FALSE;
 42     }
 43 
 44     rc = IDirectDraw_SetCooperativeLevel(lpDD, NULL, DDSCL_NORMAL);
 45     ok(rc==DD_OK,"SetCooperativeLevel returned: %x\n",rc);
 46 
 47     return TRUE;
 48 }
 49 
 50 
 51 static void ReleaseDirectDraw(void)
 52 {
 53     if( lpDD != NULL )
 54     {
 55         IDirectDraw_Release(lpDD);
 56         lpDD = NULL;
 57     }
 58 }
 59 
 60 static void MipMapCreationTest(void)
 61 {
 62     LPDIRECTDRAWSURFACE lpDDSMipMapTest;
 63     DDSURFACEDESC ddsd;
 64     HRESULT rc;
 65 
 66     /* First mipmap creation test: create a surface with DDSCAPS_COMPLEX,
 67        DDSCAPS_MIPMAP, and DDSD_MIPMAPCOUNT. This create the number of
 68         requested mipmap levels. */
 69     ddsd.dwSize = sizeof(ddsd);
 70     ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_MIPMAPCOUNT;
 71     ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
 72     U2(ddsd).dwMipMapCount = 3;
 73     ddsd.dwWidth = 128;
 74     ddsd.dwHeight = 32;
 75     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
 76     ok(rc==DD_OK,"CreateSurface returned: %x\n",rc);
 77     if (FAILED(rc)) {
 78         skip("failed to create surface\n");
 79         return;
 80     }
 81 
 82     /* Check the number of created mipmaps */
 83     memset(&ddsd, 0, sizeof(DDSURFACEDESC));
 84     ddsd.dwSize = sizeof(ddsd);
 85     rc = IDirectDrawSurface_GetSurfaceDesc(lpDDSMipMapTest, &ddsd);
 86     ok(rc==DD_OK,"GetSurfaceDesc returned: %x\n",rc);
 87     ok(ddsd.dwFlags & DDSD_MIPMAPCOUNT,
 88         "GetSurfaceDesc returned no mipmapcount.\n");
 89     ok(U2(ddsd).dwMipMapCount == 3, "Incorrect mipmap count: %d.\n",
 90         U2(ddsd).dwMipMapCount);
 91 
 92     /* Destroy the surface. */
 93     IDirectDrawSurface_Release(lpDDSMipMapTest);
 94 
 95 
 96     /* Second mipmap creation test: create a surface without a mipmap
 97        count, with DDSCAPS_MIPMAP and without DDSCAPS_COMPLEX.
 98        This creates a single mipmap level. */
 99     memset(&ddsd, 0, sizeof(DDSURFACEDESC));
100     ddsd.dwSize = sizeof(ddsd);
101     ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
102     ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_MIPMAP;
103     ddsd.dwWidth = 128;
104     ddsd.dwHeight = 32;
105     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
106     ok(rc==DD_OK,"CreateSurface returned: %x\n",rc);
107     if (FAILED(rc)) {
108         skip("failed to create surface\n");
109         return;
110     }
111     /* Check the number of created mipmaps */
112     memset(&ddsd, 0, sizeof(DDSURFACEDESC));
113     ddsd.dwSize = sizeof(ddsd);
114     rc = IDirectDrawSurface_GetSurfaceDesc(lpDDSMipMapTest, &ddsd);
115     ok(rc==DD_OK,"GetSurfaceDesc returned: %x\n",rc);
116     ok(ddsd.dwFlags & DDSD_MIPMAPCOUNT,
117         "GetSurfaceDesc returned no mipmapcount.\n");
118     ok(U2(ddsd).dwMipMapCount == 1, "Incorrect mipmap count: %d.\n",
119         U2(ddsd).dwMipMapCount);
120 
121     /* Destroy the surface. */
122     IDirectDrawSurface_Release(lpDDSMipMapTest);
123 
124 
125     /* Third mipmap creation test: create a surface with DDSCAPS_MIPMAP,
126         DDSCAPS_COMPLEX and without DDSD_MIPMAPCOUNT.
127        It's an undocumented features where a chain of mipmaps, starting from
128        he specified size and down to the smallest size, is automatically
129        created.
130        Anarchy Online needs this feature to work. */
131     memset(&ddsd, 0, sizeof(DDSURFACEDESC));
132     ddsd.dwSize = sizeof(ddsd);
133     ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
134     ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
135     ddsd.dwWidth = 128;
136     ddsd.dwHeight = 32;
137     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
138     ok(rc==DD_OK,"CreateSurface returned: %x\n",rc);
139     if (FAILED(rc)) {
140         skip("failed to create surface\n");
141         return;
142     }
143 
144     /* Check the number of created mipmaps */
145     memset(&ddsd, 0, sizeof(DDSURFACEDESC));
146     ddsd.dwSize = sizeof(ddsd);
147     rc = IDirectDrawSurface_GetSurfaceDesc(lpDDSMipMapTest, &ddsd);
148     ok(rc==DD_OK,"GetSurfaceDesc returned: %x\n",rc);
149     ok(ddsd.dwFlags & DDSD_MIPMAPCOUNT,
150         "GetSurfaceDesc returned no mipmapcount.\n");
151     ok(U2(ddsd).dwMipMapCount == 6, "Incorrect mipmap count: %d.\n",
152         U2(ddsd).dwMipMapCount);
153 
154     /* Destroy the surface. */
155     IDirectDrawSurface_Release(lpDDSMipMapTest);
156 
157 
158     /* Fourth mipmap creation test: same as above with a different texture
159        size.
160        The purpose is to verify that the number of generated mipmaps is
161        dependent on the smallest dimension. */
162     memset(&ddsd, 0, sizeof(DDSURFACEDESC));
163     ddsd.dwSize = sizeof(ddsd);
164     ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
165     ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
166     ddsd.dwWidth = 32;
167     ddsd.dwHeight = 64;
168     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
169     ok(rc==DD_OK,"CreateSurface returned: %x\n",rc);
170     if (FAILED(rc)) {
171         skip("failed to create surface\n");
172         return;
173     }
174 
175     /* Check the number of created mipmaps */
176     memset(&ddsd, 0, sizeof(DDSURFACEDESC));
177     ddsd.dwSize = sizeof(ddsd);
178     rc = IDirectDrawSurface_GetSurfaceDesc(lpDDSMipMapTest, &ddsd);
179     ok(rc==DD_OK,"GetSurfaceDesc returned: %x\n",rc);
180     ok(ddsd.dwFlags & DDSD_MIPMAPCOUNT,
181         "GetSurfaceDesc returned no mipmapcount.\n");
182     ok(U2(ddsd).dwMipMapCount == 6, "Incorrect mipmap count: %d.\n",
183         U2(ddsd).dwMipMapCount);
184 
185     /* Destroy the surface. */
186     IDirectDrawSurface_Release(lpDDSMipMapTest);
187 
188 
189     /* Fifth mipmap creation test: try to create a surface with
190        DDSCAPS_COMPLEX, DDSCAPS_MIPMAP, DDSD_MIPMAPCOUNT,
191        where dwMipMapCount = 0. This should fail. */
192 
193     ddsd.dwSize = sizeof(ddsd);
194     ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_MIPMAPCOUNT;
195     ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
196     U2(ddsd).dwMipMapCount = 0;
197     ddsd.dwWidth = 128;
198     ddsd.dwHeight = 32;
199     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
200     ok(rc==DDERR_INVALIDPARAMS,"CreateSurface returned: %x\n",rc);
201 
202     /* Destroy the surface. */
203     if( rc == DD_OK )
204         IDirectDrawSurface_Release(lpDDSMipMapTest);
205 
206 }
207 
208 static void SrcColorKey32BlitTest(void)
209 {
210     LPDIRECTDRAWSURFACE lpSrc;
211     LPDIRECTDRAWSURFACE lpDst;
212     DDSURFACEDESC ddsd, ddsd2, ddsd3;
213     DDCOLORKEY DDColorKey;
214     LPDWORD lpData;
215     HRESULT rc;
216     DDBLTFX fx;
217 
218     ddsd2.dwSize = sizeof(ddsd2);
219     ddsd2.ddpfPixelFormat.dwSize = sizeof(ddsd2.ddpfPixelFormat);
220 
221     ddsd.dwSize = sizeof(ddsd);
222     ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
223     ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
224     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
225     ddsd.dwWidth = 800;
226     ddsd.dwHeight = 600;
227     ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
228     U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 32;
229     U2(ddsd.ddpfPixelFormat).dwRBitMask = 0xFF0000;
230     U3(ddsd.ddpfPixelFormat).dwGBitMask = 0x00FF00;
231     U4(ddsd.ddpfPixelFormat).dwBBitMask = 0x0000FF;
232     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDst, NULL);
233     ok(rc==DD_OK,"CreateSurface returned: %x\n",rc);
234     if (FAILED(rc)) {
235         skip("failed to create surface\n");
236         return;
237     }
238 
239     ddsd.dwFlags |= DDSD_CKSRCBLT;
240     ddsd.ddckCKSrcBlt.dwColorSpaceLowValue = 0xFF00FF;
241     ddsd.ddckCKSrcBlt.dwColorSpaceHighValue = 0xFF00FF;
242     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpSrc, NULL);
243     ok(rc==DD_OK,"CreateSurface returned: %x\n",rc);
244     if (FAILED(rc)) {
245         skip("failed to create surface\n");
246         return;
247     }
248 
249     rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
250     ok(rc==DD_OK,"Lock returned: %x\n",rc);
251     lpData = (LPDWORD)ddsd2.lpSurface;
252     lpData[0] = 0xCCCCCCCC;
253     lpData[1] = 0xCCCCCCCC;
254     lpData[2] = 0xCCCCCCCC;
255     lpData[3] = 0xCCCCCCCC;
256 
257     memset(&ddsd3, 0, sizeof(ddsd3));
258     ddsd3.dwSize = sizeof(ddsd3);
259     ddsd3.ddpfPixelFormat.dwSize = sizeof(ddsd3.ddpfPixelFormat);
260     rc = IDirectDrawSurface_GetSurfaceDesc(lpDst, &ddsd3);
261     ok(rc == DD_OK, "IDirectDrawSurface_GetSurfaceDesc between a lock/unlock pair returned %08x\n", rc);
262     ok(ddsd3.lpSurface == ddsd3.lpSurface, "lpSurface from GetSurfaceDesc(%p) differs from the one returned by Lock(%p)\n", ddsd3.lpSurface, ddsd2.lpSurface);
263 
264     rc = IDirectDrawSurface_Unlock(lpDst, NULL);
265     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
266 
267     memset(&ddsd3, 0, sizeof(ddsd3));
268     ddsd3.dwSize = sizeof(ddsd3);
269     ddsd3.ddpfPixelFormat.dwSize = sizeof(ddsd3.ddpfPixelFormat);
270     rc = IDirectDrawSurface_GetSurfaceDesc(lpDst, &ddsd3);
271     ok(rc == DD_OK, "IDirectDrawSurface_GetSurfaceDesc between a lock/unlock pair returned %08x\n", rc);
272     ok(ddsd3.lpSurface == NULL, "lpSurface from GetSurfaceDesc(%p) is not NULL after unlock\n", ddsd3.lpSurface);
273 
274     rc = IDirectDrawSurface_Lock(lpSrc, NULL, &ddsd2, DDLOCK_WAIT, NULL);
275     ok(rc==DD_OK,"Lock returned: %x\n",rc);
276     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
277     lpData = (LPDWORD)ddsd2.lpSurface;
278     lpData[0] = 0x77010203;
279     lpData[1] = 0x00010203;
280     lpData[2] = 0x77FF00FF;
281     lpData[3] = 0x00FF00FF;
282     rc = IDirectDrawSurface_Unlock(lpSrc, NULL);
283     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
284 
285     IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYSRC, NULL);
286 
287     rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
288     ok(rc==DD_OK,"Lock returned: %x\n",rc);
289     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
290     lpData = (LPDWORD)ddsd2.lpSurface;
291     /* Different behavior on some drivers / windows versions. Some versions ignore the X channel when
292      * color keying, but copy it to the destination surface. Others apply it for color keying, but
293      * do not copy it into the destination surface.
294      */
295     if(lpData[0]==0x00010203) {
296         trace("X channel was not copied into the destination surface\n");
297         ok((lpData[0]==0x00010203)&&(lpData[1]==0x00010203)&&(lpData[2]==0x00FF00FF)&&(lpData[3]==0xCCCCCCCC),
298            "Destination data after blitting is not correct\n");
299     } else {
300         ok((lpData[0]==0x77010203)&&(lpData[1]==0x00010203)&&(lpData[2]==0xCCCCCCCC)&&(lpData[3]==0xCCCCCCCC),
301            "Destination data after blitting is not correct\n");
302     }
303     rc = IDirectDrawSurface_Unlock(lpDst, NULL);
304     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
305 
306     /* Also test SetColorKey */
307     IDirectDrawSurface_GetColorKey(lpSrc, DDCKEY_SRCBLT, &DDColorKey);
308     ok(DDColorKey.dwColorSpaceLowValue == 0xFF00FF && DDColorKey.dwColorSpaceHighValue == 0xFF00FF,
309        "GetColorKey does not return the colorkey used at surface creation\n");
310 
311     DDColorKey.dwColorSpaceLowValue = 0x00FF00;
312     DDColorKey.dwColorSpaceHighValue = 0x00FF00;
313     IDirectDrawSurface_SetColorKey(lpSrc, DDCKEY_SRCBLT, &DDColorKey);
314 
315     DDColorKey.dwColorSpaceLowValue = 0;
316     DDColorKey.dwColorSpaceHighValue = 0;
317     IDirectDrawSurface_GetColorKey(lpSrc, DDCKEY_SRCBLT, &DDColorKey);
318     ok(DDColorKey.dwColorSpaceLowValue == 0x00FF00 && DDColorKey.dwColorSpaceHighValue == 0x00FF00,
319        "GetColorKey does not return the colorkey set with SetColorKey\n");
320 
321     ddsd.ddckCKSrcBlt.dwColorSpaceLowValue = 0;
322     ddsd.ddckCKSrcBlt.dwColorSpaceHighValue = 0;
323     IDirectDrawSurface_GetSurfaceDesc(lpSrc, &ddsd);
324     ok(ddsd.ddckCKSrcBlt.dwColorSpaceLowValue == 0x00FF00 && ddsd.ddckCKSrcBlt.dwColorSpaceHighValue == 0x00FF00,
325        "GetSurfaceDesc does not return the colorkey set with SetColorKey\n");
326 
327     IDirectDrawSurface_Release(lpSrc);
328     IDirectDrawSurface_Release(lpDst);
329 
330     /* start with a new set of surfaces to test the color keying parameters to blit */
331     memset(&ddsd, 0, sizeof(ddsd));
332     ddsd.dwSize = sizeof(ddsd);
333     ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
334     ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_CKSRCBLT | DDSD_CKDESTBLT;
335     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
336     ddsd.dwWidth = 800;
337     ddsd.dwHeight = 600;
338     ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
339     U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 32;
340     U2(ddsd.ddpfPixelFormat).dwRBitMask = 0xFF0000;
341     U3(ddsd.ddpfPixelFormat).dwGBitMask = 0x00FF00;
342     U4(ddsd.ddpfPixelFormat).dwBBitMask = 0x0000FF;
343     ddsd.ddckCKDestBlt.dwColorSpaceLowValue = 0xFF0000;
344     ddsd.ddckCKDestBlt.dwColorSpaceHighValue = 0xFF0000;
345     ddsd.ddckCKSrcBlt.dwColorSpaceLowValue = 0x00FF00;
346     ddsd.ddckCKSrcBlt.dwColorSpaceHighValue = 0x00FF00;
347     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDst, NULL);
348     ok(rc==DD_OK || rc == DDERR_NOCOLORKEYHW,"CreateSurface returned: %x\n",rc);
349     if(FAILED(rc))
350     {
351         skip("Failed to create surface\n");
352         return;
353     }
354 
355     /* start with a new set of surfaces to test the color keying parameters to blit */
356     memset(&ddsd, 0, sizeof(ddsd));
357     ddsd.dwSize = sizeof(ddsd);
358     ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
359     ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_CKSRCBLT | DDSD_CKDESTBLT;
360     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
361     ddsd.dwWidth = 800;
362     ddsd.dwHeight = 600;
363     ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
364     U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 32;
365     U2(ddsd.ddpfPixelFormat).dwRBitMask = 0xFF0000;
366     U3(ddsd.ddpfPixelFormat).dwGBitMask = 0x00FF00;
367     U4(ddsd.ddpfPixelFormat).dwBBitMask = 0x0000FF;
368     ddsd.ddckCKSrcBlt.dwColorSpaceLowValue = 0x0000FF;
369     ddsd.ddckCKSrcBlt.dwColorSpaceHighValue = 0x0000FF;
370     ddsd.ddckCKDestBlt.dwColorSpaceLowValue = 0x000000;
371     ddsd.ddckCKDestBlt.dwColorSpaceHighValue = 0x000000;
372     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpSrc, NULL);
373     ok(rc==DD_OK || rc == DDERR_NOCOLORKEYHW,"CreateSurface returned: %x\n",rc);
374     if(FAILED(rc))
375     {
376         skip("Failed to create surface\n");
377         IDirectDrawSurface_Release(lpDst);
378         return;
379     }
380 
381     memset(&fx, 0, sizeof(fx));
382     fx.dwSize = sizeof(fx);
383     fx.ddckSrcColorkey.dwColorSpaceHighValue = 0x110000;
384     fx.ddckSrcColorkey.dwColorSpaceLowValue = 0x110000;
385     fx.ddckDestColorkey.dwColorSpaceHighValue = 0x001100;
386     fx.ddckDestColorkey.dwColorSpaceLowValue = 0x001100;
387 
388     rc = IDirectDrawSurface_Lock(lpSrc, NULL, &ddsd2, DDLOCK_WAIT, NULL);
389     ok(rc==DD_OK,"Lock returned: %x\n",rc);
390     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
391     lpData = (LPDWORD)ddsd2.lpSurface;
392     lpData[0] = 0x000000FF; /* Applies to src blt key in src surface */
393     lpData[1] = 0x00000000; /* Applies to dst blt key in src surface */
394     lpData[2] = 0x00FF0000; /* Dst color key in dst surface */
395     lpData[3] = 0x0000FF00; /* Src color key in dst surface */
396     lpData[4] = 0x00001100; /* Src color key in ddbltfx */
397     lpData[5] = 0x00110000; /* Dst color key in ddbltfx */
398     rc = IDirectDrawSurface_Unlock(lpSrc, NULL);
399     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
400 
401     rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
402     ok(rc==DD_OK,"Lock returned: %x\n",rc);
403     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
404     lpData = (LPDWORD)ddsd2.lpSurface;
405     lpData[0] = 0x55555555;
406     lpData[1] = 0x55555555;
407     lpData[2] = 0x55555555;
408     lpData[3] = 0x55555555;
409     lpData[4] = 0x55555555;
410     lpData[5] = 0x55555555;
411     rc = IDirectDrawSurface_Unlock(lpDst, NULL);
412     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
413 
414     /* Test a blit without keying */
415     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, 0, &fx);
416     ok(rc == DD_OK, "IDirectDrawSurface_Blt returned %08x\n", rc);
417 
418     rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
419     ok(rc==DD_OK,"Lock returned: %x\n",rc);
420     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
421     lpData = (LPDWORD)ddsd2.lpSurface;
422     /* Should have copied src data unmodified to dst */
423     ok(lpData[0] == 0x000000FF &&
424        lpData[1] == 0x00000000 &&
425        lpData[2] == 0x00FF0000 &&
426        lpData[3] == 0x0000FF00 &&
427        lpData[4] == 0x00001100 &&
428        lpData[5] == 0x00110000, "Surface data after unkeyed blit does not match\n");
429 
430     lpData[0] = 0x55555555;
431     lpData[1] = 0x55555555;
432     lpData[2] = 0x55555555;
433     lpData[3] = 0x55555555;
434     lpData[4] = 0x55555555;
435     lpData[5] = 0x55555555;
436     rc = IDirectDrawSurface_Unlock(lpDst, NULL);
437     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
438 
439     /* Src key */
440     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYSRC, &fx);
441     ok(rc == DD_OK, "IDirectDrawSurface_Blt returned %08x\n", rc);
442 
443     rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
444     ok(rc==DD_OK,"Lock returned: %x\n",rc);
445     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
446     lpData = (LPDWORD)ddsd2.lpSurface;
447 
448     ok(lpData[0] == 0x55555555 && /* Here the src key applied */
449        lpData[1] == 0x00000000 &&
450        lpData[2] == 0x00FF0000 &&
451        lpData[3] == 0x0000FF00 &&
452        lpData[4] == 0x00001100 &&
453        lpData[5] == 0x00110000, "Surface data after srckey blit does not match\n");
454 
455     lpData[0] = 0x55555555;
456     lpData[1] = 0x55555555;
457     lpData[2] = 0x55555555;
458     lpData[3] = 0x55555555;
459     lpData[4] = 0x55555555;
460     lpData[5] = 0x55555555;
461     rc = IDirectDrawSurface_Unlock(lpDst, NULL);
462     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
463 
464     /* Src override */
465     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYSRCOVERRIDE, &fx);
466     ok(rc == DD_OK, "IDirectDrawSurface_Blt returned %08x\n", rc);
467 
468     rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
469     ok(rc==DD_OK,"Lock returned: %x\n",rc);
470     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
471     lpData = (LPDWORD)ddsd2.lpSurface;
472 
473     ok(lpData[0] == 0x000000FF &&
474        lpData[1] == 0x00000000 &&
475        lpData[2] == 0x00FF0000 &&
476        lpData[3] == 0x0000FF00 &&
477        lpData[4] == 0x00001100 &&
478        lpData[5] == 0x55555555, /* Override key applies here */
479        "Surface data after src override key blit does not match\n");
480 
481     lpData[0] = 0x55555555;
482     lpData[1] = 0x55555555;
483     lpData[2] = 0x55555555;
484     lpData[3] = 0x55555555;
485     lpData[4] = 0x55555555;
486     lpData[5] = 0x55555555;
487     rc = IDirectDrawSurface_Unlock(lpDst, NULL);
488     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
489 
490     /* Src override AND src key. That is not supposed to work */
491     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYSRC | DDBLT_KEYSRCOVERRIDE, &fx);
492     ok(rc == DDERR_INVALIDPARAMS, "IDirectDrawSurface_Blt returned %08x\n", rc);
493 
494     /* Verify that the destination is unchanged */
495     rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
496     ok(rc==DD_OK,"Lock returned: %x\n",rc);
497     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
498     lpData = (LPDWORD)ddsd2.lpSurface;
499 
500     ok(lpData[0] == 0x55555555 &&
501        lpData[1] == 0x55555555 &&
502        lpData[2] == 0x55555555 &&
503        lpData[3] == 0x55555555 &&
504        lpData[4] == 0x55555555 &&
505        lpData[5] == 0x55555555, /* Override key applies here */
506        "Surface data after src key blit with override does not match\n");
507 
508     lpData[0] = 0x00FF0000; /* Dest key in dst surface */
509     lpData[1] = 0x00FF0000; /* Dest key in dst surface */
510     lpData[2] = 0x00001100; /* Dest key in override */
511     lpData[3] = 0x00001100; /* Dest key in override */
512     lpData[4] = 0x00000000; /* Dest key in src surface */
513     lpData[5] = 0x00000000; /* Dest key in src surface */
514     rc = IDirectDrawSurface_Unlock(lpDst, NULL);
515     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
516 
517     /* Dest key blit */
518     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYDEST, &fx);
519     ok(rc == DD_OK, "IDirectDrawSurface_Blt returned %08x\n", rc);
520 
521     rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
522     ok(rc==DD_OK,"Lock returned: %x\n",rc);
523     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
524     lpData = (LPDWORD)ddsd2.lpSurface;
525 
526     /* DirectDraw uses the dest blit key from the SOURCE surface ! */
527     ok(lpData[0] == 0x00ff0000 &&
528        lpData[1] == 0x00ff0000 &&
529        lpData[2] == 0x00001100 &&
530        lpData[3] == 0x00001100 &&
531        lpData[4] == 0x00001100 && /* Key applies here */
532        lpData[5] == 0x00110000,   /* Key applies here */
533        "Surface data after dest key blit does not match\n");
534 
535     lpData[0] = 0x00FF0000; /* Dest key in dst surface */
536     lpData[1] = 0x00FF0000; /* Dest key in dst surface */
537     lpData[2] = 0x00001100; /* Dest key in override */
538     lpData[3] = 0x00001100; /* Dest key in override */
539     lpData[4] = 0x00000000; /* Dest key in src surface */
540     lpData[5] = 0x00000000; /* Dest key in src surface */
541     rc = IDirectDrawSurface_Unlock(lpDst, NULL);
542     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
543 
544     /* Dest override key blit */
545     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYDESTOVERRIDE, &fx);
546     ok(rc == DD_OK, "IDirectDrawSurface_Blt returned %08x\n", rc);
547 
548     rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
549     ok(rc==DD_OK,"Lock returned: %x\n",rc);
550     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
551     lpData = (LPDWORD)ddsd2.lpSurface;
552 
553     ok(lpData[0] == 0x00FF0000 &&
554        lpData[1] == 0x00FF0000 &&
555        lpData[2] == 0x00FF0000 && /* Key applies here */
556        lpData[3] == 0x0000FF00 && /* Key applies here */
557        lpData[4] == 0x00000000 &&
558        lpData[5] == 0x00000000,
559        "Surface data after dest key override blit does not match\n");
560 
561     lpData[0] = 0x00FF0000; /* Dest key in dst surface */
562     lpData[1] = 0x00FF0000; /* Dest key in dst surface */
563     lpData[2] = 0x00001100; /* Dest key in override */
564     lpData[3] = 0x00001100; /* Dest key in override */
565     lpData[4] = 0x00000000; /* Dest key in src surface */
566     lpData[5] = 0x00000000; /* Dest key in src surface */
567     rc = IDirectDrawSurface_Unlock(lpDst, NULL);
568     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
569 
570     /* Dest override key blit. Supposed to fail too */
571     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYDEST | DDBLT_KEYDESTOVERRIDE, &fx);
572     ok(rc == DDERR_INVALIDPARAMS, "IDirectDrawSurface_Blt returned %08x\n", rc);
573 
574     /* Check for unchanged data */
575     rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
576     ok(rc==DD_OK,"Lock returned: %x\n",rc);
577     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
578     lpData = (LPDWORD)ddsd2.lpSurface;
579 
580     ok(lpData[0] == 0x00FF0000 &&
581        lpData[1] == 0x00FF0000 &&
582        lpData[2] == 0x00001100 && /* Key applies here */
583        lpData[3] == 0x00001100 && /* Key applies here */
584        lpData[4] == 0x00000000 &&
585        lpData[5] == 0x00000000,
586        "Surface data with dest key and dest override does not match\n");
587 
588     lpData[0] = 0x00FF0000; /* Dest key in dst surface */
589     lpData[1] = 0x00FF0000; /* Dest key in dst surface */
590     lpData[2] = 0x00001100; /* Dest key in override */
591     lpData[3] = 0x00001100; /* Dest key in override */
592     lpData[4] = 0x00000000; /* Dest key in src surface */
593     lpData[5] = 0x00000000; /* Dest key in src surface */
594     rc = IDirectDrawSurface_Unlock(lpDst, NULL);
595     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
596 
597     /* Modify the source data a bit to give some more conclusive results */
598     rc = IDirectDrawSurface_Lock(lpSrc, NULL, &ddsd2, DDLOCK_WAIT, NULL);
599     ok(rc==DD_OK,"Lock returned: %x\n",rc);
600     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
601     lpData = (LPDWORD)ddsd2.lpSurface;
602     lpData[5] = 0x000000FF; /* Applies to src blt key in src surface */
603     rc = IDirectDrawSurface_Unlock(lpSrc, NULL);
604     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
605 
606     /* Source and destination key */
607     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYDEST | DDBLT_KEYSRC, &fx);
608     ok(rc == DD_OK, "IDirectDrawSurface_Blt returned %08x\n", rc);
609 
610     rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
611     ok(rc==DD_OK,"Lock returned: %x\n",rc);
612     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");
613     lpData = (LPDWORD)ddsd2.lpSurface;
614 
615     ok(lpData[0] == 0x00FF0000 && /* Masked by Destination key */
616        lpData[1] == 0x00FF0000 && /* Masked by Destination key */
617        lpData[2] == 0x00001100 && /* Masked by Destination key */
618        lpData[3] == 0x00001100 && /* Masked by Destination key */
619        lpData[4] == 0x00001100 && /* Allowed by destination key, not masked by source key */
620        lpData[5] == 0x00000000,   /* Allowed by dst key, but masked by source key */
621        "Surface data with src key and dest key blit does not match\n");
622 
623     lpData[0] = 0x00FF0000; /* Dest key in dst surface */
624     lpData[1] = 0x00FF0000; /* Dest key in dst surface */
625     lpData[2] = 0x00001100; /* Dest key in override */
626     lpData[3] = 0x00001100; /* Dest key in override */
627     lpData[4] = 0x00000000; /* Dest key in src surface */
628     lpData[5] = 0x00000000; /* Dest key in src surface */
629     rc = IDirectDrawSurface_Unlock(lpDst, NULL);
630     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
631 
632     /* Override keys without ddbltfx parameter fail */
633     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYDESTOVERRIDE, NULL);
634     ok(rc == DDERR_INVALIDPARAMS, "IDirectDrawSurface_Blt returned %08x\n", rc);
635     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYSRCOVERRIDE, NULL);
636     ok(rc == DDERR_INVALIDPARAMS, "IDirectDrawSurface_Blt returned %08x\n", rc);
637 
638     /* Try blitting without keys in the source surface*/
639     rc = IDirectDrawSurface_SetColorKey(lpSrc, DDCKEY_SRCBLT, NULL);
640     ok(rc == DD_OK, "SetColorKey returned %x\n", rc);
641     rc = IDirectDrawSurface_SetColorKey(lpSrc, DDCKEY_DESTBLT, NULL);
642     ok(rc == DD_OK, "SetColorKey returned %x\n", rc);
643 
644     /* That fails now. Do not bother to check that the data is unmodified */
645     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYSRC, &fx);
646     ok(rc == DDERR_INVALIDPARAMS, "IDirectDrawSurface_Blt returned %08x\n", rc);
647 
648     /* Dest key blit still works. Which key is used this time??? */
649     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYDEST, &fx);
650     ok(rc == DD_OK, "IDirectDrawSurface_Blt returned %08x\n", rc);
651 
652     /* With correctly passed override keys no key in the surface is needed.
653      * Again, the result was checked before, no need to do that again
654      */
655     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYDESTOVERRIDE, &fx);
656     ok(rc == DD_OK, "IDirectDrawSurface_Blt returned %08x\n", rc);
657     rc = IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYSRCOVERRIDE, &fx);
658     ok(rc == DD_OK, "IDirectDrawSurface_Blt returned %08x\n", rc);
659 
660     IDirectDrawSurface_Release(lpSrc);
661     IDirectDrawSurface_Release(lpDst);
662 }
663 
664 static void QueryInterface(void)
665 {
666     LPDIRECTDRAWSURFACE dsurface;
667     DDSURFACEDESC surface;
668     LPVOID object;
669     HRESULT ret;
670 
671     /* Create a surface */
672     ZeroMemory(&surface, sizeof(surface));
673     surface.dwSize = sizeof(surface);
674     surface.dwFlags = DDSD_WIDTH | DDSD_HEIGHT;
675     surface.dwHeight = 10;
676     surface.dwWidth = 10;
677     ret = IDirectDraw_CreateSurface(lpDD, &surface, &dsurface, NULL);
678     if(ret != DD_OK)
679     {
680         ok(FALSE, "IDirectDraw::CreateSurface failed with error %x\n", ret);
681         return;
682     }
683 
684     /* Call IUnknown::QueryInterface */
685     ret = IDirectDrawSurface_QueryInterface(dsurface, 0, &object);
686     ok(ret == DDERR_INVALIDPARAMS, "IDirectDrawSurface::QueryInterface returned %x\n", ret);
687 
688     IDirectDrawSurface_Release(dsurface);
689 }
690 
691 /* The following tests test which interface is returned by IDirectDrawSurfaceX::GetDDInterface.
692  * It uses refcounts to test that and compares the interface addresses. Partially fits here, and
693  * partially in the refcount test
694  */
695 
696 static unsigned long getref(IUnknown *iface)
697 {
698     IUnknown_AddRef(iface);
699     return IUnknown_Release(iface);
700 }
701 
702 static void GetDDInterface_1(void)
703 {
704     LPDIRECTDRAWSURFACE dsurface;
705     LPDIRECTDRAWSURFACE2 dsurface2;
706     DDSURFACEDESC surface;
707     HRESULT ret;
708     IDirectDraw2 *dd2;
709     IDirectDraw4 *dd4;
710     IDirectDraw7 *dd7;
711     unsigned long ref1, ref2, ref4, ref7;
712     void *dd;
713 
714     /* Create a surface */
715     ZeroMemory(&surface, sizeof(surface));
716     surface.dwSize = sizeof(surface);
717     surface.dwFlags = DDSD_WIDTH | DDSD_HEIGHT;
718     surface.dwHeight = 10;
719     surface.dwWidth = 10;
720     ret = IDirectDraw_CreateSurface(lpDD, &surface, &dsurface, NULL);
721     if(ret != DD_OK)
722     {
723         ok(FALSE, "IDirectDraw::CreateSurface failed with error %x\n", ret);
724         return;
725     }
726     ret = IDirectDrawSurface_QueryInterface(dsurface, &IID_IDirectDrawSurface2, (void **) &dsurface2);
727     ok(ret == DD_OK, "IDirectDrawSurface_QueryInterface returned %08x\n", ret);
728     ret = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw2, (void **) &dd2);
729     ok(ret == DD_OK, "IDirectDraw7_QueryInterface returned %08x\n", ret);
730     ret = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw4, (void **) &dd4);
731     ok(ret == DD_OK, "IDirectDraw7_QueryInterface returned %08x\n", ret);
732     ret = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7);
733     ok(ret == DD_OK, "IDirectDraw7_QueryInterface returned %08x\n", ret);
734 
735     ref1 = getref((IUnknown *) lpDD);
736     ok(ref1 == 1, "IDirectDraw refcount is %ld\n", ref1);
737     ref2 = getref((IUnknown *) dd2);
738     ok(ref2 == 1, "IDirectDraw2 refcount is %ld\n", ref2);
739     ref4 = getref((IUnknown *) dd4);
740     ok(ref4 == 1, "IDirectDraw4 refcount is %ld\n", ref4);
741     ref7 = getref((IUnknown *) dd7);
742     ok(ref7 == 1, "IDirectDraw7 refcount is %ld\n", ref7);
743 
744 
745     ret = IDirectDrawSurface2_GetDDInterface(dsurface2, &dd);
746     ok(ret == DD_OK, "IDirectDrawSurface7_GetDDInterface returned %08x\n", ret);
747     ok(getref((IUnknown *) lpDD) == ref1 + 1, "IDirectDraw refcount was increased by %ld\n", getref((IUnknown *) lpDD) - ref1);
748     ok(getref((IUnknown *) dd2) == ref2 + 0, "IDirectDraw2 refcount was increased by %ld\n", getref((IUnknown *) dd2) - ref2);
749     ok(getref((IUnknown *) dd4) == ref4 + 0, "IDirectDraw4 refcount was increased by %ld\n", getref((IUnknown *) dd4) - ref4);
750     ok(getref((IUnknown *) dd7) == ref7 + 0, "IDirectDraw7 refcount was increased by %ld\n", getref((IUnknown *) dd7) - ref7);
751 
752     ok(dd == lpDD, "Returned interface pointer is not equal to the creation interface\n");
753     IUnknown_Release((IUnknown *) dd);
754 
755     /* try a NULL pointer */
756     ret = IDirectDrawSurface2_GetDDInterface(dsurface2, NULL);
757     ok(ret == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_GetDDInterface returned %08x\n", ret);
758 
759     IDirectDraw_Release(dd2);
760     IDirectDraw_Release(dd4);
761     IDirectDraw_Release(dd7);
762     IDirectDrawSurface2_Release(dsurface2);
763     IDirectDrawSurface_Release(dsurface);
764 }
765 
766 static void GetDDInterface_2(void)
767 {
768     LPDIRECTDRAWSURFACE dsurface;
769     LPDIRECTDRAWSURFACE2 dsurface2;
770     DDSURFACEDESC surface;
771     HRESULT ret;
772     IDirectDraw2 *dd2;
773     IDirectDraw4 *dd4;
774     IDirectDraw7 *dd7;
775     unsigned long ref1, ref2, ref4, ref7;
776     void *dd;
777 
778     ret = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw2, (void **) &dd2);
779     ok(ret == DD_OK, "IDirectDraw7_QueryInterface returned %08x\n", ret);
780     ret = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw4, (void **) &dd4);
781     ok(ret == DD_OK, "IDirectDraw7_QueryInterface returned %08x\n", ret);
782     ret = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7);
783     ok(ret == DD_OK, "IDirectDraw7_QueryInterface returned %08x\n", ret);
784 
785     /* Create a surface */
786     ZeroMemory(&surface, sizeof(surface));
787     surface.dwSize = sizeof(surface);
788     surface.dwFlags = DDSD_WIDTH | DDSD_HEIGHT;
789     surface.dwHeight = 10;
790     surface.dwWidth = 10;
791     ret = IDirectDraw2_CreateSurface(dd2, &surface, &dsurface, NULL);
792     if(ret != DD_OK)
793     {
794         ok(FALSE, "IDirectDraw::CreateSurface failed with error %x\n", ret);
795         return;
796     }
797     ret = IDirectDrawSurface_QueryInterface(dsurface, &IID_IDirectDrawSurface2, (void **) &dsurface2);
798     ok(ret == DD_OK, "IDirectDrawSurface_QueryInterface returned %08x\n", ret);
799 
800     ref1 = getref((IUnknown *) lpDD);
801