[LWIP]
[reactos.git] / dll / directx / wine / ddraw / ddraw_thunks.c
1 /* Direct Draw Thunks and old vtables
2 * Copyright 2000 TransGaming Technologies Inc.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19 #include "config.h"
20 #include "wine/port.h"
21
22 #include <assert.h>
23 #include <stdarg.h>
24 #include <string.h>
25 #include <stdlib.h>
26
27 #define COBJMACROS
28 #define NONAMELESSUNION
29
30 #include "windef.h"
31 #include "winbase.h"
32 #include "winerror.h"
33 #include "wingdi.h"
34 #include "wine/exception.h"
35
36 #include "ddraw.h"
37 #include "d3d.h"
38
39 #include "ddraw_private.h"
40 #include "wine/debug.h"
41
42 WINE_DEFAULT_DEBUG_CHANNEL(ddraw_thunk);
43 WINE_DECLARE_DEBUG_CHANNEL(ddraw);
44
45 static HRESULT WINAPI
46 IDirectDrawImpl_QueryInterface(LPDIRECTDRAW This, REFIID iid, LPVOID *ppObj)
47 {
48 return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw1(This), iid, ppObj);
49 }
50
51 static HRESULT WINAPI
52 IDirectDraw2Impl_QueryInterface(LPDIRECTDRAW2 This, REFIID iid, LPVOID *ppObj)
53 {
54 return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw2(This), iid, ppObj);
55 }
56
57 static HRESULT WINAPI
58 IDirectDraw4Impl_QueryInterface(LPDIRECTDRAW4 This, REFIID iid, LPVOID *ppObj)
59 {
60 return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw4(This), iid, ppObj);
61 }
62
63 static ULONG WINAPI
64 IDirectDrawImpl_AddRef(LPDIRECTDRAW iface)
65 {
66 IDirectDrawImpl *This = ddraw_from_ddraw1(iface);
67 ULONG ref = InterlockedIncrement(&This->ref1);
68
69 TRACE("(%p) : incrementing IDirectDraw refcount from %u.\n", This, ref -1);
70
71 if(ref == 1) InterlockedIncrement(&This->numIfaces);
72
73 return ref;
74 }
75
76 static ULONG WINAPI
77 IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 iface)
78 {
79 IDirectDrawImpl *This = ddraw_from_ddraw2(iface);
80 ULONG ref = InterlockedIncrement(&This->ref2);
81
82 TRACE("(%p) : incrementing IDirectDraw2 refcount from %u.\n", This, ref -1);
83
84 if(ref == 1) InterlockedIncrement(&This->numIfaces);
85
86 return ref;
87 }
88
89 static ULONG WINAPI
90 IDirectDraw4Impl_AddRef(LPDIRECTDRAW4 iface)
91 {
92 IDirectDrawImpl *This = ddraw_from_ddraw4(iface);
93 ULONG ref = InterlockedIncrement(&This->ref4);
94
95 TRACE("(%p) : incrementing IDirectDraw4 refcount from %u.\n", This, ref -1);
96
97 if(ref == 1) InterlockedIncrement(&This->numIfaces);
98
99 return ref;
100 }
101
102 static ULONG WINAPI
103 IDirectDrawImpl_Release(LPDIRECTDRAW iface)
104 {
105 IDirectDrawImpl *This = ddraw_from_ddraw1(iface);
106 ULONG ref = InterlockedDecrement(&This->ref1);
107
108 TRACE_(ddraw)("(%p)->() decrementing IDirectDraw refcount from %u.\n", This, ref +1);
109
110 if(ref == 0)
111 {
112 ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
113 if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
114 }
115
116 return ref;
117 }
118
119 static ULONG WINAPI
120 IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface)
121 {
122 IDirectDrawImpl *This = ddraw_from_ddraw2(iface);
123 ULONG ref = InterlockedDecrement(&This->ref2);
124
125 TRACE_(ddraw)("(%p)->() decrementing IDirectDraw2 refcount from %u.\n", This, ref +1);
126
127 if(ref == 0)
128 {
129 ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
130 if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
131 }
132
133 return ref;
134 }
135
136 static ULONG WINAPI
137 IDirectDraw4Impl_Release(LPDIRECTDRAW4 iface)
138 {
139 IDirectDrawImpl *This = ddraw_from_ddraw4(iface);
140 ULONG ref = InterlockedDecrement(&This->ref4);
141
142 TRACE_(ddraw)("(%p)->() decrementing IDirectDraw4 refcount from %u.\n", This, ref +1);
143
144 if(ref == 0)
145 {
146 ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
147 if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
148 }
149
150 return ref;
151 }
152
153 static HRESULT WINAPI
154 IDirectDrawImpl_Compact(LPDIRECTDRAW This)
155 {
156 return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw1(This));
157 }
158
159 static HRESULT WINAPI
160 IDirectDraw2Impl_Compact(LPDIRECTDRAW2 This)
161 {
162 return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw2(This));
163 }
164
165 static HRESULT WINAPI
166 IDirectDraw4Impl_Compact(LPDIRECTDRAW4 This)
167 {
168 return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw4(This));
169 }
170
171 static HRESULT WINAPI
172 IDirectDrawImpl_CreateClipper(LPDIRECTDRAW This, DWORD dwFlags,
173 LPDIRECTDRAWCLIPPER *ppClipper,
174 IUnknown *pUnkOuter)
175 {
176 return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, ppClipper, pUnkOuter);
177 }
178
179 static HRESULT WINAPI
180 IDirectDraw2Impl_CreateClipper(LPDIRECTDRAW2 This, DWORD dwFlags,
181 LPDIRECTDRAWCLIPPER *ppClipper,
182 IUnknown *pUnkOuter)
183 {
184 return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, ppClipper, pUnkOuter);
185 }
186
187 static HRESULT WINAPI
188 IDirectDraw4Impl_CreateClipper(LPDIRECTDRAW4 This, DWORD dwFlags,
189 LPDIRECTDRAWCLIPPER *ppClipper,
190 IUnknown *pUnkOuter)
191 {
192 return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, ppClipper, pUnkOuter);
193 }
194
195 static HRESULT WINAPI
196 IDirectDrawImpl_CreatePalette(LPDIRECTDRAW This, DWORD dwFlags,
197 LPPALETTEENTRY pEntries,
198 LPDIRECTDRAWPALETTE *ppPalette,
199 IUnknown *pUnkOuter)
200 {
201 HRESULT hr;
202 hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, pEntries, ppPalette, pUnkOuter);
203 if(SUCCEEDED(hr) && *ppPalette)
204 {
205 IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
206 IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This));
207 impl->ifaceToRelease = NULL;
208
209 }
210 return hr;
211 }
212
213 static HRESULT WINAPI
214 IDirectDraw2Impl_CreatePalette(LPDIRECTDRAW2 This, DWORD dwFlags,
215 LPPALETTEENTRY pEntries,
216 LPDIRECTDRAWPALETTE *ppPalette,
217 IUnknown *pUnkOuter)
218 {
219 HRESULT hr;
220 hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, pEntries, ppPalette, pUnkOuter);
221 if(SUCCEEDED(hr) && *ppPalette)
222 {
223 IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
224 IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This));
225 impl->ifaceToRelease = NULL;
226 }
227 return hr;
228 }
229
230 static HRESULT WINAPI
231 IDirectDraw4Impl_CreatePalette(LPDIRECTDRAW4 This, DWORD dwFlags,
232 LPPALETTEENTRY pEntries,
233 LPDIRECTDRAWPALETTE *ppPalette,
234 IUnknown *pUnkOuter)
235 {
236 HRESULT hr;
237 hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, pEntries, ppPalette, pUnkOuter);
238 if(SUCCEEDED(hr) && *ppPalette)
239 {
240 IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
241 IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw4(This));
242 IDirectDraw4_AddRef(This);
243 impl->ifaceToRelease = (IUnknown *) This;
244 }
245 return hr;
246 }
247
248 /* Must set all attached surfaces (e.g. mipmaps) versions as well */
249 static void set_surf_version(IDirectDrawSurfaceImpl *surf, int version)
250 {
251 int i;
252 TRACE("%p->version(%d) = %d\n", surf, surf->version, version);
253 surf->version = version;
254 for(i = 0; i < MAX_COMPLEX_ATTACHED; i++)
255 {
256 if(!surf->complex_array[i]) break;
257 set_surf_version(surf->complex_array[i], version);
258 }
259 while( (surf = surf->next_attached) )
260 {
261 set_surf_version(surf, version);
262 }
263 }
264
265 static HRESULT WINAPI
266 IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
267 LPDIRECTDRAWSURFACE *ppSurface,
268 IUnknown *pUnkOuter)
269 {
270 LPDIRECTDRAWSURFACE7 pSurface7;
271 IDirectDrawSurfaceImpl *impl;
272 HRESULT hr;
273
274 /* Remove front buffer flag, this causes failure in v7, and its added to normal
275 * primaries anyway
276 */
277 pSDesc->ddsCaps.dwCaps &= ~DDSCAPS_FRONTBUFFER;
278 /* the LPDDSURFACEDESC -> LPDDSURFACEDESC2 conversion should be ok,
279 * since the data layout is the same */
280 hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This),
281 (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
282 if (FAILED(hr))
283 {
284 *ppSurface = NULL;
285 return hr;
286 }
287
288 impl = (IDirectDrawSurfaceImpl *)pSurface7;
289 *ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
290 set_surf_version(impl, 1);
291 IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This));
292 impl->ifaceToRelease = NULL;
293
294 return hr;
295 }
296
297 static HRESULT WINAPI
298 IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc,
299 LPDIRECTDRAWSURFACE *ppSurface,
300 IUnknown *pUnkOuter)
301 {
302 LPDIRECTDRAWSURFACE7 pSurface7;
303 IDirectDrawSurfaceImpl *impl;
304 HRESULT hr;
305
306 hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This),
307 (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
308 if (FAILED(hr))
309 {
310 *ppSurface = NULL;
311 return hr;
312 }
313
314 impl = (IDirectDrawSurfaceImpl *)pSurface7;
315 *ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
316 set_surf_version(impl, 2);
317 IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This));
318 impl->ifaceToRelease = NULL;
319
320 return hr;
321 }
322
323 static HRESULT WINAPI
324 IDirectDraw4Impl_CreateSurface(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pSDesc,
325 LPDIRECTDRAWSURFACE4 *ppSurface,
326 IUnknown *pUnkOuter)
327 {
328 HRESULT hr;
329 IDirectDrawSurfaceImpl *impl;
330
331 hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw4(This),
332 pSDesc, (LPDIRECTDRAWSURFACE7 *)ppSurface, pUnkOuter);
333 impl = (IDirectDrawSurfaceImpl *)*ppSurface;
334 if(SUCCEEDED(hr) && impl)
335 {
336 set_surf_version(impl, 4);
337 IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw4(This));
338 IDirectDraw4_AddRef(This);
339 impl->ifaceToRelease = (IUnknown *) This;
340 }
341 return hr;
342 }
343
344 static HRESULT WINAPI
345 IDirectDrawImpl_DuplicateSurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE pSrc,
346 LPDIRECTDRAWSURFACE *ppDst)
347 {
348 LPDIRECTDRAWSURFACE7 pDst7;
349 HRESULT hr;
350
351 hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This),
352 pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7);
353
354 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
355 * IDirectDrawSurface vtable layout at the beginning */
356 *ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL;
357
358 return hr;
359 }
360
361 static HRESULT WINAPI
362 IDirectDraw2Impl_DuplicateSurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE pSrc,
363 LPDIRECTDRAWSURFACE *ppDst)
364 {
365 LPDIRECTDRAWSURFACE7 pDst7;
366 HRESULT hr;
367
368 hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This),
369 pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7);
370
371 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
372 * IDirectDrawSurface vtable layout at the beginning */
373 *ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL;
374
375 return hr;
376 }
377
378 static HRESULT WINAPI
379 IDirectDraw4Impl_DuplicateSurface(LPDIRECTDRAW4 This,
380 LPDIRECTDRAWSURFACE4 pSrc,
381 LPDIRECTDRAWSURFACE4 *ppDst)
382 {
383 return IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw4(This),
384 (LPDIRECTDRAWSURFACE7)pSrc, (LPDIRECTDRAWSURFACE7 *)ppDst);
385 }
386
387 struct displaymodescallback_context
388 {
389 LPDDENUMMODESCALLBACK func;
390 LPVOID context;
391 };
392
393 static HRESULT CALLBACK
394 EnumDisplayModesCallbackThunk(LPDDSURFACEDESC2 pDDSD2, LPVOID context)
395 {
396 DDSURFACEDESC DDSD;
397 struct displaymodescallback_context *cbcontext = context;
398
399 memcpy(&DDSD,pDDSD2,sizeof(DDSD));
400 DDSD.dwSize = sizeof(DDSD);
401
402 return cbcontext->func(&DDSD, cbcontext->context);
403 }
404
405 static HRESULT WINAPI
406 IDirectDrawImpl_EnumDisplayModes(LPDIRECTDRAW This, DWORD dwFlags,
407 LPDDSURFACEDESC pDDSD, LPVOID context,
408 LPDDENUMMODESCALLBACK cb)
409 {
410 struct displaymodescallback_context cbcontext;
411
412 cbcontext.func = cb;
413 cbcontext.context = context;
414
415 return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw1(This),
416 dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk);
417 }
418
419 static HRESULT WINAPI
420 IDirectDraw2Impl_EnumDisplayModes(LPDIRECTDRAW2 This, DWORD dwFlags,
421 LPDDSURFACEDESC pDDSD, LPVOID context,
422 LPDDENUMMODESCALLBACK cb)
423 {
424 struct displaymodescallback_context cbcontext;
425
426 cbcontext.func = cb;
427 cbcontext.context = context;
428
429 return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw2(This),
430 dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk);
431 }
432
433 static HRESULT WINAPI
434 IDirectDraw4Impl_EnumDisplayModes(LPDIRECTDRAW4 This, DWORD dwFlags,
435 LPDDSURFACEDESC2 pDDSD, LPVOID context,
436 LPDDENUMMODESCALLBACK2 cb)
437 {
438 return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, pDDSD, context, cb);
439 }
440
441 struct surfacescallback_context
442 {
443 LPDDENUMSURFACESCALLBACK func;
444 LPVOID context;
445 };
446
447 static HRESULT CALLBACK
448 EnumSurfacesCallbackThunk(LPDIRECTDRAWSURFACE7 pSurf, LPDDSURFACEDESC2 pDDSD,
449 LPVOID context)
450 {
451 struct surfacescallback_context *cbcontext = context;
452
453 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
454 * IDirectDrawSurface vtable layout at the beginning */
455 return cbcontext->func(
456 pSurf ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf)->IDirectDrawSurface3_vtbl : NULL,
457 (LPDDSURFACEDESC)pDDSD, cbcontext->context);
458 }
459
460 static HRESULT WINAPI
461 IDirectDrawImpl_EnumSurfaces(LPDIRECTDRAW This, DWORD dwFlags,
462 LPDDSURFACEDESC pDDSD, LPVOID context,
463 LPDDENUMSURFACESCALLBACK cb)
464 {
465 struct surfacescallback_context cbcontext;
466
467 cbcontext.func = cb;
468 cbcontext.context = context;
469
470 return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw1(This),
471 dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk);
472 }
473
474 static HRESULT WINAPI
475 IDirectDraw2Impl_EnumSurfaces(LPDIRECTDRAW2 This, DWORD dwFlags,
476 LPDDSURFACEDESC pDDSD, LPVOID context,
477 LPDDENUMSURFACESCALLBACK cb)
478 {
479 struct surfacescallback_context cbcontext;
480
481 cbcontext.func = cb;
482 cbcontext.context = context;
483
484 return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw2(This),
485 dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk);
486 }
487
488 static HRESULT WINAPI
489 IDirectDraw4Impl_EnumSurfaces(LPDIRECTDRAW4 This, DWORD dwFlags,
490 LPDDSURFACEDESC2 pDDSD, LPVOID context,
491 LPDDENUMSURFACESCALLBACK2 cb)
492 {
493 return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw4(This),
494 dwFlags, pDDSD, context, (LPDDENUMSURFACESCALLBACK7)cb);
495 }
496
497 static HRESULT WINAPI
498 IDirectDrawImpl_FlipToGDISurface(LPDIRECTDRAW This)
499 {
500 return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw1(This));
501 }
502
503 static HRESULT WINAPI
504 IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 This)
505 {
506 return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw2(This));
507 }
508
509 static HRESULT WINAPI
510 IDirectDraw4Impl_FlipToGDISurface(LPDIRECTDRAW4 This)
511 {
512 return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw4(This));
513 }
514
515 static HRESULT WINAPI
516 IDirectDrawImpl_GetCaps(LPDIRECTDRAW This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
517 {
518 return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw1(This), pDDC1, pDDC2);
519 }
520
521 static HRESULT WINAPI
522 IDirectDraw2Impl_GetCaps(LPDIRECTDRAW2 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
523 {
524 return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw2(This), pDDC1, pDDC2);
525 }
526
527 static HRESULT WINAPI
528 IDirectDraw4Impl_GetCaps(LPDIRECTDRAW4 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
529 {
530 return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw4(This), pDDC1, pDDC2);
531 }
532
533 static HRESULT WINAPI
534 IDirectDrawImpl_GetDisplayMode(LPDIRECTDRAW This, LPDDSURFACEDESC pDDSD)
535 {
536 return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This), (LPDDSURFACEDESC2)pDDSD);
537 }
538
539 static HRESULT WINAPI
540 IDirectDraw2Impl_GetDisplayMode(LPDIRECTDRAW2 This, LPDDSURFACEDESC pDDSD)
541 {
542 return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This), (LPDDSURFACEDESC2)pDDSD);
543 }
544
545 static HRESULT WINAPI
546 IDirectDraw4Impl_GetDisplayMode(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pDDSD)
547 {
548 return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This), (LPDDSURFACEDESC2)pDDSD);
549 }
550
551 static HRESULT WINAPI
552 IDirectDrawImpl_GetFourCCCodes(LPDIRECTDRAW This, LPDWORD lpNumCodes,
553 LPDWORD lpCodes)
554 {
555 return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw1(This), lpNumCodes, lpCodes);
556 }
557
558 static HRESULT WINAPI
559 IDirectDraw2Impl_GetFourCCCodes(LPDIRECTDRAW2 This, LPDWORD lpNumCodes,
560 LPDWORD lpCodes)
561 {
562 return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw2(This), lpNumCodes, lpCodes);
563 }
564
565 static HRESULT WINAPI
566 IDirectDraw4Impl_GetFourCCCodes(LPDIRECTDRAW4 This, LPDWORD lpNumCodes,
567 LPDWORD lpCodes)
568 {
569 return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw4(This), lpNumCodes, lpCodes);
570 }
571
572 static HRESULT WINAPI
573 IDirectDrawImpl_GetGDISurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE *ppSurf)
574 {
575 LPDIRECTDRAWSURFACE7 pSurf7;
576 HRESULT hr;
577
578 hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw1(This), &pSurf7);
579
580 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
581 * IDirectDrawSurface vtable layout at the beginning */
582 *ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL;
583
584 return hr;
585 }
586
587 static HRESULT WINAPI
588 IDirectDraw2Impl_GetGDISurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE *ppSurf)
589 {
590 LPDIRECTDRAWSURFACE7 pSurf7;
591 HRESULT hr;
592
593 hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw2(This), &pSurf7);
594
595 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
596 * IDirectDrawSurface vtable layout at the beginning */
597 *ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL;
598
599 return hr;
600 }
601
602 static HRESULT WINAPI
603 IDirectDraw4Impl_GetGDISurface(LPDIRECTDRAW4 This,
604 LPDIRECTDRAWSURFACE4 *ppSurf)
605 {
606 return IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw4(This), (LPDIRECTDRAWSURFACE7 *)ppSurf);
607 }
608
609 static HRESULT WINAPI
610 IDirectDrawImpl_GetMonitorFrequency(LPDIRECTDRAW This, LPDWORD pdwFreq)
611 {
612 return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw1(This), pdwFreq);
613 }
614
615 static HRESULT WINAPI
616 IDirectDraw2Impl_GetMonitorFrequency(LPDIRECTDRAW2 This, LPDWORD pdwFreq)
617 {
618 return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw2(This), pdwFreq);
619 }
620
621 static HRESULT WINAPI
622 IDirectDraw4Impl_GetMonitorFrequency(LPDIRECTDRAW4 This, LPDWORD pdwFreq)
623 {
624 return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw4(This), pdwFreq);
625 }
626
627 static HRESULT WINAPI
628 IDirectDrawImpl_GetScanLine(LPDIRECTDRAW This, LPDWORD pdwLine)
629 {
630 return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw1(This), pdwLine);
631 }
632
633 static HRESULT WINAPI
634 IDirectDraw2Impl_GetScanLine(LPDIRECTDRAW2 This, LPDWORD pdwLine)
635 {
636 return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw2(This), pdwLine);
637 }
638
639 static HRESULT WINAPI
640 IDirectDraw4Impl_GetScanLine(LPDIRECTDRAW4 This, LPDWORD pdwLine)
641 {
642 return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw4(This), pdwLine);
643 }
644
645 static HRESULT WINAPI
646 IDirectDrawImpl_GetVerticalBlankStatus(LPDIRECTDRAW This, LPBOOL lpbIsInVB)
647 {
648 return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw1(This), lpbIsInVB);
649 }
650
651 static HRESULT WINAPI
652 IDirectDraw2Impl_GetVerticalBlankStatus(LPDIRECTDRAW2 This, LPBOOL lpbIsInVB)
653 {
654 return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw2(This), lpbIsInVB);
655 }
656
657 static HRESULT WINAPI
658 IDirectDraw4Impl_GetVerticalBlankStatus(LPDIRECTDRAW4 This, LPBOOL lpbIsInVB)
659 {
660 return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw4(This), lpbIsInVB);
661 }
662
663 static HRESULT WINAPI
664 IDirectDrawImpl_Initialize(LPDIRECTDRAW iface, LPGUID pGUID)
665 {
666 IDirectDrawImpl *This = ddraw_from_ddraw1(iface);
667 HRESULT ret_value;
668
669 ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
670
671 return ret_value;
672 }
673
674 static HRESULT WINAPI
675 IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, LPGUID pGUID)
676 {
677 IDirectDrawImpl *This = ddraw_from_ddraw2(iface);
678 HRESULT ret_value;
679
680 ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
681
682 return ret_value;
683 }
684
685 static HRESULT WINAPI
686 IDirectDraw4Impl_Initialize(LPDIRECTDRAW4 iface, LPGUID pGUID)
687 {
688 IDirectDrawImpl *This = ddraw_from_ddraw4(iface);
689 HRESULT ret_value;
690
691 ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
692
693 return ret_value;
694 }
695
696
697 static HRESULT WINAPI
698 IDirectDrawImpl_RestoreDisplayMode(LPDIRECTDRAW This)
699 {
700 return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This));
701 }
702
703 static HRESULT WINAPI
704 IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 This)
705 {
706 return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This));
707 }
708
709 static HRESULT WINAPI
710 IDirectDraw4Impl_RestoreDisplayMode(LPDIRECTDRAW4 This)
711 {
712 return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This));
713 }
714
715 static HRESULT WINAPI
716 IDirectDrawImpl_SetCooperativeLevel(LPDIRECTDRAW This, HWND hWnd,
717 DWORD dwFlags)
718 {
719 return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw1(This), hWnd, dwFlags);
720 }
721
722 static HRESULT WINAPI
723 IDirectDraw2Impl_SetCooperativeLevel(LPDIRECTDRAW2 This, HWND hWnd,
724 DWORD dwFlags)
725 {
726 return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw2(This), hWnd, dwFlags);
727 }
728
729 static HRESULT WINAPI
730 IDirectDraw4Impl_SetCooperativeLevel(LPDIRECTDRAW4 This, HWND hWnd,
731 DWORD dwFlags)
732 {
733 return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw4(This), hWnd, dwFlags);
734 }
735
736 static HRESULT WINAPI
737 IDirectDrawImpl_SetDisplayMode(LPDIRECTDRAW This, DWORD a, DWORD b, DWORD c)
738 {
739 return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This), a, b, c, 0, 0);
740 }
741
742 static HRESULT WINAPI
743 IDirectDraw2Impl_SetDisplayMode(LPDIRECTDRAW2 This, DWORD a, DWORD b, DWORD c,
744 DWORD d, DWORD e)
745 {
746 return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This), a, b, c, d, e);
747 }
748
749 static HRESULT WINAPI
750 IDirectDraw4Impl_SetDisplayMode(LPDIRECTDRAW4 This, DWORD a, DWORD b, DWORD c,
751 DWORD d, DWORD e)
752 {
753 return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This), a, b, c, d, e);
754 }
755
756 static HRESULT WINAPI
757 IDirectDrawImpl_WaitForVerticalBlank(LPDIRECTDRAW This, DWORD dwFlags,
758 HANDLE hEvent)
759 {
760 return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, hEvent);
761 }
762
763 static HRESULT WINAPI
764 IDirectDraw2Impl_WaitForVerticalBlank(LPDIRECTDRAW2 This, DWORD dwFlags,
765 HANDLE hEvent)
766 {
767 return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, hEvent);
768 }
769
770 static HRESULT WINAPI
771 IDirectDraw4Impl_WaitForVerticalBlank(LPDIRECTDRAW4 This, DWORD dwFlags,
772 HANDLE hEvent)
773 {
774 return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, hEvent);
775 }
776
777 static HRESULT WINAPI
778 IDirectDraw2Impl_GetAvailableVidMem(LPDIRECTDRAW2 This, LPDDSCAPS pCaps,
779 LPDWORD pdwTotal, LPDWORD pdwFree)
780 {
781 DDSCAPS2 Caps2;
782 DDRAW_Convert_DDSCAPS_1_To_2(pCaps, &Caps2);
783
784 return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw2(This), &Caps2, pdwTotal, pdwFree);
785 }
786
787 static HRESULT WINAPI
788 IDirectDraw4Impl_GetAvailableVidMem(LPDIRECTDRAW4 This, LPDDSCAPS2 pCaps,
789 LPDWORD pdwTotal, LPDWORD pdwFree)
790 {
791 return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw4(This), pCaps, pdwTotal, pdwFree);
792 }
793
794 static HRESULT WINAPI
795 IDirectDraw4Impl_GetSurfaceFromDC(LPDIRECTDRAW4 This, HDC hDC,
796 LPDIRECTDRAWSURFACE4 *pSurf)
797 {
798 return IDirectDraw7_GetSurfaceFromDC((IDirectDraw7 *)ddraw_from_ddraw4(This), hDC, (LPDIRECTDRAWSURFACE7 *)pSurf);
799 }
800
801 static HRESULT WINAPI
802 IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 This)
803 {
804 return IDirectDraw7_RestoreAllSurfaces((IDirectDraw7 *)ddraw_from_ddraw4(This));
805 }
806
807 static HRESULT WINAPI
808 IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 This)
809 {
810 return IDirectDraw7_TestCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw4(This));
811 }
812
813 static HRESULT WINAPI
814 IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 This,
815 LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags)
816 {
817 DDDEVICEIDENTIFIER2 DDDI2;
818 HRESULT hr;
819
820 hr = IDirectDraw7_GetDeviceIdentifier((IDirectDraw7 *)ddraw_from_ddraw4(This), &DDDI2, dwFlags);
821
822 DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(&DDDI2, pDDDI);
823
824 return hr;
825 }
826
827 const IDirectDrawVtbl IDirectDraw1_Vtbl =
828 {
829 IDirectDrawImpl_QueryInterface,
830 IDirectDrawImpl_AddRef,
831 IDirectDrawImpl_Release,
832 IDirectDrawImpl_Compact,
833 IDirectDrawImpl_CreateClipper,
834 IDirectDrawImpl_CreatePalette,
835 IDirectDrawImpl_CreateSurface,
836 IDirectDrawImpl_DuplicateSurface,
837 IDirectDrawImpl_EnumDisplayModes,
838 IDirectDrawImpl_EnumSurfaces,
839 IDirectDrawImpl_FlipToGDISurface,
840 IDirectDrawImpl_GetCaps,
841 IDirectDrawImpl_GetDisplayMode,
842 IDirectDrawImpl_GetFourCCCodes,
843 IDirectDrawImpl_GetGDISurface,
844 IDirectDrawImpl_GetMonitorFrequency,
845 IDirectDrawImpl_GetScanLine,
846 IDirectDrawImpl_GetVerticalBlankStatus,
847 IDirectDrawImpl_Initialize,
848 IDirectDrawImpl_RestoreDisplayMode,
849 IDirectDrawImpl_SetCooperativeLevel,
850 IDirectDrawImpl_SetDisplayMode,
851 IDirectDrawImpl_WaitForVerticalBlank,
852 };
853
854 const IDirectDraw2Vtbl IDirectDraw2_Vtbl =
855 {
856 IDirectDraw2Impl_QueryInterface,
857 IDirectDraw2Impl_AddRef,
858 IDirectDraw2Impl_Release,
859 IDirectDraw2Impl_Compact,
860 IDirectDraw2Impl_CreateClipper,
861 IDirectDraw2Impl_CreatePalette,
862 IDirectDraw2Impl_CreateSurface,
863 IDirectDraw2Impl_DuplicateSurface,
864 IDirectDraw2Impl_EnumDisplayModes,
865 IDirectDraw2Impl_EnumSurfaces,
866 IDirectDraw2Impl_FlipToGDISurface,
867 IDirectDraw2Impl_GetCaps,
868 IDirectDraw2Impl_GetDisplayMode,
869 IDirectDraw2Impl_GetFourCCCodes,
870 IDirectDraw2Impl_GetGDISurface,
871 IDirectDraw2Impl_GetMonitorFrequency,
872 IDirectDraw2Impl_GetScanLine,
873 IDirectDraw2Impl_GetVerticalBlankStatus,
874 IDirectDraw2Impl_Initialize,
875 IDirectDraw2Impl_RestoreDisplayMode,
876 IDirectDraw2Impl_SetCooperativeLevel,
877 IDirectDraw2Impl_SetDisplayMode,
878 IDirectDraw2Impl_WaitForVerticalBlank,
879 IDirectDraw2Impl_GetAvailableVidMem
880 };
881
882 const IDirectDraw4Vtbl IDirectDraw4_Vtbl =
883 {
884 IDirectDraw4Impl_QueryInterface,
885 IDirectDraw4Impl_AddRef,
886 IDirectDraw4Impl_Release,
887 IDirectDraw4Impl_Compact,
888 IDirectDraw4Impl_CreateClipper,
889 IDirectDraw4Impl_CreatePalette,
890 IDirectDraw4Impl_CreateSurface,
891 IDirectDraw4Impl_DuplicateSurface,
892 IDirectDraw4Impl_EnumDisplayModes,
893 IDirectDraw4Impl_EnumSurfaces,
894 IDirectDraw4Impl_FlipToGDISurface,
895 IDirectDraw4Impl_GetCaps,
896 IDirectDraw4Impl_GetDisplayMode,
897 IDirectDraw4Impl_GetFourCCCodes,
898 IDirectDraw4Impl_GetGDISurface,
899 IDirectDraw4Impl_GetMonitorFrequency,
900 IDirectDraw4Impl_GetScanLine,
901 IDirectDraw4Impl_GetVerticalBlankStatus,
902 IDirectDraw4Impl_Initialize,
903 IDirectDraw4Impl_RestoreDisplayMode,
904 IDirectDraw4Impl_SetCooperativeLevel,
905 IDirectDraw4Impl_SetDisplayMode,
906 IDirectDraw4Impl_WaitForVerticalBlank,
907 IDirectDraw4Impl_GetAvailableVidMem,
908 IDirectDraw4Impl_GetSurfaceFromDC,
909 IDirectDraw4Impl_RestoreAllSurfaces,
910 IDirectDraw4Impl_TestCooperativeLevel,
911 IDirectDraw4Impl_GetDeviceIdentifier
912 };