2 * Unit tests for (a few) ddraw surface functions
4 * Copyright (C) 2005 Antoine Chavasse (a.chavasse@gmail.com)
5 * Copyright (C) 2005 Christian Costa
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "wine/test.h"
26 static LPDIRECTDRAW lpDD = NULL;
28 static void CreateDirectDraw(void)
32 rc = DirectDrawCreate(NULL, &lpDD, NULL);
33 ok(rc==DD_OK,"DirectDrawCreate returned: %lx\n",rc);
35 rc = IDirectDraw_SetCooperativeLevel(lpDD, NULL, DDSCL_NORMAL);
36 ok(rc==DD_OK,"SetCooperativeLevel returned: %lx\n",rc);
40 static void ReleaseDirectDraw(void)
44 IDirectDraw_Release(lpDD);
49 static void MipMapCreationTest(void)
51 LPDIRECTDRAWSURFACE lpDDSMipMapTest;
55 /* First mipmap creation test: create a surface with DDSCAPS_COMPLEX,
56 DDSCAPS_MIPMAP, and DDSD_MIPMAPCOUNT. This create the number of
57 requested mipmap levels. */
58 ddsd.dwSize = sizeof(ddsd);
59 ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_MIPMAPCOUNT;
60 ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
61 U2(ddsd).dwMipMapCount = 3;
64 rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
65 ok(rc==DD_OK,"CreateSurface returned: %lx\n",rc);
67 /* Check the number of created mipmaps */
68 memset(&ddsd, 0, sizeof(DDSURFACEDESC));
69 ddsd.dwSize = sizeof(ddsd);
70 rc = IDirectDrawSurface_GetSurfaceDesc(lpDDSMipMapTest, &ddsd);
71 ok(rc==DD_OK,"GetSurfaceDesc returned: %lx\n",rc);
72 ok(ddsd.dwFlags & DDSD_MIPMAPCOUNT,
73 "GetSurfaceDesc returned no mipmapcount.\n");
74 ok(U2(ddsd).dwMipMapCount == 3, "Incorrect mipmap count: %ld.\n",
75 U2(ddsd).dwMipMapCount);
77 /* Destroy the surface. */
78 IDirectDrawSurface_Release(lpDDSMipMapTest);
81 /* Second mipmap creation test: create a surface without a mipmap
82 count, with DDSCAPS_MIPMAP and without DDSCAPS_COMPLEX.
83 This creates a single mipmap level. */
84 memset(&ddsd, 0, sizeof(DDSURFACEDESC));
85 ddsd.dwSize = sizeof(ddsd);
86 ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
87 ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_MIPMAP;
90 rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
91 ok(rc==DD_OK,"CreateSurface returned: %lx\n",rc);
93 /* Check the number of created mipmaps */
94 memset(&ddsd, 0, sizeof(DDSURFACEDESC));
95 ddsd.dwSize = sizeof(ddsd);
96 rc = IDirectDrawSurface_GetSurfaceDesc(lpDDSMipMapTest, &ddsd);
97 ok(rc==DD_OK,"GetSurfaceDesc returned: %lx\n",rc);
98 ok(ddsd.dwFlags & DDSD_MIPMAPCOUNT,
99 "GetSurfaceDesc returned no mipmapcount.\n");
100 ok(U2(ddsd).dwMipMapCount == 1, "Incorrect mipmap count: %ld.\n",
101 U2(ddsd).dwMipMapCount);
104 /* Third mipmap creation test: create a surface with DDSCAPS_MIPMAP,
105 DDSCAPS_COMPLEX and without DDSD_MIPMAPCOUNT.
106 It's an undocumented features where a chain of mipmaps, starting from
107 he specified size and down to the smallest size, is automatically
109 Anarchy Online needs this feature to work. */
110 memset(&ddsd, 0, sizeof(DDSURFACEDESC));
111 ddsd.dwSize = sizeof(ddsd);
112 ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
113 ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
116 rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
117 ok(rc==DD_OK,"CreateSurface returned: %lx\n",rc);
119 /* Check the number of created mipmaps */
120 memset(&ddsd, 0, sizeof(DDSURFACEDESC));
121 ddsd.dwSize = sizeof(ddsd);
122 rc = IDirectDrawSurface_GetSurfaceDesc(lpDDSMipMapTest, &ddsd);
123 ok(rc==DD_OK,"GetSurfaceDesc returned: %lx\n",rc);
124 ok(ddsd.dwFlags & DDSD_MIPMAPCOUNT,
125 "GetSurfaceDesc returned no mipmapcount.\n");
126 ok(U2(ddsd).dwMipMapCount == 6, "Incorrect mipmap count: %ld.\n",
127 U2(ddsd).dwMipMapCount);
130 /* Fourth mipmap creation test: same as above with a different texture
132 The purpose is to verify that the number of generated mipmaps is
133 dependent on the smallest dimension. */
134 memset(&ddsd, 0, sizeof(DDSURFACEDESC));
135 ddsd.dwSize = sizeof(ddsd);
136 ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
137 ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
140 rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
141 ok(rc==DD_OK,"CreateSurface returned: %lx\n",rc);
143 /* Check the number of created mipmaps */
144 memset(&ddsd, 0, sizeof(DDSURFACEDESC));
145 ddsd.dwSize = sizeof(ddsd);
146 rc = IDirectDrawSurface_GetSurfaceDesc(lpDDSMipMapTest, &ddsd);
147 ok(rc==DD_OK,"GetSurfaceDesc returned: %lx\n",rc);
148 ok(ddsd.dwFlags & DDSD_MIPMAPCOUNT,
149 "GetSurfaceDesc returned no mipmapcount.\n");
150 ok(U2(ddsd).dwMipMapCount == 6, "Incorrect mipmap count: %ld.\n",
151 U2(ddsd).dwMipMapCount);
153 /* Destroy the surface. */
154 IDirectDrawSurface_Release(lpDDSMipMapTest);
157 static void SrcColorKey32BlitTest(void)
159 LPDIRECTDRAWSURFACE lpSrc;
160 LPDIRECTDRAWSURFACE lpDst;
166 ddsd2.dwSize = sizeof(ddsd2);
167 ddsd2.ddpfPixelFormat.dwSize = sizeof(ddsd2.ddpfPixelFormat);
169 ddsd.dwSize = sizeof(ddsd);
170 ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
171 ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
172 ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
175 ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
176 U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 32;
177 U2(ddsd.ddpfPixelFormat).dwRBitMask = 0xFF0000;
178 U3(ddsd.ddpfPixelFormat).dwGBitMask = 0x00FF00;
179 U4(ddsd.ddpfPixelFormat).dwBBitMask = 0x0000FF;
180 rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDst, NULL);
181 ok(rc==DD_OK,"CreateSurface returned: %lx\n",rc);
183 ddsd.dwFlags |= DDSD_CKSRCBLT;
184 ddsd.ddckCKSrcBlt.dwColorSpaceLowValue = 0xFF00FF;
185 ddsd.ddckCKSrcBlt.dwColorSpaceHighValue = 0xFF00FF;
186 rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpSrc, NULL);
187 ok(rc==DD_OK,"CreateSurface returned: %lx\n",rc);
189 rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
190 ok(rc==DD_OK,"Lock returned: %lx\n",rc);
191 lpData = (LPDWORD)ddsd2.lpSurface;
192 lpData[0] = 0xCCCCCCCC;
193 lpData[1] = 0xCCCCCCCC;
194 lpData[2] = 0xCCCCCCCC;
195 lpData[3] = 0xCCCCCCCC;
196 rc = IDirectDrawSurface_Unlock(lpDst, NULL);
197 ok(rc==DD_OK,"Unlock returned: %lx\n",rc);
199 rc = IDirectDrawSurface_Lock(lpSrc, NULL, &ddsd2, DDLOCK_WAIT, NULL);
200 ok(rc==DD_OK,"Lock returned: %lx\n",rc);
201 lpData = (LPDWORD)ddsd2.lpSurface;
202 lpData[0] = 0x77010203;
203 lpData[1] = 0x00010203;
204 lpData[2] = 0x77FF00FF;
205 lpData[3] = 0x00FF00FF;
206 rc = IDirectDrawSurface_Unlock(lpSrc, NULL);
207 ok(rc==DD_OK,"Unlock returned: %lx\n",rc);
209 IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYSRC, NULL);
211 rc = IDirectDrawSurface_Lock(lpDst, NULL, &ddsd2, DDLOCK_WAIT, NULL);
212 ok(rc==DD_OK,"Lock returned: %lx\n",rc);
213 lpData = (LPDWORD)ddsd2.lpSurface;
214 ok((lpData[0]==0x77010203)&&(lpData[1]==0x00010203)&&(lpData[2]==0xCCCCCCCC)&&(lpData[3]==0xCCCCCCCC),
215 "Destination data after blitting is not correct\n");
216 rc = IDirectDrawSurface_Unlock(lpDst, NULL);
217 ok(rc==DD_OK,"Unlock returned: %lx\n",rc);
219 IDirectDrawSurface_Release(lpSrc);
220 IDirectDrawSurface_Release(lpDst);
227 MipMapCreationTest();
228 SrcColorKey32BlitTest();