ddraw: Convert VB lock flags to wined3d flags.
[wine] / dlls / 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 IDirectDraw3Impl_QueryInterface(LPDIRECTDRAW3 This, REFIID iid, LPVOID *ppObj)
59 {
60     return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw3(This), iid, ppObj);
61 }
62
63 static HRESULT WINAPI
64 IDirectDraw4Impl_QueryInterface(LPDIRECTDRAW4 This, REFIID iid, LPVOID *ppObj)
65 {
66     return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw4(This), iid, ppObj);
67 }
68
69 static ULONG WINAPI
70 IDirectDrawImpl_AddRef(LPDIRECTDRAW iface)
71 {
72     IDirectDrawImpl *This = ddraw_from_ddraw1(iface);
73     ULONG ref = InterlockedIncrement(&This->ref1);
74
75     TRACE("(%p) : incrementing IDirectDraw refcount from %u.\n", This, ref -1);
76
77     if(ref == 1) InterlockedIncrement(&This->numIfaces);
78
79     return ref;
80 }
81
82 static ULONG WINAPI
83 IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 iface)
84 {
85     IDirectDrawImpl *This = ddraw_from_ddraw2(iface);
86     ULONG ref = InterlockedIncrement(&This->ref2);
87
88     TRACE("(%p) : incrementing IDirectDraw2 refcount from %u.\n", This, ref -1);
89
90     if(ref == 1) InterlockedIncrement(&This->numIfaces);
91
92     return ref;
93 }
94
95 static ULONG WINAPI
96 IDirectDraw3Impl_AddRef(LPDIRECTDRAW3 iface)
97 {
98     IDirectDrawImpl *This = ddraw_from_ddraw3(iface);
99     ULONG ref = InterlockedIncrement(&This->ref3);
100
101     TRACE("(%p) : incrementing IDirectDraw3 refcount from %u.\n", This, ref -1);
102
103     if(ref == 1) InterlockedIncrement(&This->numIfaces);
104
105     return ref;
106 }
107
108 static ULONG WINAPI
109 IDirectDraw4Impl_AddRef(LPDIRECTDRAW4 iface)
110 {
111     IDirectDrawImpl *This = ddraw_from_ddraw4(iface);
112     ULONG ref = InterlockedIncrement(&This->ref4);
113
114     TRACE("(%p) : incrementing IDirectDraw4 refcount from %u.\n", This, ref -1);
115
116     if(ref == 1) InterlockedIncrement(&This->numIfaces);
117
118     return ref;
119 }
120
121 static ULONG WINAPI
122 IDirectDrawImpl_Release(LPDIRECTDRAW iface)
123 {
124     IDirectDrawImpl *This = ddraw_from_ddraw1(iface);
125     ULONG ref = InterlockedDecrement(&This->ref1);
126
127     TRACE_(ddraw)("(%p)->() decrementing IDirectDraw refcount from %u.\n", This, ref +1);
128
129     if(ref == 0)
130     {
131         ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
132         if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
133     }
134
135     return ref;
136 }
137
138 static ULONG WINAPI
139 IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface)
140 {
141     IDirectDrawImpl *This = ddraw_from_ddraw2(iface);
142     ULONG ref = InterlockedDecrement(&This->ref2);
143
144     TRACE_(ddraw)("(%p)->() decrementing IDirectDraw2 refcount from %u.\n", This, ref +1);
145
146     if(ref == 0)
147     {
148         ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
149         if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
150     }
151
152     return ref;
153 }
154
155 static ULONG WINAPI
156 IDirectDraw3Impl_Release(LPDIRECTDRAW3 iface)
157 {
158     IDirectDrawImpl *This = ddraw_from_ddraw3(iface);
159     ULONG ref = InterlockedDecrement(&This->ref3);
160
161     TRACE_(ddraw)("(%p)->() decrementing IDirectDraw3 refcount from %u.\n", This, ref +1);
162
163     if(ref == 0)
164     {
165         ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
166         if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
167     }
168
169     return ref;
170 }
171
172 static ULONG WINAPI
173 IDirectDraw4Impl_Release(LPDIRECTDRAW4 iface)
174 {
175     IDirectDrawImpl *This = ddraw_from_ddraw4(iface);
176     ULONG ref = InterlockedDecrement(&This->ref4);
177
178     TRACE_(ddraw)("(%p)->() decrementing IDirectDraw4 refcount from %u.\n", This, ref +1);
179
180     if(ref == 0)
181     {
182         ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
183         if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
184     }
185
186     return ref;
187 }
188
189 static HRESULT WINAPI
190 IDirectDrawImpl_Compact(LPDIRECTDRAW This)
191 {
192     return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw1(This));
193 }
194
195 static HRESULT WINAPI
196 IDirectDraw2Impl_Compact(LPDIRECTDRAW2 This)
197 {
198     return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw2(This));
199 }
200
201     static HRESULT WINAPI
202 IDirectDraw3Impl_Compact(LPDIRECTDRAW3 This)
203 {
204     return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw3(This));
205 }
206
207 static HRESULT WINAPI
208 IDirectDraw4Impl_Compact(LPDIRECTDRAW4 This)
209 {
210     return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw4(This));
211 }
212
213 static HRESULT WINAPI
214 IDirectDrawImpl_CreateClipper(LPDIRECTDRAW This, DWORD dwFlags,
215                               LPDIRECTDRAWCLIPPER *ppClipper,
216                               IUnknown *pUnkOuter)
217 {
218     return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, ppClipper, pUnkOuter);
219 }
220
221 static HRESULT WINAPI
222 IDirectDraw2Impl_CreateClipper(LPDIRECTDRAW2 This, DWORD dwFlags,
223                                LPDIRECTDRAWCLIPPER *ppClipper,
224                                IUnknown *pUnkOuter)
225 {
226     return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, ppClipper, pUnkOuter);
227 }
228
229 static HRESULT WINAPI
230 IDirectDraw3Impl_CreateClipper(LPDIRECTDRAW3 This, DWORD dwFlags,
231                                LPDIRECTDRAWCLIPPER *ppClipper,
232                                IUnknown *pUnkOuter)
233 {
234     return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw3(This), dwFlags, ppClipper, pUnkOuter);
235 }
236
237 static HRESULT WINAPI
238 IDirectDraw4Impl_CreateClipper(LPDIRECTDRAW4 This, DWORD dwFlags,
239                                LPDIRECTDRAWCLIPPER *ppClipper,
240                                IUnknown *pUnkOuter)
241 {
242     return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, ppClipper, pUnkOuter);
243 }
244
245 static HRESULT WINAPI
246 IDirectDrawImpl_CreatePalette(LPDIRECTDRAW This, DWORD dwFlags,
247                               LPPALETTEENTRY pEntries,
248                               LPDIRECTDRAWPALETTE *ppPalette,
249                               IUnknown *pUnkOuter)
250 {
251     HRESULT hr;
252     hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, pEntries, ppPalette, pUnkOuter);
253     if(SUCCEEDED(hr) && *ppPalette)
254     {
255         IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
256         IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This));
257         impl->ifaceToRelease = NULL;
258
259     }
260     return hr;
261 }
262
263 static HRESULT WINAPI
264 IDirectDraw2Impl_CreatePalette(LPDIRECTDRAW2 This, DWORD dwFlags,
265                                LPPALETTEENTRY pEntries,
266                                LPDIRECTDRAWPALETTE *ppPalette,
267                                IUnknown *pUnkOuter)
268 {
269     HRESULT hr;
270     hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, pEntries, ppPalette, pUnkOuter);
271     if(SUCCEEDED(hr) && *ppPalette)
272     {
273         IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
274         IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This));
275         impl->ifaceToRelease = NULL;
276     }
277     return hr;
278 }
279
280 static HRESULT WINAPI
281 IDirectDraw3Impl_CreatePalette(LPDIRECTDRAW3 This, DWORD dwFlags,
282                                LPPALETTEENTRY pEntries,
283                                LPDIRECTDRAWPALETTE *ppPalette,
284                                IUnknown *pUnkOuter)
285 {
286     HRESULT hr;
287     hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw3(This), dwFlags, pEntries, ppPalette, pUnkOuter);
288     if(SUCCEEDED(hr) && *ppPalette)
289     {
290         IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
291         IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw3(This));
292         IDirectDraw4_AddRef(This);
293         impl->ifaceToRelease = (IUnknown *) This;
294     }
295     return hr;
296 }
297
298 static HRESULT WINAPI
299 IDirectDraw4Impl_CreatePalette(LPDIRECTDRAW4 This, DWORD dwFlags,
300                                LPPALETTEENTRY pEntries,
301                                LPDIRECTDRAWPALETTE *ppPalette,
302                                IUnknown *pUnkOuter)
303 {
304     HRESULT hr;
305     hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, pEntries, ppPalette, pUnkOuter);
306     if(SUCCEEDED(hr) && *ppPalette)
307     {
308         IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
309         IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw4(This));
310         IDirectDraw4_AddRef(This);
311         impl->ifaceToRelease = (IUnknown *) This;
312     }
313     return hr;
314 }
315
316 /* Must set all attached surfaces (e.g. mipmaps) versions as well */
317 static void set_surf_version(IDirectDrawSurfaceImpl *surf, int version)
318 {
319     int i;
320     TRACE("%p->version(%d) = %d\n", surf, surf->version, version);
321     surf->version = version;
322     for(i = 0; i < MAX_COMPLEX_ATTACHED; i++)
323     {
324         if(!surf->complex_array[i]) break;
325         set_surf_version(surf->complex_array[i], version);
326     }
327     while( (surf = surf->next_attached) )
328     {
329         set_surf_version(surf, version);
330     }
331 }
332
333 static HRESULT WINAPI
334 IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
335                               LPDIRECTDRAWSURFACE *ppSurface,
336                               IUnknown *pUnkOuter)
337 {
338     LPDIRECTDRAWSURFACE7 pSurface7;
339     IDirectDrawSurfaceImpl *impl;
340     HRESULT hr;
341
342     /* Remove front buffer flag, this causes failure in v7, and its added to normal
343      * primaries anyway
344      */
345     pSDesc->ddsCaps.dwCaps &= ~DDSCAPS_FRONTBUFFER;
346     /* the LPDDSURFACEDESC -> LPDDSURFACEDESC2 conversion should be ok,
347      * since the data layout is the same */
348     hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This),
349             (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
350     if (FAILED(hr))
351     {
352         *ppSurface = NULL;
353         return hr;
354     }
355
356     impl = (IDirectDrawSurfaceImpl *)pSurface7;
357     *ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
358     set_surf_version(impl, 1);
359     IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This));
360     impl->ifaceToRelease = NULL;
361
362     return hr;
363 }
364
365 static HRESULT WINAPI
366 IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc,
367                                LPDIRECTDRAWSURFACE *ppSurface,
368                                IUnknown *pUnkOuter)
369 {
370     LPDIRECTDRAWSURFACE7 pSurface7;
371     IDirectDrawSurfaceImpl *impl;
372     HRESULT hr;
373
374     hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This),
375             (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
376     if (FAILED(hr))
377     {
378         *ppSurface = NULL;
379         return hr;
380     }
381
382     impl = (IDirectDrawSurfaceImpl *)pSurface7;
383     *ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
384     set_surf_version(impl, 2);
385     IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This));
386     impl->ifaceToRelease = NULL;
387
388     return hr;
389 }
390
391 static HRESULT WINAPI
392 IDirectDraw3Impl_CreateSurface(LPDIRECTDRAW3 This, LPDDSURFACEDESC pSDesc,
393                                LPDIRECTDRAWSURFACE *ppSurface,
394                                IUnknown *pUnkOuter)
395 {
396     LPDIRECTDRAWSURFACE7 pSurface7;
397     IDirectDrawSurfaceImpl *impl;
398     HRESULT hr;
399
400     hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw3(This),
401             (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
402     if (FAILED(hr))
403     {
404         *ppSurface = NULL;
405         return hr;
406     }
407
408     impl = (IDirectDrawSurfaceImpl *)pSurface7;
409     *ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
410     set_surf_version(impl, 3);
411     IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw3(This));
412     IDirectDraw3_AddRef(This);
413     impl->ifaceToRelease = (IUnknown *) This;
414
415     return hr;
416 }
417
418 static HRESULT WINAPI
419 IDirectDraw4Impl_CreateSurface(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pSDesc,
420                                LPDIRECTDRAWSURFACE4 *ppSurface,
421                                IUnknown *pUnkOuter)
422 {
423     HRESULT hr;
424     IDirectDrawSurfaceImpl *impl;
425
426     hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw4(This),
427             pSDesc, (LPDIRECTDRAWSURFACE7 *)ppSurface, pUnkOuter);
428     impl = (IDirectDrawSurfaceImpl *)*ppSurface;
429     if(SUCCEEDED(hr) && impl)
430     {
431         set_surf_version(impl, 4);
432         IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw4(This));
433         IDirectDraw4_AddRef(This);
434         impl->ifaceToRelease = (IUnknown *) This;
435     }
436     return hr;
437 }
438
439 static HRESULT WINAPI
440 IDirectDrawImpl_DuplicateSurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE pSrc,
441                                  LPDIRECTDRAWSURFACE *ppDst)
442 {
443     LPDIRECTDRAWSURFACE7 pDst7;
444     HRESULT hr;
445
446     hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This),
447             pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7);
448
449     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
450      * IDirectDrawSurface vtable layout at the beginning  */
451     *ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL;
452
453     return hr;
454 }
455
456 static HRESULT WINAPI
457 IDirectDraw2Impl_DuplicateSurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE pSrc,
458                                   LPDIRECTDRAWSURFACE *ppDst)
459 {
460     LPDIRECTDRAWSURFACE7 pDst7;
461     HRESULT hr;
462
463     hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This),
464             pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7);
465
466     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
467      * IDirectDrawSurface vtable layout at the beginning  */
468     *ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL;
469
470     return hr;
471 }
472
473 static HRESULT WINAPI
474 IDirectDraw3Impl_DuplicateSurface(LPDIRECTDRAW3 This, LPDIRECTDRAWSURFACE pSrc,
475                                   LPDIRECTDRAWSURFACE *ppDst)
476 {
477     LPDIRECTDRAWSURFACE7 pDst7;
478     HRESULT hr;
479
480     hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw3(This),
481             pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7);
482
483     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
484      * IDirectDrawSurface vtable layout at the beginning  */
485     *ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL;
486
487     return hr;
488 }
489
490 static HRESULT WINAPI
491 IDirectDraw4Impl_DuplicateSurface(LPDIRECTDRAW4 This,
492                                   LPDIRECTDRAWSURFACE4 pSrc,
493                                   LPDIRECTDRAWSURFACE4 *ppDst)
494 {
495     return IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw4(This),
496             (LPDIRECTDRAWSURFACE7)pSrc, (LPDIRECTDRAWSURFACE7 *)ppDst);
497 }
498
499 struct displaymodescallback_context
500 {
501     LPDDENUMMODESCALLBACK func;
502     LPVOID context;
503 };
504
505 static HRESULT CALLBACK
506 EnumDisplayModesCallbackThunk(LPDDSURFACEDESC2 pDDSD2, LPVOID context)
507 {
508     DDSURFACEDESC DDSD;
509     struct displaymodescallback_context *cbcontext = context;
510
511     memcpy(&DDSD,pDDSD2,sizeof(DDSD));
512     DDSD.dwSize = sizeof(DDSD);
513
514     return cbcontext->func(&DDSD, cbcontext->context);
515 }
516
517 static HRESULT WINAPI
518 IDirectDrawImpl_EnumDisplayModes(LPDIRECTDRAW This, DWORD dwFlags,
519                                  LPDDSURFACEDESC pDDSD, LPVOID context,
520                                  LPDDENUMMODESCALLBACK cb)
521 {
522     struct displaymodescallback_context cbcontext;
523
524     cbcontext.func    = cb;
525     cbcontext.context = context;
526
527     return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw1(This),
528             dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk);
529 }
530
531 static HRESULT WINAPI
532 IDirectDraw2Impl_EnumDisplayModes(LPDIRECTDRAW2 This, DWORD dwFlags,
533                                   LPDDSURFACEDESC pDDSD, LPVOID context,
534                                   LPDDENUMMODESCALLBACK cb)
535 {
536     struct displaymodescallback_context cbcontext;
537
538     cbcontext.func    = cb;
539     cbcontext.context = context;
540
541     return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw2(This),
542             dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk);
543 }
544
545 static HRESULT WINAPI
546 IDirectDraw3Impl_EnumDisplayModes(LPDIRECTDRAW3 This, DWORD dwFlags,
547                                   LPDDSURFACEDESC pDDSD, LPVOID context,
548                                   LPDDENUMMODESCALLBACK cb)
549 {
550     struct displaymodescallback_context cbcontext;
551
552     cbcontext.func    = cb;
553     cbcontext.context = context;
554
555     return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw3(This),
556             dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk);
557 }
558
559 static HRESULT WINAPI
560 IDirectDraw4Impl_EnumDisplayModes(LPDIRECTDRAW4 This, DWORD dwFlags,
561                                   LPDDSURFACEDESC2 pDDSD, LPVOID context,
562                                   LPDDENUMMODESCALLBACK2 cb)
563 {
564     return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, pDDSD, context, cb);
565 }
566
567 struct surfacescallback_context
568 {
569     LPDDENUMSURFACESCALLBACK func;
570     LPVOID context;
571 };
572
573 static HRESULT CALLBACK
574 EnumSurfacesCallbackThunk(LPDIRECTDRAWSURFACE7 pSurf, LPDDSURFACEDESC2 pDDSD,
575                           LPVOID context)
576 {
577     struct surfacescallback_context *cbcontext = context;
578
579     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
580      * IDirectDrawSurface vtable layout at the beginning  */
581     return cbcontext->func(
582             pSurf ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf)->IDirectDrawSurface3_vtbl : NULL,
583             (LPDDSURFACEDESC)pDDSD, cbcontext->context);
584 }
585
586 static HRESULT WINAPI
587 IDirectDrawImpl_EnumSurfaces(LPDIRECTDRAW This, DWORD dwFlags,
588                              LPDDSURFACEDESC pDDSD, LPVOID context,
589                              LPDDENUMSURFACESCALLBACK cb)
590 {
591     struct surfacescallback_context cbcontext;
592
593     cbcontext.func    = cb;
594     cbcontext.context = context;
595
596     return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw1(This),
597             dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk);
598 }
599
600 static HRESULT WINAPI
601 IDirectDraw2Impl_EnumSurfaces(LPDIRECTDRAW2 This, DWORD dwFlags,
602                               LPDDSURFACEDESC pDDSD, LPVOID context,
603                               LPDDENUMSURFACESCALLBACK cb)
604 {
605     struct surfacescallback_context cbcontext;
606
607     cbcontext.func    = cb;
608     cbcontext.context = context;
609
610     return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw2(This),
611             dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk);
612 }
613
614 static HRESULT WINAPI
615 IDirectDraw3Impl_EnumSurfaces(LPDIRECTDRAW3 This, DWORD dwFlags,
616                               LPDDSURFACEDESC pDDSD, LPVOID context,
617                               LPDDENUMSURFACESCALLBACK cb)
618 {
619     struct surfacescallback_context cbcontext;
620
621     cbcontext.func    = cb;
622     cbcontext.context = context;
623
624     return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw3(This),
625             dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk);
626 }
627
628 static HRESULT WINAPI
629 IDirectDraw4Impl_EnumSurfaces(LPDIRECTDRAW4 This, DWORD dwFlags,
630                               LPDDSURFACEDESC2 pDDSD, LPVOID context,
631                               LPDDENUMSURFACESCALLBACK2 cb)
632 {
633     return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw4(This),
634             dwFlags, pDDSD, context, (LPDDENUMSURFACESCALLBACK7)cb);
635 }
636
637 static HRESULT WINAPI
638 IDirectDrawImpl_FlipToGDISurface(LPDIRECTDRAW This)
639 {
640     return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw1(This));
641 }
642
643 static HRESULT WINAPI
644 IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 This)
645 {
646     return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw2(This));
647 }
648
649 static HRESULT WINAPI
650 IDirectDraw3Impl_FlipToGDISurface(LPDIRECTDRAW3 This)
651 {
652     return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw3(This));
653 }
654
655 static HRESULT WINAPI
656 IDirectDraw4Impl_FlipToGDISurface(LPDIRECTDRAW4 This)
657 {
658     return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw4(This));
659 }
660
661 static HRESULT WINAPI
662 IDirectDrawImpl_GetCaps(LPDIRECTDRAW This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
663 {
664     return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw1(This), pDDC1, pDDC2);
665 }
666
667 static HRESULT WINAPI
668 IDirectDraw2Impl_GetCaps(LPDIRECTDRAW2 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
669 {
670     return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw2(This), pDDC1, pDDC2);
671 }
672
673 static HRESULT WINAPI
674 IDirectDraw3Impl_GetCaps(LPDIRECTDRAW3 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
675 {
676     return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw3(This), pDDC1, pDDC2);
677 }
678
679 static HRESULT WINAPI
680 IDirectDraw4Impl_GetCaps(LPDIRECTDRAW4 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
681 {
682     return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw4(This), pDDC1, pDDC2);
683 }
684
685 static HRESULT WINAPI
686 IDirectDrawImpl_GetDisplayMode(LPDIRECTDRAW This, LPDDSURFACEDESC pDDSD)
687 {
688     return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This), (LPDDSURFACEDESC2)pDDSD);
689 }
690
691 static HRESULT WINAPI
692 IDirectDraw2Impl_GetDisplayMode(LPDIRECTDRAW2 This, LPDDSURFACEDESC pDDSD)
693 {
694     return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This), (LPDDSURFACEDESC2)pDDSD);
695 }
696
697 static HRESULT WINAPI
698 IDirectDraw3Impl_GetDisplayMode(LPDIRECTDRAW3 This, LPDDSURFACEDESC pDDSD)
699 {
700     return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw3(This), (LPDDSURFACEDESC2)pDDSD);
701 }
702
703 static HRESULT WINAPI
704 IDirectDraw4Impl_GetDisplayMode(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pDDSD)
705 {
706     return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This), (LPDDSURFACEDESC2)pDDSD);
707 }
708
709 static HRESULT WINAPI
710 IDirectDrawImpl_GetFourCCCodes(LPDIRECTDRAW This, LPDWORD lpNumCodes,
711                                LPDWORD lpCodes)
712 {
713     return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw1(This), lpNumCodes, lpCodes);
714 }
715
716 static HRESULT WINAPI
717 IDirectDraw2Impl_GetFourCCCodes(LPDIRECTDRAW2 This, LPDWORD lpNumCodes,
718                                 LPDWORD lpCodes)
719 {
720     return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw2(This), lpNumCodes, lpCodes);
721 }
722
723 static HRESULT WINAPI
724 IDirectDraw3Impl_GetFourCCCodes(LPDIRECTDRAW3 This, LPDWORD lpNumCodes,
725                                 LPDWORD lpCodes)
726 {
727     return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw3(This), lpNumCodes, lpCodes);
728 }
729
730 static HRESULT WINAPI
731 IDirectDraw4Impl_GetFourCCCodes(LPDIRECTDRAW4 This, LPDWORD lpNumCodes,
732                                 LPDWORD lpCodes)
733 {
734     return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw4(This), lpNumCodes, lpCodes);
735 }
736
737 static HRESULT WINAPI
738 IDirectDrawImpl_GetGDISurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE *ppSurf)
739 {
740     LPDIRECTDRAWSURFACE7 pSurf7;
741     HRESULT hr;
742
743     hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw1(This), &pSurf7);
744
745     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
746      * IDirectDrawSurface vtable layout at the beginning  */
747     *ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL;
748
749     return hr;
750 }
751
752 static HRESULT WINAPI
753 IDirectDraw2Impl_GetGDISurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE *ppSurf)
754 {
755     LPDIRECTDRAWSURFACE7 pSurf7;
756     HRESULT hr;
757
758     hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw2(This), &pSurf7);
759
760     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
761      * IDirectDrawSurface vtable layout at the beginning  */
762     *ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL;
763
764     return hr;
765 }
766
767 static HRESULT WINAPI
768 IDirectDraw3Impl_GetGDISurface(LPDIRECTDRAW3 This, LPDIRECTDRAWSURFACE *ppSurf)
769 {
770     LPDIRECTDRAWSURFACE7 pSurf7;
771     HRESULT hr;
772
773     hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw3(This), &pSurf7);
774
775     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
776      * IDirectDrawSurface vtable layout at the beginning  */
777     *ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL;
778
779     return hr;
780 }
781
782 static HRESULT WINAPI
783 IDirectDraw4Impl_GetGDISurface(LPDIRECTDRAW4 This,
784                                LPDIRECTDRAWSURFACE4 *ppSurf)
785 {
786     return IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw4(This), (LPDIRECTDRAWSURFACE7 *)ppSurf);
787 }
788
789 static HRESULT WINAPI
790 IDirectDrawImpl_GetMonitorFrequency(LPDIRECTDRAW This, LPDWORD pdwFreq)
791 {
792     return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw1(This), pdwFreq);
793 }
794
795 static HRESULT WINAPI
796 IDirectDraw2Impl_GetMonitorFrequency(LPDIRECTDRAW2 This, LPDWORD pdwFreq)
797 {
798     return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw2(This), pdwFreq);
799 }
800
801 static HRESULT WINAPI
802 IDirectDraw3Impl_GetMonitorFrequency(LPDIRECTDRAW3 This, LPDWORD pdwFreq)
803 {
804     return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw3(This), pdwFreq);
805 }
806
807 static HRESULT WINAPI
808 IDirectDraw4Impl_GetMonitorFrequency(LPDIRECTDRAW4 This, LPDWORD pdwFreq)
809 {
810     return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw4(This), pdwFreq);
811 }
812
813 static HRESULT WINAPI
814 IDirectDrawImpl_GetScanLine(LPDIRECTDRAW This, LPDWORD pdwLine)
815 {
816     return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw1(This), pdwLine);
817 }
818
819 static HRESULT WINAPI
820 IDirectDraw2Impl_GetScanLine(LPDIRECTDRAW2 This, LPDWORD pdwLine)
821 {
822     return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw2(This), pdwLine);
823 }
824
825 static HRESULT WINAPI
826 IDirectDraw3Impl_GetScanLine(LPDIRECTDRAW3 This, LPDWORD pdwLine)
827 {
828     return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw3(This), pdwLine);
829 }
830
831 static HRESULT WINAPI
832 IDirectDraw4Impl_GetScanLine(LPDIRECTDRAW4 This, LPDWORD pdwLine)
833 {
834     return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw4(This), pdwLine);
835 }
836
837 static HRESULT WINAPI
838 IDirectDrawImpl_GetVerticalBlankStatus(LPDIRECTDRAW This, LPBOOL lpbIsInVB)
839 {
840     return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw1(This), lpbIsInVB);
841 }
842
843 static HRESULT WINAPI
844 IDirectDraw2Impl_GetVerticalBlankStatus(LPDIRECTDRAW2 This, LPBOOL lpbIsInVB)
845 {
846     return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw2(This), lpbIsInVB);
847 }
848
849 static HRESULT WINAPI
850 IDirectDraw3Impl_GetVerticalBlankStatus(LPDIRECTDRAW3 This, LPBOOL lpbIsInVB)
851 {
852     return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw3(This), lpbIsInVB);
853 }
854
855 static HRESULT WINAPI
856 IDirectDraw4Impl_GetVerticalBlankStatus(LPDIRECTDRAW4 This, LPBOOL lpbIsInVB)
857 {
858     return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw4(This), lpbIsInVB);
859 }
860
861 static HRESULT WINAPI
862 IDirectDrawImpl_Initialize(LPDIRECTDRAW iface, LPGUID pGUID)
863 {
864     IDirectDrawImpl *This = ddraw_from_ddraw1(iface);
865     HRESULT ret_value;
866
867     ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
868
869     return ret_value;
870 }
871
872 static HRESULT WINAPI
873 IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, LPGUID pGUID)
874 {
875     IDirectDrawImpl *This = ddraw_from_ddraw2(iface);
876     HRESULT ret_value;
877
878     ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
879
880     return ret_value;
881 }
882
883 static HRESULT WINAPI
884 IDirectDraw3Impl_Initialize(LPDIRECTDRAW3 iface, LPGUID pGUID)
885 {
886     IDirectDrawImpl *This = ddraw_from_ddraw3(iface);
887     HRESULT ret_value;
888
889     ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
890
891     return ret_value;
892 }
893
894 static HRESULT WINAPI
895 IDirectDraw4Impl_Initialize(LPDIRECTDRAW4 iface, LPGUID pGUID)
896 {
897     IDirectDrawImpl *This = ddraw_from_ddraw4(iface);
898     HRESULT ret_value;
899
900     ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
901
902     return ret_value;
903 }
904
905
906 static HRESULT WINAPI
907 IDirectDrawImpl_RestoreDisplayMode(LPDIRECTDRAW This)
908 {
909     return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This));
910 }
911
912 static HRESULT WINAPI
913 IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 This)
914 {
915     return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This));
916 }
917
918 static HRESULT WINAPI
919 IDirectDraw3Impl_RestoreDisplayMode(LPDIRECTDRAW3 This)
920 {
921     return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw3(This));
922 }
923
924 static HRESULT WINAPI
925 IDirectDraw4Impl_RestoreDisplayMode(LPDIRECTDRAW4 This)
926 {
927     return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This));
928 }
929
930 static HRESULT WINAPI
931 IDirectDrawImpl_SetCooperativeLevel(LPDIRECTDRAW This, HWND hWnd,
932                                     DWORD dwFlags)
933 {
934     return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw1(This), hWnd, dwFlags);
935 }
936
937 static HRESULT WINAPI
938 IDirectDraw2Impl_SetCooperativeLevel(LPDIRECTDRAW2 This, HWND hWnd,
939                                      DWORD dwFlags)
940 {
941     return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw2(This), hWnd, dwFlags);
942 }
943
944 static HRESULT WINAPI
945 IDirectDraw3Impl_SetCooperativeLevel(LPDIRECTDRAW3 This, HWND hWnd,
946                                      DWORD dwFlags)
947 {
948     return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw3(This), hWnd, dwFlags);
949 }
950
951 static HRESULT WINAPI
952 IDirectDraw4Impl_SetCooperativeLevel(LPDIRECTDRAW4 This, HWND hWnd,
953                                      DWORD dwFlags)
954 {
955     return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw4(This), hWnd, dwFlags);
956 }
957
958 static HRESULT WINAPI
959 IDirectDrawImpl_SetDisplayMode(LPDIRECTDRAW This, DWORD a, DWORD b, DWORD c)
960 {
961     return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This), a, b, c, 0, 0);
962 }
963
964 static HRESULT WINAPI
965 IDirectDraw2Impl_SetDisplayMode(LPDIRECTDRAW2 This, DWORD a, DWORD b, DWORD c,
966                                 DWORD d, DWORD e)
967 {
968     return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This), a, b, c, d, e);
969 }
970
971 static HRESULT WINAPI
972 IDirectDraw3Impl_SetDisplayMode(LPDIRECTDRAW3 This, DWORD a, DWORD b, DWORD c,
973                                 DWORD d, DWORD e)
974 {
975     return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw3(This), a, b, c, d, e);
976 }
977
978 static HRESULT WINAPI
979 IDirectDraw4Impl_SetDisplayMode(LPDIRECTDRAW4 This, DWORD a, DWORD b, DWORD c,
980                                 DWORD d, DWORD e)
981 {
982     return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This), a, b, c, d, e);
983 }
984
985 static HRESULT WINAPI
986 IDirectDrawImpl_WaitForVerticalBlank(LPDIRECTDRAW This, DWORD dwFlags,
987                                      HANDLE hEvent)
988 {
989     return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, hEvent);
990 }
991
992 static HRESULT WINAPI
993 IDirectDraw2Impl_WaitForVerticalBlank(LPDIRECTDRAW2 This, DWORD dwFlags,
994                                       HANDLE hEvent)
995 {
996     return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, hEvent);
997 }
998
999 static HRESULT WINAPI
1000 IDirectDraw3Impl_WaitForVerticalBlank(LPDIRECTDRAW3 This, DWORD dwFlags,
1001                                       HANDLE hEvent)
1002 {
1003     return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw3(This), dwFlags, hEvent);
1004 }
1005
1006 static HRESULT WINAPI
1007 IDirectDraw4Impl_WaitForVerticalBlank(LPDIRECTDRAW4 This, DWORD dwFlags,
1008                                       HANDLE hEvent)
1009 {
1010     return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, hEvent);
1011 }
1012
1013 static HRESULT WINAPI
1014 IDirectDraw2Impl_GetAvailableVidMem(LPDIRECTDRAW2 This, LPDDSCAPS pCaps,
1015                                     LPDWORD pdwTotal, LPDWORD pdwFree)
1016 {
1017     DDSCAPS2 Caps2;
1018     DDRAW_Convert_DDSCAPS_1_To_2(pCaps, &Caps2);
1019
1020     return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw2(This), &Caps2, pdwTotal, pdwFree);
1021 }
1022
1023 static HRESULT WINAPI
1024 IDirectDraw3Impl_GetAvailableVidMem(LPDIRECTDRAW3 This, LPDDSCAPS pCaps,
1025                                     LPDWORD pdwTotal, LPDWORD pdwFree)
1026 {
1027     DDSCAPS2 Caps2;
1028     DDRAW_Convert_DDSCAPS_1_To_2(pCaps, &Caps2);
1029
1030     return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw3(This), &Caps2, pdwTotal, pdwFree);
1031 }
1032
1033 static HRESULT WINAPI
1034 IDirectDraw4Impl_GetAvailableVidMem(LPDIRECTDRAW4 This, LPDDSCAPS2 pCaps,
1035                                     LPDWORD pdwTotal, LPDWORD pdwFree)
1036 {
1037     return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw4(This), pCaps, pdwTotal, pdwFree);
1038 }
1039
1040 static HRESULT WINAPI
1041 IDirectDraw3Impl_GetSurfaceFromDC(LPDIRECTDRAW3 This, HDC hDC,
1042                                   LPDIRECTDRAWSURFACE *pSurf)
1043 {
1044     return IDirectDraw7_GetSurfaceFromDC((IDirectDraw7 *)ddraw_from_ddraw3(This), hDC, (LPDIRECTDRAWSURFACE7 *)pSurf);
1045 }
1046
1047 static HRESULT WINAPI
1048 IDirectDraw4Impl_GetSurfaceFromDC(LPDIRECTDRAW4 This, HDC hDC,
1049                                   LPDIRECTDRAWSURFACE4 *pSurf)
1050 {
1051     return IDirectDraw7_GetSurfaceFromDC((IDirectDraw7 *)ddraw_from_ddraw4(This), hDC, (LPDIRECTDRAWSURFACE7 *)pSurf);
1052 }
1053
1054 static HRESULT WINAPI
1055 IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 This)
1056 {
1057     return IDirectDraw7_RestoreAllSurfaces((IDirectDraw7 *)ddraw_from_ddraw4(This));
1058 }
1059
1060 static HRESULT WINAPI
1061 IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 This)
1062 {
1063     return IDirectDraw7_TestCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw4(This));
1064 }
1065
1066 static HRESULT WINAPI
1067 IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 This,
1068                                      LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags)
1069 {
1070     DDDEVICEIDENTIFIER2 DDDI2;
1071     HRESULT hr;
1072
1073     hr = IDirectDraw7_GetDeviceIdentifier((IDirectDraw7 *)ddraw_from_ddraw4(This), &DDDI2, dwFlags);
1074
1075     DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(&DDDI2, pDDDI);
1076
1077     return hr;
1078 }
1079
1080 const IDirectDrawVtbl IDirectDraw1_Vtbl =
1081 {
1082     IDirectDrawImpl_QueryInterface,
1083     IDirectDrawImpl_AddRef,
1084     IDirectDrawImpl_Release,
1085     IDirectDrawImpl_Compact,
1086     IDirectDrawImpl_CreateClipper,
1087     IDirectDrawImpl_CreatePalette,
1088     IDirectDrawImpl_CreateSurface,
1089     IDirectDrawImpl_DuplicateSurface,
1090     IDirectDrawImpl_EnumDisplayModes,
1091     IDirectDrawImpl_EnumSurfaces,
1092     IDirectDrawImpl_FlipToGDISurface,
1093     IDirectDrawImpl_GetCaps,
1094     IDirectDrawImpl_GetDisplayMode,
1095     IDirectDrawImpl_GetFourCCCodes,
1096     IDirectDrawImpl_GetGDISurface,
1097     IDirectDrawImpl_GetMonitorFrequency,
1098     IDirectDrawImpl_GetScanLine,
1099     IDirectDrawImpl_GetVerticalBlankStatus,
1100     IDirectDrawImpl_Initialize,
1101     IDirectDrawImpl_RestoreDisplayMode,
1102     IDirectDrawImpl_SetCooperativeLevel,
1103     IDirectDrawImpl_SetDisplayMode,
1104     IDirectDrawImpl_WaitForVerticalBlank,
1105 };
1106
1107 const IDirectDraw2Vtbl IDirectDraw2_Vtbl =
1108 {
1109     IDirectDraw2Impl_QueryInterface,
1110     IDirectDraw2Impl_AddRef,
1111     IDirectDraw2Impl_Release,
1112     IDirectDraw2Impl_Compact,
1113     IDirectDraw2Impl_CreateClipper,
1114     IDirectDraw2Impl_CreatePalette,
1115     IDirectDraw2Impl_CreateSurface,
1116     IDirectDraw2Impl_DuplicateSurface,
1117     IDirectDraw2Impl_EnumDisplayModes,
1118     IDirectDraw2Impl_EnumSurfaces,
1119     IDirectDraw2Impl_FlipToGDISurface,
1120     IDirectDraw2Impl_GetCaps,
1121     IDirectDraw2Impl_GetDisplayMode,
1122     IDirectDraw2Impl_GetFourCCCodes,
1123     IDirectDraw2Impl_GetGDISurface,
1124     IDirectDraw2Impl_GetMonitorFrequency,
1125     IDirectDraw2Impl_GetScanLine,
1126     IDirectDraw2Impl_GetVerticalBlankStatus,
1127     IDirectDraw2Impl_Initialize,
1128     IDirectDraw2Impl_RestoreDisplayMode,
1129     IDirectDraw2Impl_SetCooperativeLevel,
1130     IDirectDraw2Impl_SetDisplayMode,
1131     IDirectDraw2Impl_WaitForVerticalBlank,
1132     IDirectDraw2Impl_GetAvailableVidMem
1133 };
1134
1135 const IDirectDraw3Vtbl IDirectDraw3_Vtbl =
1136 {
1137     IDirectDraw3Impl_QueryInterface,
1138     IDirectDraw3Impl_AddRef,
1139     IDirectDraw3Impl_Release,
1140     IDirectDraw3Impl_Compact,
1141     IDirectDraw3Impl_CreateClipper,
1142     IDirectDraw3Impl_CreatePalette,
1143     IDirectDraw3Impl_CreateSurface,
1144     IDirectDraw3Impl_DuplicateSurface,
1145     IDirectDraw3Impl_EnumDisplayModes,
1146     IDirectDraw3Impl_EnumSurfaces,
1147     IDirectDraw3Impl_FlipToGDISurface,
1148     IDirectDraw3Impl_GetCaps,
1149     IDirectDraw3Impl_GetDisplayMode,
1150     IDirectDraw3Impl_GetFourCCCodes,
1151     IDirectDraw3Impl_GetGDISurface,
1152     IDirectDraw3Impl_GetMonitorFrequency,
1153     IDirectDraw3Impl_GetScanLine,
1154     IDirectDraw3Impl_GetVerticalBlankStatus,
1155     IDirectDraw3Impl_Initialize,
1156     IDirectDraw3Impl_RestoreDisplayMode,
1157     IDirectDraw3Impl_SetCooperativeLevel,
1158     IDirectDraw3Impl_SetDisplayMode,
1159     IDirectDraw3Impl_WaitForVerticalBlank,
1160     IDirectDraw3Impl_GetAvailableVidMem,
1161     IDirectDraw3Impl_GetSurfaceFromDC,
1162 };
1163
1164 const IDirectDraw4Vtbl IDirectDraw4_Vtbl =
1165 {
1166     IDirectDraw4Impl_QueryInterface,
1167     IDirectDraw4Impl_AddRef,
1168     IDirectDraw4Impl_Release,
1169     IDirectDraw4Impl_Compact,
1170     IDirectDraw4Impl_CreateClipper,
1171     IDirectDraw4Impl_CreatePalette,
1172     IDirectDraw4Impl_CreateSurface,
1173     IDirectDraw4Impl_DuplicateSurface,
1174     IDirectDraw4Impl_EnumDisplayModes,
1175     IDirectDraw4Impl_EnumSurfaces,
1176     IDirectDraw4Impl_FlipToGDISurface,
1177     IDirectDraw4Impl_GetCaps,
1178     IDirectDraw4Impl_GetDisplayMode,
1179     IDirectDraw4Impl_GetFourCCCodes,
1180     IDirectDraw4Impl_GetGDISurface,
1181     IDirectDraw4Impl_GetMonitorFrequency,
1182     IDirectDraw4Impl_GetScanLine,
1183     IDirectDraw4Impl_GetVerticalBlankStatus,
1184     IDirectDraw4Impl_Initialize,
1185     IDirectDraw4Impl_RestoreDisplayMode,
1186     IDirectDraw4Impl_SetCooperativeLevel,
1187     IDirectDraw4Impl_SetDisplayMode,
1188     IDirectDraw4Impl_WaitForVerticalBlank,
1189     IDirectDraw4Impl_GetAvailableVidMem,
1190     IDirectDraw4Impl_GetSurfaceFromDC,
1191     IDirectDraw4Impl_RestoreAllSurfaces,
1192     IDirectDraw4Impl_TestCooperativeLevel,
1193     IDirectDraw4Impl_GetDeviceIdentifier
1194 };