EnumThemeColors() and EnumThemeSizes() actually do not return a single
[wine] / dlls / ddraw / tests / dsurface.c
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  *
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.
11  *
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.
16  *
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
20  */
21
22 #include <assert.h>
23 #include "wine/test.h"
24 #include "ddraw.h"
25
26 static LPDIRECTDRAW lpDD = NULL;
27
28 static void CreateDirectDraw(void)
29 {
30     HRESULT rc;
31
32     rc = DirectDrawCreate(NULL, &lpDD, NULL);
33     ok(rc==DD_OK,"DirectDrawCreate returned: %lx\n",rc);
34
35     rc = IDirectDraw_SetCooperativeLevel(lpDD, NULL, DDSCL_NORMAL);
36     ok(rc==DD_OK,"SetCooperativeLevel returned: %lx\n",rc);
37 }
38
39
40 static void ReleaseDirectDraw(void)
41 {
42     if( lpDD != NULL )
43     {
44         IDirectDraw_Release(lpDD);
45         lpDD = NULL;
46     }
47 }
48
49 static void MipMapCreationTest(void)
50 {
51     LPDIRECTDRAWSURFACE lpDDSMipMapTest;
52     DDSURFACEDESC ddsd;
53     HRESULT rc;
54
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;
62     ddsd.dwWidth = 128;
63     ddsd.dwHeight = 32;
64     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
65     ok(rc==DD_OK,"CreateSurface returned: %lx\n",rc);
66
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);
76
77     /* Destroy the surface. */
78     IDirectDrawSurface_Release(lpDDSMipMapTest);
79
80
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;
88     ddsd.dwWidth = 128;
89     ddsd.dwHeight = 32;
90     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
91     ok(rc==DD_OK,"CreateSurface returned: %lx\n",rc);
92
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);
102
103
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
108        created.
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;
114     ddsd.dwWidth = 128;
115     ddsd.dwHeight = 32;
116     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
117     ok(rc==DD_OK,"CreateSurface returned: %lx\n",rc);
118
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);
128
129
130     /* Fourth mipmap creation test: same as above with a different texture
131        size.
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;
138     ddsd.dwWidth = 32;
139     ddsd.dwHeight = 64;
140     rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSMipMapTest, NULL);
141     ok(rc==DD_OK,"CreateSurface returned: %lx\n",rc);
142
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);
152
153     /* Destroy the surface. */
154     IDirectDrawSurface_Release(lpDDSMipMapTest);
155 }
156
157 static void SrcColorKey32BlitTest(void)
158 {
159     LPDIRECTDRAWSURFACE lpSrc;
160     LPDIRECTDRAWSURFACE lpDst;
161     DDSURFACEDESC ddsd;
162     DDSURFACEDESC ddsd2;
163     LPDWORD lpData;
164     HRESULT rc;
165
166     ddsd2.dwSize = sizeof(ddsd2);
167     ddsd2.ddpfPixelFormat.dwSize = sizeof(ddsd2.ddpfPixelFormat);
168
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;
173     ddsd.dwWidth = 800;
174     ddsd.dwHeight = 600;
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);
182
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);
188     
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);
198
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);
208
209     IDirectDrawSurface_Blt(lpDst, NULL, lpSrc, NULL, DDBLT_KEYSRC, NULL);
210
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);
218
219     IDirectDrawSurface_Release(lpSrc);
220     IDirectDrawSurface_Release(lpDst);
221 }
222
223
224 START_TEST(dsurface)
225 {
226     CreateDirectDraw();
227     MipMapCreationTest();
228     SrcColorKey32BlitTest();
229     ReleaseDirectDraw();
230 }