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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 void createdirectdraw(void)
66 rc = DirectDrawCreate(NULL, &lpDD, NULL);
67 ok(rc==DD_OK,"DirectDrawCreate returned: %lx\n",rc);
71 static void releasedirectdraw(void)
75 IDirectDraw_Release(lpDD);
80 static void adddisplaymode(LPDDSURFACEDESC lpddsd)
83 modes = malloc((modes_size = 2) * sizeof(DDSURFACEDESC));
84 if (modes_cnt == modes_size)
85 modes = realloc(modes, (modes_size *= 2) * sizeof(DDSURFACEDESC));
87 modes[modes_cnt++] = *lpddsd;
90 static void flushdisplaymodes(void)
94 modes_cnt = modes_size = 0;
97 static HRESULT WINAPI enummodescallback(LPDDSURFACEDESC lpddsd, LPVOID lpContext)
99 trace("Width = %li, Height = %li, Refresh Rate = %li\r\n",
100 lpddsd->dwWidth, lpddsd->dwHeight,
101 U2(*lpddsd).dwRefreshRate);
102 adddisplaymode(lpddsd);
107 static void enumdisplaymodes(void)
112 ZeroMemory(&ddsd, sizeof(DDSURFACEDESC));
113 ddsd.dwSize = sizeof(DDSURFACEDESC);
114 ddsd.dwFlags = DDSD_CAPS;
115 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
117 rc = IDirectDraw_EnumDisplayModes(lpDD,
118 DDEDM_STANDARDVGAMODES, &ddsd, 0, enummodescallback);
119 ok(rc==DD_OK || rc==E_INVALIDARG,"EnumDisplayModes returned: %lx\n",rc);
122 static void setdisplaymode(int i)
126 rc = IDirectDraw_SetCooperativeLevel(lpDD,
127 hwnd, DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
128 ok(rc==DD_OK,"SetCooperativeLevel returned: %lx\n",rc);
129 if (modes[i].dwFlags & DDSD_PIXELFORMAT)
131 if (modes[i].ddpfPixelFormat.dwFlags & DDPF_RGB)
133 rc = IDirectDraw_SetDisplayMode(lpDD,
134 modes[i].dwWidth, modes[i].dwHeight,
135 U1(modes[i].ddpfPixelFormat).dwRGBBitCount);
136 ok(DD_OK==rc || DDERR_UNSUPPORTED==rc,"SetDisplayMode returned: %lx\n",rc);
138 rc = IDirectDraw_RestoreDisplayMode(lpDD);
139 ok(DD_OK==rc,"RestoreDisplayMode returned: %lx\n",rc);
145 static void createsurface(void)
151 ddsd.dwSize = sizeof(ddsd);
152 ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
153 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
156 ddsd.dwBackBufferCount = 1;
157 rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpDDSPrimary, NULL );
158 ok(rc==DD_OK,"CreateSurface returned: %lx\n",rc);
159 ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
160 rc = IDirectDrawSurface_GetAttachedSurface(lpDDSPrimary, &ddscaps, &lpDDSBack);
161 ok(rc==DD_OK,"GetAttachedSurface returned: %lx\n",rc);
164 static void destroysurface(void)
166 if( lpDDSPrimary != NULL )
168 IDirectDrawSurface_Release(lpDDSPrimary);
173 static void testsurface(void)
175 const char* testMsg = "ddraw device context test";
179 rc = IDirectDrawSurface_GetDC(lpDDSBack, &hdc);
180 ok(rc==DD_OK, "IDirectDrawSurface_GetDC returned: %lx\n",rc);
181 SetBkColor(hdc, RGB(0, 0, 255));
182 SetTextColor(hdc, RGB(255, 255, 0));
183 TextOut(hdc, 0, 0, testMsg, lstrlen(testMsg));
184 IDirectDrawSurface_ReleaseDC(lpDDSBack, hdc);
185 ok(rc==DD_OK, "IDirectDrawSurface_ReleaseDC returned: %lx\n",rc);
189 rc = IDirectDrawSurface_Flip(lpDDSPrimary, NULL, DDFLIP_WAIT);
190 ok(rc==DD_OK || rc==DDERR_SURFACELOST, "IDirectDrawSurface_BltFast returned: %lx\n",rc);
196 else if (rc == DDERR_SURFACELOST)
198 rc = IDirectDrawSurface_Restore(lpDDSPrimary);
199 ok(rc==DD_OK, "IDirectDrawSurface_Restore returned: %lx\n",rc);
204 static void testdisplaymodes(void)
208 for (i = 0; i < modes_cnt; ++i)
217 static void testcooperativelevels_normal(void)
221 /* Do some tests with DDSCL_NORMAL mode */
223 rc = IDirectDraw_SetCooperativeLevel(lpDD,
225 ok(rc==DD_OK,"SetCooperativeLevel(DDSCL_NORMAL) returned: %lx\n",rc);
227 /* Set the focus window */
228 rc = IDirectDraw_SetCooperativeLevel(lpDD,
229 hwnd, DDSCL_SETFOCUSWINDOW);
230 ok(rc==DD_OK,"SetCooperativeLevel(DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc);
232 /* Set the focus window a second time*/
233 rc = IDirectDraw_SetCooperativeLevel(lpDD,
234 hwnd, DDSCL_SETFOCUSWINDOW);
235 ok(rc==DD_OK,"SetCooperativeLevel(DDSCL_SETFOCUSWINDOW) the second time returned: %lx\n",rc);
237 /* Test DDSCL_SETFOCUSWINDOW with the other flags. They should all fail, except of DDSCL_NOWINDOWCHANGES */
238 rc = IDirectDraw_SetCooperativeLevel(lpDD,
239 hwnd, DDSCL_NORMAL | DDSCL_SETFOCUSWINDOW);
240 ok(rc==DDERR_INVALIDPARAMS,"SetCooperativeLevel(DDSCL_NORMAL | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc);
242 rc = IDirectDraw_SetCooperativeLevel(lpDD,
243 hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_SETFOCUSWINDOW);
244 ok(rc==DDERR_INVALIDPARAMS,"SetCooperativeLevel(DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc);
246 /* This one succeeds */
247 rc = IDirectDraw_SetCooperativeLevel(lpDD,
248 hwnd, DDSCL_NOWINDOWCHANGES | DDSCL_SETFOCUSWINDOW);
249 ok(rc==DD_OK,"SetCooperativeLevel(DDSCL_NOWINDOWCHANGES | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc);
251 rc = IDirectDraw_SetCooperativeLevel(lpDD,
252 hwnd, DDSCL_MULTITHREADED | DDSCL_SETFOCUSWINDOW);
253 ok(rc==DDERR_INVALIDPARAMS,"SetCooperativeLevel(DDSCL_MULTITHREADED | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc);
255 rc = IDirectDraw_SetCooperativeLevel(lpDD,
256 hwnd, DDSCL_FPUSETUP | DDSCL_SETFOCUSWINDOW);
257 ok(rc==DDERR_INVALIDPARAMS,"SetCooperativeLevel(DDSCL_FPUSETUP | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc);
259 rc = IDirectDraw_SetCooperativeLevel(lpDD,
260 hwnd, DDSCL_FPUPRESERVE | DDSCL_SETFOCUSWINDOW);
261 ok(rc==DDERR_INVALIDPARAMS,"SetCooperativeLevel(DDSCL_FPUPRESERVE | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc);
263 rc = IDirectDraw_SetCooperativeLevel(lpDD,
264 hwnd, DDSCL_ALLOWREBOOT | DDSCL_SETFOCUSWINDOW);
265 ok(rc==DDERR_INVALIDPARAMS,"SetCooperativeLevel(DDSCL_ALLOWREBOOT | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc);
267 rc = IDirectDraw_SetCooperativeLevel(lpDD,
268 hwnd, DDSCL_ALLOWMODEX | DDSCL_SETFOCUSWINDOW);
269 ok(rc==DDERR_INVALIDPARAMS,"SetCooperativeLevel(DDSCL_ALLOWMODEX | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc);
271 /* Set the device window without any other flags. Should give an error */
272 rc = IDirectDraw_SetCooperativeLevel(lpDD,
273 hwnd, DDSCL_SETDEVICEWINDOW);
274 ok(rc==DDERR_INVALIDPARAMS,"SetCooperativeLevel(DDSCL_SETDEVICEWINDOW) returned: %lx\n",rc);
276 /* Set device window with DDSCL_NORMAL */
277 rc = IDirectDraw_SetCooperativeLevel(lpDD,
278 hwnd, DDSCL_NORMAL | DDSCL_SETDEVICEWINDOW);
279 ok(rc==DD_OK,"SetCooperativeLevel(DDSCL_NORMAL | DDSCL_SETDEVICEWINDOW) returned: %lx\n",rc);
281 /* Also set the focus window. Should give an error */
282 rc = IDirectDraw_SetCooperativeLevel(lpDD,
283 hwnd, DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_SETDEVICEWINDOW | DDSCL_SETFOCUSWINDOW);
284 ok(rc==DDERR_INVALIDPARAMS,"SetCooperativeLevel(DDSCL_NORMAL | DDSCL_SETDEVICEWINDOW | DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc);
289 static void testcooperativelevels_exclusive(void)
293 /* Do some tests with DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN mode */
295 /* Try to set exclusive mode only */
296 rc = IDirectDraw_SetCooperativeLevel(lpDD,
297 hwnd, DDSCL_EXCLUSIVE);
298 ok(rc==DDERR_INVALIDPARAMS,"SetCooperativeLevel(DDSCL_EXCLUSIVE) returned: %lx\n",rc);
300 /* Full screen mode only */
301 rc = IDirectDraw_SetCooperativeLevel(lpDD,
302 hwnd, DDSCL_FULLSCREEN);
303 ok(rc==DDERR_INVALIDPARAMS,"SetCooperativeLevel(DDSCL_FULLSCREEN) returned: %lx\n",rc);
305 /* Full screen mode + exclusive mode */
306 rc = IDirectDraw_SetCooperativeLevel(lpDD,
307 hwnd, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE);
308 ok(rc==DD_OK,"SetCooperativeLevel(DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN) returned: %lx\n",rc);
310 /* Set the focus window. Should fail */
311 rc = IDirectDraw_SetCooperativeLevel(lpDD,
312 hwnd, DDSCL_SETFOCUSWINDOW);
313 ok(rc==DDERR_HWNDALREADYSET,"SetCooperativeLevel(DDSCL_SETFOCUSWINDOW) returned: %lx\n",rc);
319 START_TEST(ddrawmodes)
329 testcooperativelevels_normal();
333 testcooperativelevels_exclusive();