2 * Unit tests for ddraw functions
4 * Copyright (C) 2003 Sami Aario
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "wine/test.h"
25 static LPDIRECTDRAW lpDD
= NULL
;
26 static LPDIRECTDRAWSURFACE lpDDSPrimary
= NULL
;
27 static LPDIRECTDRAWSURFACE lpDDSBack
= NULL
;
31 static int modes_size
;
32 static LPDDSURFACEDESC modes
;
34 static void createwindow(void)
36 wc
.style
= CS_HREDRAW
| CS_VREDRAW
;
37 wc
.lpfnWndProc
= DefWindowProcA
;
40 wc
.hInstance
= GetModuleHandleA(0);
41 wc
.hIcon
= LoadIconA(wc
.hInstance
, IDI_APPLICATION
);
42 wc
.hCursor
= LoadCursorA(NULL
, IDC_ARROW
);
43 wc
.hbrBackground
= (HBRUSH
) GetStockObject(BLACK_BRUSH
);
44 wc
.lpszMenuName
= NULL
;
45 wc
.lpszClassName
= "TestWindowClass";
46 if(!RegisterClassA(&wc
))
49 hwnd
= CreateWindowExA(0, "TestWindowClass", "TestWindowClass",
51 GetSystemMetrics(SM_CXSCREEN
),
52 GetSystemMetrics(SM_CYSCREEN
),
53 NULL
, NULL
, GetModuleHandleA(0), NULL
);
56 ShowWindow(hwnd
, SW_HIDE
);
62 static BOOL
createdirectdraw(void)
66 rc
= DirectDrawCreate(NULL
, &lpDD
, NULL
);
67 ok(rc
==DD_OK
|| rc
==DDERR_NODIRECTDRAWSUPPORT
, "DirectDrawCreateEx returned: %lx\n", rc
);
69 trace("DirectDrawCreateEx() failed with an error %lx\n", rc
);
76 static void releasedirectdraw(void)
80 IDirectDraw_Release(lpDD
);
85 static void adddisplaymode(LPDDSURFACEDESC lpddsd
)
88 modes
= malloc((modes_size
= 2) * sizeof(DDSURFACEDESC
));
89 if (modes_cnt
== modes_size
)
90 modes
= realloc(modes
, (modes_size
*= 2) * sizeof(DDSURFACEDESC
));
92 modes
[modes_cnt
++] = *lpddsd
;
95 static void flushdisplaymodes(void)
99 modes_cnt
= modes_size
= 0;
102 static HRESULT WINAPI
enummodescallback(LPDDSURFACEDESC lpddsd
, LPVOID lpContext
)
104 trace("Width = %li, Height = %li, Refresh Rate = %li\r\n",
105 lpddsd
->dwWidth
, lpddsd
->dwHeight
,
106 U2(*lpddsd
).dwRefreshRate
);
107 adddisplaymode(lpddsd
);
112 static void enumdisplaymodes(void)
117 ZeroMemory(&ddsd
, sizeof(DDSURFACEDESC
));
118 ddsd
.dwSize
= sizeof(DDSURFACEDESC
);
119 ddsd
.dwFlags
= DDSD_CAPS
;
120 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
;
122 rc
= IDirectDraw_EnumDisplayModes(lpDD
,
123 DDEDM_STANDARDVGAMODES
, &ddsd
, 0, enummodescallback
);
124 ok(rc
==DD_OK
|| rc
==E_INVALIDARG
,"EnumDisplayModes returned: %lx\n",rc
);
127 static void setdisplaymode(int i
)
131 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
132 hwnd
, DDSCL_ALLOWMODEX
| DDSCL_EXCLUSIVE
| DDSCL_FULLSCREEN
);
133 ok(rc
==DD_OK
,"SetCooperativeLevel returned: %lx\n",rc
);
134 if (modes
[i
].dwFlags
& DDSD_PIXELFORMAT
)
136 if (modes
[i
].ddpfPixelFormat
.dwFlags
& DDPF_RGB
)
138 rc
= IDirectDraw_SetDisplayMode(lpDD
,
139 modes
[i
].dwWidth
, modes
[i
].dwHeight
,
140 U1(modes
[i
].ddpfPixelFormat
).dwRGBBitCount
);
141 ok(DD_OK
==rc
|| DDERR_UNSUPPORTED
==rc
,"SetDisplayMode returned: %lx\n",rc
);
143 rc
= IDirectDraw_RestoreDisplayMode(lpDD
);
144 ok(DD_OK
==rc
,"RestoreDisplayMode returned: %lx\n",rc
);
150 static void createsurface(void)
156 ddsd
.dwSize
= sizeof(ddsd
);
157 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_BACKBUFFERCOUNT
;
158 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
|
161 ddsd
.dwBackBufferCount
= 1;
162 rc
= IDirectDraw_CreateSurface(lpDD
, &ddsd
, &lpDDSPrimary
, NULL
);
163 ok(rc
==DD_OK
,"CreateSurface returned: %lx\n",rc
);
164 ddscaps
.dwCaps
= DDSCAPS_BACKBUFFER
;
165 rc
= IDirectDrawSurface_GetAttachedSurface(lpDDSPrimary
, &ddscaps
, &lpDDSBack
);
166 ok(rc
==DD_OK
,"GetAttachedSurface returned: %lx\n",rc
);
169 static void destroysurface(void)
171 if( lpDDSPrimary
!= NULL
)
173 IDirectDrawSurface_Release(lpDDSPrimary
);
178 static void testsurface(void)
180 const char* testMsg
= "ddraw device context test";
184 rc
= IDirectDrawSurface_GetDC(lpDDSBack
, &hdc
);
185 ok(rc
==DD_OK
, "IDirectDrawSurface_GetDC returned: %lx\n",rc
);
186 SetBkColor(hdc
, RGB(0, 0, 255));
187 SetTextColor(hdc
, RGB(255, 255, 0));
188 TextOut(hdc
, 0, 0, testMsg
, lstrlen(testMsg
));
189 IDirectDrawSurface_ReleaseDC(lpDDSBack
, hdc
);
190 ok(rc
==DD_OK
, "IDirectDrawSurface_ReleaseDC returned: %lx\n",rc
);
194 rc
= IDirectDrawSurface_Flip(lpDDSPrimary
, NULL
, DDFLIP_WAIT
);
195 ok(rc
==DD_OK
|| rc
==DDERR_SURFACELOST
, "IDirectDrawSurface_BltFast returned: %lx\n",rc
);
201 else if (rc
== DDERR_SURFACELOST
)
203 rc
= IDirectDrawSurface_Restore(lpDDSPrimary
);
204 ok(rc
==DD_OK
, "IDirectDrawSurface_Restore returned: %lx\n",rc
);
209 static void testdisplaymodes(void)
213 for (i
= 0; i
< modes_cnt
; ++i
)
222 static void testcooperativelevels_normal(void)
226 /* Do some tests with DDSCL_NORMAL mode */
228 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
230 ok(rc
==DD_OK
,"SetCooperativeLevel(DDSCL_NORMAL) returned: %lx\n",rc
);
232 /* Set the focus window */
233 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
234 hwnd
, DDSCL_SETFOCUSWINDOW
);
235 ok(rc
==DD_OK
,"SetCooperativeLevel(DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc
);
237 /* Set the focus window a second time*/
238 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
239 hwnd
, DDSCL_SETFOCUSWINDOW
);
240 ok(rc
==DD_OK
,"SetCooperativeLevel(DDSCL_SETFOCUSWINDOW) the second time returned: %lx\n",rc
);
242 /* Test DDSCL_SETFOCUSWINDOW with the other flags. They should all fail, except of DDSCL_NOWINDOWCHANGES */
243 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
244 hwnd
, DDSCL_NORMAL
| DDSCL_SETFOCUSWINDOW
);
245 ok(rc
==DDERR_INVALIDPARAMS
,"SetCooperativeLevel(DDSCL_NORMAL | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc
);
247 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
248 hwnd
, DDSCL_EXCLUSIVE
| DDSCL_FULLSCREEN
| DDSCL_SETFOCUSWINDOW
);
249 ok(rc
==DDERR_INVALIDPARAMS
,"SetCooperativeLevel(DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc
);
251 /* This one succeeds */
252 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
253 hwnd
, DDSCL_NOWINDOWCHANGES
| DDSCL_SETFOCUSWINDOW
);
254 ok(rc
==DD_OK
,"SetCooperativeLevel(DDSCL_NOWINDOWCHANGES | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc
);
256 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
257 hwnd
, DDSCL_MULTITHREADED
| DDSCL_SETFOCUSWINDOW
);
258 ok(rc
==DDERR_INVALIDPARAMS
,"SetCooperativeLevel(DDSCL_MULTITHREADED | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc
);
260 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
261 hwnd
, DDSCL_FPUSETUP
| DDSCL_SETFOCUSWINDOW
);
262 ok(rc
==DDERR_INVALIDPARAMS
,"SetCooperativeLevel(DDSCL_FPUSETUP | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc
);
264 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
265 hwnd
, DDSCL_FPUPRESERVE
| DDSCL_SETFOCUSWINDOW
);
266 ok(rc
==DDERR_INVALIDPARAMS
,"SetCooperativeLevel(DDSCL_FPUPRESERVE | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc
);
268 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
269 hwnd
, DDSCL_ALLOWREBOOT
| DDSCL_SETFOCUSWINDOW
);
270 ok(rc
==DDERR_INVALIDPARAMS
,"SetCooperativeLevel(DDSCL_ALLOWREBOOT | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc
);
272 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
273 hwnd
, DDSCL_ALLOWMODEX
| DDSCL_SETFOCUSWINDOW
);
274 ok(rc
==DDERR_INVALIDPARAMS
,"SetCooperativeLevel(DDSCL_ALLOWMODEX | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc
);
276 /* Set the device window without any other flags. Should give an error */
277 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
278 hwnd
, DDSCL_SETDEVICEWINDOW
);
279 ok(rc
==DDERR_INVALIDPARAMS
,"SetCooperativeLevel(DDSCL_SETDEVICEWINDOW) returned: %lx\n",rc
);
281 /* Set device window with DDSCL_NORMAL */
282 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
283 hwnd
, DDSCL_NORMAL
| DDSCL_SETDEVICEWINDOW
);
284 ok(rc
==DD_OK
,"SetCooperativeLevel(DDSCL_NORMAL | DDSCL_SETDEVICEWINDOW) returned: %lx\n",rc
);
286 /* Also set the focus window. Should give an error */
287 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
288 hwnd
, DDSCL_ALLOWMODEX
| DDSCL_EXCLUSIVE
| DDSCL_FULLSCREEN
| DDSCL_SETDEVICEWINDOW
| DDSCL_SETFOCUSWINDOW
);
289 ok(rc
==DDERR_INVALIDPARAMS
,"SetCooperativeLevel(DDSCL_NORMAL | DDSCL_SETDEVICEWINDOW | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc
);
294 static void testcooperativelevels_exclusive(void)
298 /* Do some tests with DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN mode */
300 /* Try to set exclusive mode only */
301 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
302 hwnd
, DDSCL_EXCLUSIVE
);
303 ok(rc
==DDERR_INVALIDPARAMS
,"SetCooperativeLevel(DDSCL_EXCLUSIVE) returned: %lx\n",rc
);
305 /* Full screen mode only */
306 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
307 hwnd
, DDSCL_FULLSCREEN
);
308 ok(rc
==DDERR_INVALIDPARAMS
,"SetCooperativeLevel(DDSCL_FULLSCREEN) returned: %lx\n",rc
);
310 /* Full screen mode + exclusive mode */
311 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
312 hwnd
, DDSCL_FULLSCREEN
| DDSCL_EXCLUSIVE
);
313 ok(rc
==DD_OK
,"SetCooperativeLevel(DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN) returned: %lx\n",rc
);
315 /* Set the focus window. Should fail */
316 rc
= IDirectDraw_SetCooperativeLevel(lpDD
,
317 hwnd
, DDSCL_SETFOCUSWINDOW
);
318 ok(rc
==DDERR_HWNDALREADYSET
,"SetCooperativeLevel(DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc
);
324 START_TEST(ddrawmodes
)
327 if (!createdirectdraw())
335 testcooperativelevels_normal();
339 testcooperativelevels_exclusive();