ddraw: Exclude unused headers.
[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(COM_INTERFACE_CAST(IDirectDrawImpl,
49                                                           IDirectDraw,
50                                                           IDirectDraw7, This),
51                                        iid, ppObj);
52 }
53
54 static HRESULT WINAPI
55 IDirectDraw2Impl_QueryInterface(LPDIRECTDRAW2 This, REFIID iid, LPVOID *ppObj)
56 {
57     return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl,
58                                                           IDirectDraw2,
59                                                           IDirectDraw7, This),
60                                        iid, ppObj);
61 }
62
63 static HRESULT WINAPI
64 IDirectDraw3Impl_QueryInterface(LPDIRECTDRAW3 This, REFIID iid, LPVOID *ppObj)
65 {
66     return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl,
67                                                           IDirectDraw3,
68                                                           IDirectDraw7, This),
69                                        iid, ppObj);
70 }
71
72 static HRESULT WINAPI
73 IDirectDraw4Impl_QueryInterface(LPDIRECTDRAW4 This, REFIID iid, LPVOID *ppObj)
74 {
75     return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl,
76                                                           IDirectDraw4,
77                                                           IDirectDraw7, This),
78                                        iid, ppObj);
79 }
80
81 static ULONG WINAPI
82 IDirectDrawImpl_AddRef(LPDIRECTDRAW iface)
83 {
84     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw, iface);
85     ULONG ref = InterlockedIncrement(&This->ref1);
86
87     TRACE("(%p) : incrementing IDirectDraw refcount from %u.\n", This, ref -1);
88
89     if(ref == 1) InterlockedIncrement(&This->numIfaces);
90
91     return ref;
92 }
93
94 static ULONG WINAPI
95 IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 iface)
96 {
97     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw2, iface);
98     ULONG ref = InterlockedIncrement(&This->ref2);
99
100     TRACE("(%p) : incrementing IDirectDraw2 refcount from %u.\n", This, ref -1);
101
102     if(ref == 1) InterlockedIncrement(&This->numIfaces);
103
104     return ref;
105 }
106
107 static ULONG WINAPI
108 IDirectDraw3Impl_AddRef(LPDIRECTDRAW3 iface)
109 {
110     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw3, iface);
111     ULONG ref = InterlockedIncrement(&This->ref3);
112
113     TRACE("(%p) : incrementing IDirectDraw3 refcount from %u.\n", This, ref -1);
114
115     if(ref == 1) InterlockedIncrement(&This->numIfaces);
116
117     return ref;
118 }
119
120 static ULONG WINAPI
121 IDirectDraw4Impl_AddRef(LPDIRECTDRAW4 iface)
122 {
123     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw4, iface);
124     ULONG ref = InterlockedIncrement(&This->ref4);
125
126     TRACE("(%p) : incrementing IDirectDraw4 refcount from %u.\n", This, ref -1);
127
128     if(ref == 1) InterlockedIncrement(&This->numIfaces);
129
130     return ref;
131 }
132
133 static ULONG WINAPI
134 IDirectDrawImpl_Release(LPDIRECTDRAW iface)
135 {
136     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw, iface);
137     ULONG ref = InterlockedDecrement(&This->ref1);
138
139     TRACE_(ddraw)("(%p)->() decrementing IDirectDraw refcount from %u.\n", This, ref +1);
140
141     if(ref == 0)
142     {
143         ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
144         if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
145     }
146
147     return ref;
148 }
149
150 static ULONG WINAPI
151 IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface)
152 {
153     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw2, iface);
154     ULONG ref = InterlockedDecrement(&This->ref2);
155
156     TRACE_(ddraw)("(%p)->() decrementing IDirectDraw2 refcount from %u.\n", This, ref +1);
157
158     if(ref == 0)
159     {
160         ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
161         if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
162     }
163
164     return ref;
165 }
166
167 static ULONG WINAPI
168 IDirectDraw3Impl_Release(LPDIRECTDRAW3 iface)
169 {
170     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw3, iface);
171     ULONG ref = InterlockedDecrement(&This->ref3);
172
173     TRACE_(ddraw)("(%p)->() decrementing IDirectDraw3 refcount from %u.\n", This, ref +1);
174
175     if(ref == 0)
176     {
177         ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
178         if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
179     }
180
181     return ref;
182 }
183
184 static ULONG WINAPI
185 IDirectDraw4Impl_Release(LPDIRECTDRAW4 iface)
186 {
187     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw4, iface);
188     ULONG ref = InterlockedDecrement(&This->ref4);
189
190     TRACE_(ddraw)("(%p)->() decrementing IDirectDraw4 refcount from %u.\n", This, ref +1);
191
192     if(ref == 0)
193     {
194         ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
195         if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
196     }
197
198     return ref;
199 }
200
201 static HRESULT WINAPI
202 IDirectDrawImpl_Compact(LPDIRECTDRAW This)
203 {
204     return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl,
205                                                    IDirectDraw, IDirectDraw7,
206                                                    This));
207 }
208
209 static HRESULT WINAPI
210 IDirectDraw2Impl_Compact(LPDIRECTDRAW2 This)
211 {
212     return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl,
213                                                    IDirectDraw2, IDirectDraw7,
214                                                    This));
215 }
216
217     static HRESULT WINAPI
218 IDirectDraw3Impl_Compact(LPDIRECTDRAW3 This)
219 {
220     return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl,
221                                                    IDirectDraw3, IDirectDraw7,
222                                                    This));
223 }
224
225 static HRESULT WINAPI
226 IDirectDraw4Impl_Compact(LPDIRECTDRAW4 This)
227 {
228     return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl,
229                                                    IDirectDraw4, IDirectDraw7,
230                                                    This));
231 }
232
233 static HRESULT WINAPI
234 IDirectDrawImpl_CreateClipper(LPDIRECTDRAW This, DWORD dwFlags,
235                               LPDIRECTDRAWCLIPPER *ppClipper,
236                               IUnknown *pUnkOuter)
237 {
238     return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl,
239                                                          IDirectDraw,
240                                                          IDirectDraw7,
241                                                          This),
242                                       dwFlags, ppClipper, pUnkOuter);
243 }
244
245 static HRESULT WINAPI
246 IDirectDraw2Impl_CreateClipper(LPDIRECTDRAW2 This, DWORD dwFlags,
247                                LPDIRECTDRAWCLIPPER *ppClipper,
248                                IUnknown *pUnkOuter)
249 {
250     return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl,
251                                                          IDirectDraw2,
252                                                          IDirectDraw7,
253                                                          This),
254                                       dwFlags, ppClipper, pUnkOuter);
255 }
256
257 static HRESULT WINAPI
258 IDirectDraw3Impl_CreateClipper(LPDIRECTDRAW3 This, DWORD dwFlags,
259                                LPDIRECTDRAWCLIPPER *ppClipper,
260                                IUnknown *pUnkOuter)
261 {
262     return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl,
263                                                          IDirectDraw3,
264                                                          IDirectDraw7,
265                                                          This),
266                                       dwFlags, ppClipper, pUnkOuter);
267 }
268
269 static HRESULT WINAPI
270 IDirectDraw4Impl_CreateClipper(LPDIRECTDRAW4 This, DWORD dwFlags,
271                                LPDIRECTDRAWCLIPPER *ppClipper,
272                                IUnknown *pUnkOuter)
273 {
274     return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl,
275                                                          IDirectDraw4,
276                                                          IDirectDraw7,
277                                                          This),
278                                       dwFlags, ppClipper, pUnkOuter);
279 }
280
281 static HRESULT WINAPI
282 IDirectDrawImpl_CreatePalette(LPDIRECTDRAW This, DWORD dwFlags,
283                               LPPALETTEENTRY pEntries,
284                               LPDIRECTDRAWPALETTE *ppPalette,
285                               IUnknown *pUnkOuter)
286 {
287     HRESULT hr;
288     hr = IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl,
289                                                          IDirectDraw,
290                                                          IDirectDraw7,
291                                                          This),
292                                       dwFlags, pEntries, ppPalette, pUnkOuter);
293     if(SUCCEEDED(hr) && *ppPalette)
294     {
295         IDirectDrawPaletteImpl *impl = ICOM_OBJECT(IDirectDrawPaletteImpl, IDirectDrawPalette, *ppPalette);
296         IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
297                              IDirectDraw,
298                              IDirectDraw7,
299                              This));
300         impl->ifaceToRelease = NULL;
301
302     }
303     return hr;
304 }
305
306 static HRESULT WINAPI
307 IDirectDraw2Impl_CreatePalette(LPDIRECTDRAW2 This, DWORD dwFlags,
308                                LPPALETTEENTRY pEntries,
309                                LPDIRECTDRAWPALETTE *ppPalette,
310                                IUnknown *pUnkOuter)
311 {
312     HRESULT hr;
313     hr = IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl,
314                                                          IDirectDraw2,
315                                                          IDirectDraw7,
316                                                          This),
317                                       dwFlags, pEntries, ppPalette, pUnkOuter);
318     if(SUCCEEDED(hr) && *ppPalette)
319     {
320         IDirectDrawPaletteImpl *impl = ICOM_OBJECT(IDirectDrawPaletteImpl, IDirectDrawPalette, *ppPalette);
321         IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
322                              IDirectDraw2,
323                              IDirectDraw7,
324                              This));
325         impl->ifaceToRelease = NULL;
326     }
327     return hr;
328 }
329
330 static HRESULT WINAPI
331 IDirectDraw3Impl_CreatePalette(LPDIRECTDRAW3 This, DWORD dwFlags,
332                                LPPALETTEENTRY pEntries,
333                                LPDIRECTDRAWPALETTE *ppPalette,
334                                IUnknown *pUnkOuter)
335 {
336     HRESULT hr;
337     hr = IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl,
338                                                          IDirectDraw3,
339                                                          IDirectDraw7,
340                                                          This),
341                                       dwFlags, pEntries, ppPalette, pUnkOuter);
342     if(SUCCEEDED(hr) && *ppPalette)
343     {
344         IDirectDrawPaletteImpl *impl = ICOM_OBJECT(IDirectDrawPaletteImpl, IDirectDrawPalette, *ppPalette);
345         IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
346                              IDirectDraw3,
347                              IDirectDraw7,
348                              This));
349         IDirectDraw4_AddRef(This);
350         impl->ifaceToRelease = (IUnknown *) This;
351     }
352     return hr;
353 }
354
355 static HRESULT WINAPI
356 IDirectDraw4Impl_CreatePalette(LPDIRECTDRAW4 This, DWORD dwFlags,
357                                LPPALETTEENTRY pEntries,
358                                LPDIRECTDRAWPALETTE *ppPalette,
359                                IUnknown *pUnkOuter)
360 {
361     HRESULT hr;
362     hr = IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl,
363                                                          IDirectDraw4,
364                                                          IDirectDraw7,
365                                                          This),
366                                       dwFlags, pEntries, ppPalette, pUnkOuter);
367     if(SUCCEEDED(hr) && *ppPalette)
368     {
369         IDirectDrawPaletteImpl *impl = ICOM_OBJECT(IDirectDrawPaletteImpl, IDirectDrawPalette, *ppPalette);
370         IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
371                              IDirectDraw4,
372                              IDirectDraw7,
373                              This));
374         IDirectDraw4_AddRef(This);
375         impl->ifaceToRelease = (IUnknown *) This;
376     }
377     return hr;
378 }
379
380 static HRESULT WINAPI
381 IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
382                               LPDIRECTDRAWSURFACE *ppSurface,
383                               IUnknown *pUnkOuter)
384 {
385     LPDIRECTDRAWSURFACE7 pSurface7;
386     IDirectDrawSurfaceImpl *impl;
387     HRESULT hr;
388
389     /* the LPDDSURFACEDESC -> LPDDSURFACEDESC2 conversion should be ok,
390      * since the data layout is the same */
391     hr = IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
392                                                        IDirectDraw,
393                                                        IDirectDraw7,
394                                                        This),
395                                     (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
396
397     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
398      * IDirectDrawSurface vtable layout at the beginning  */
399     *ppSurface = (LPDIRECTDRAWSURFACE) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
400                                     IDirectDrawSurface7, IDirectDrawSurface3,
401                                     pSurface7);
402
403     impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, pSurface7);
404     if(SUCCEEDED(hr) && impl)
405     {
406         impl->version = 1;
407         IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
408                              IDirectDraw,
409                              IDirectDraw7,
410                              This));
411         impl->ifaceToRelease = NULL;
412     }
413
414     return hr;
415 }
416
417 static HRESULT WINAPI
418 IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc,
419                                LPDIRECTDRAWSURFACE *ppSurface,
420                                IUnknown *pUnkOuter)
421 {
422     LPDIRECTDRAWSURFACE7 pSurface7;
423     IDirectDrawSurfaceImpl *impl;
424     HRESULT hr;
425
426     hr = IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
427                                                        IDirectDraw2,
428                                                        IDirectDraw7,
429                                                        This),
430                                     (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
431
432     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
433      * IDirectDrawSurface vtable layout at the beginning  */
434     *ppSurface = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
435                                     IDirectDrawSurface7, IDirectDrawSurface3,
436                                     pSurface7);
437
438     impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, pSurface7);
439     if(SUCCEEDED(hr) && impl)
440     {
441         impl->version = 2;
442         IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
443                              IDirectDraw2,
444                              IDirectDraw7,
445                              This));
446         impl->ifaceToRelease = NULL;
447     }
448
449     return hr;
450 }
451
452 static HRESULT WINAPI
453 IDirectDraw3Impl_CreateSurface(LPDIRECTDRAW3 This, LPDDSURFACEDESC pSDesc,
454                                LPDIRECTDRAWSURFACE *ppSurface,
455                                IUnknown *pUnkOuter)
456 {
457     LPDIRECTDRAWSURFACE7 pSurface7;
458     IDirectDrawSurfaceImpl *impl;
459     HRESULT hr;
460
461     hr = IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
462                                                        IDirectDraw3,
463                                                        IDirectDraw7,
464                                                        This),
465                                     (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
466
467     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
468      * IDirectDrawSurface vtable layout at the beginning  */
469     *ppSurface = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
470                                     IDirectDrawSurface7, IDirectDrawSurface3,
471                                     pSurface7);
472
473     impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, pSurface7);
474     if(SUCCEEDED(hr) && impl)
475     {
476         impl->version = 3;
477         IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
478                              IDirectDraw3,
479                              IDirectDraw7,
480                              This));
481         IDirectDraw3_AddRef(This);
482         impl->ifaceToRelease = (IUnknown *) This;
483     }
484
485     return hr;
486 }
487
488 static HRESULT WINAPI
489 IDirectDraw4Impl_CreateSurface(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pSDesc,
490                                LPDIRECTDRAWSURFACE4 *ppSurface,
491                                IUnknown *pUnkOuter)
492 {
493     HRESULT hr;
494     IDirectDrawSurfaceImpl *impl;
495
496     hr = IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
497                                                        IDirectDraw4,
498                                                        IDirectDraw7,
499                                                         This),
500                                     pSDesc,
501                                     (LPDIRECTDRAWSURFACE7 *)ppSurface,
502                                     pUnkOuter);
503     impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, *ppSurface);
504     if(SUCCEEDED(hr) && impl)
505     {
506         impl->version = 4;
507         IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
508                              IDirectDraw4,
509                              IDirectDraw7,
510                              This));
511         IDirectDraw4_AddRef(This);
512         impl->ifaceToRelease = (IUnknown *) This;
513     }
514     return hr;
515 }
516
517 static HRESULT WINAPI
518 IDirectDrawImpl_DuplicateSurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE pSrc,
519                                  LPDIRECTDRAWSURFACE *ppDst)
520 {
521     LPDIRECTDRAWSURFACE7 pDst7;
522     HRESULT hr;
523
524     hr = IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
525                                                           IDirectDraw,
526                                                           IDirectDraw7, This),
527                                        COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
528                                                           IDirectDrawSurface3,
529                                                           IDirectDrawSurface7,
530                                                           pSrc),
531                                        &pDst7);
532
533     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
534      * IDirectDrawSurface vtable layout at the beginning  */
535     *ppDst = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
536                                 IDirectDrawSurface3, pDst7);
537
538     return hr;
539 }
540
541 static HRESULT WINAPI
542 IDirectDraw2Impl_DuplicateSurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE pSrc,
543                                   LPDIRECTDRAWSURFACE *ppDst)
544 {
545     LPDIRECTDRAWSURFACE7 pDst7;
546     HRESULT hr;
547
548     hr = IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
549                                                           IDirectDraw2,
550                                                           IDirectDraw7, This),
551                                        COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
552                                                           IDirectDrawSurface3,
553                                                           IDirectDrawSurface7,
554                                                           pSrc),
555                                        &pDst7);
556
557     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
558      * IDirectDrawSurface vtable layout at the beginning  */
559     *ppDst = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
560                                 IDirectDrawSurface3, pDst7);
561
562     return hr;
563 }
564
565 static HRESULT WINAPI
566 IDirectDraw3Impl_DuplicateSurface(LPDIRECTDRAW3 This, LPDIRECTDRAWSURFACE pSrc,
567                                   LPDIRECTDRAWSURFACE *ppDst)
568 {
569     LPDIRECTDRAWSURFACE7 pDst7;
570     HRESULT hr;
571
572     hr = IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
573                                                           IDirectDraw3,
574                                                           IDirectDraw7, This),
575                                        COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
576                                                           IDirectDrawSurface3,
577                                                           IDirectDrawSurface7,
578                                                           pSrc),
579                                        &pDst7);
580
581     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
582      * IDirectDrawSurface vtable layout at the beginning  */
583     *ppDst = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
584                                 IDirectDrawSurface3, pDst7);
585
586     return hr;
587 }
588
589 static HRESULT WINAPI
590 IDirectDraw4Impl_DuplicateSurface(LPDIRECTDRAW4 This,
591                                   LPDIRECTDRAWSURFACE4 pSrc,
592                                   LPDIRECTDRAWSURFACE4 *ppDst)
593 {
594     return IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
595                                                             IDirectDraw4,
596                                                             IDirectDraw7,
597                                                             This),
598                                          (LPDIRECTDRAWSURFACE7)pSrc,
599                                          (LPDIRECTDRAWSURFACE7 *)ppDst);
600 }
601
602 struct displaymodescallback_context
603 {
604     LPDDENUMMODESCALLBACK func;
605     LPVOID context;
606 };
607
608 static HRESULT CALLBACK
609 EnumDisplayModesCallbackThunk(LPDDSURFACEDESC2 pDDSD2, LPVOID context)
610 {
611     DDSURFACEDESC DDSD;
612     struct displaymodescallback_context *cbcontext = context;
613
614     memcpy(&DDSD,pDDSD2,sizeof(DDSD));
615     DDSD.dwSize = sizeof(DDSD);
616
617     return cbcontext->func(&DDSD, cbcontext->context);
618 }
619
620 static HRESULT WINAPI
621 IDirectDrawImpl_EnumDisplayModes(LPDIRECTDRAW This, DWORD dwFlags,
622                                  LPDDSURFACEDESC pDDSD, LPVOID context,
623                                  LPDDENUMMODESCALLBACK cb)
624 {
625     struct displaymodescallback_context cbcontext;
626
627     cbcontext.func    = cb;
628     cbcontext.context = context;
629
630     return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl,
631                                                             IDirectDraw,
632                                                             IDirectDraw7,
633                                                             This),
634                                          dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext,
635                                          EnumDisplayModesCallbackThunk);
636 }
637
638 static HRESULT WINAPI
639 IDirectDraw2Impl_EnumDisplayModes(LPDIRECTDRAW2 This, DWORD dwFlags,
640                                   LPDDSURFACEDESC pDDSD, LPVOID context,
641                                   LPDDENUMMODESCALLBACK cb)
642 {
643     struct displaymodescallback_context cbcontext;
644
645     cbcontext.func    = cb;
646     cbcontext.context = context;
647
648     return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl,
649                                                             IDirectDraw2,
650                                                             IDirectDraw7,
651                                                             This),
652                                          dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext,
653                                          EnumDisplayModesCallbackThunk);
654 }
655
656 static HRESULT WINAPI
657 IDirectDraw3Impl_EnumDisplayModes(LPDIRECTDRAW3 This, DWORD dwFlags,
658                                   LPDDSURFACEDESC pDDSD, LPVOID context,
659                                   LPDDENUMMODESCALLBACK cb)
660 {
661     struct displaymodescallback_context cbcontext;
662
663     cbcontext.func    = cb;
664     cbcontext.context = context;
665
666     return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl,
667                                                             IDirectDraw3,
668                                                             IDirectDraw7,
669                                                             This),
670                                          dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext,
671                                          EnumDisplayModesCallbackThunk);
672 }
673
674 static HRESULT WINAPI
675 IDirectDraw4Impl_EnumDisplayModes(LPDIRECTDRAW4 This, DWORD dwFlags,
676                                   LPDDSURFACEDESC2 pDDSD, LPVOID context,
677                                   LPDDENUMMODESCALLBACK2 cb)
678 {
679     return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl,
680                                                             IDirectDraw4,
681                                                             IDirectDraw7,
682                                                             This),
683                                          dwFlags, pDDSD, context, cb);
684 }
685
686 struct surfacescallback_context
687 {
688     LPDDENUMSURFACESCALLBACK func;
689     LPVOID context;
690 };
691
692 static HRESULT CALLBACK
693 EnumSurfacesCallbackThunk(LPDIRECTDRAWSURFACE7 pSurf, LPDDSURFACEDESC2 pDDSD,
694                           LPVOID context)
695 {
696     struct surfacescallback_context *cbcontext = context;
697
698     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
699      * IDirectDrawSurface vtable layout at the beginning  */
700     return cbcontext->func((LPDIRECTDRAWSURFACE)
701                            COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
702                                               IDirectDrawSurface7,
703                                               IDirectDrawSurface3, pSurf),
704                            (LPDDSURFACEDESC)pDDSD, cbcontext->context);
705 }
706
707 static HRESULT WINAPI
708 IDirectDrawImpl_EnumSurfaces(LPDIRECTDRAW This, DWORD dwFlags,
709                              LPDDSURFACEDESC pDDSD, LPVOID context,
710                              LPDDENUMSURFACESCALLBACK cb)
711 {
712     struct surfacescallback_context cbcontext;
713
714     cbcontext.func    = cb;
715     cbcontext.context = context;
716
717     return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
718                                                         IDirectDraw,
719                                                         IDirectDraw7, This),
720                                      dwFlags, (LPDDSURFACEDESC2)pDDSD,
721                                      &cbcontext, EnumSurfacesCallbackThunk);
722 }
723
724 static HRESULT WINAPI
725 IDirectDraw2Impl_EnumSurfaces(LPDIRECTDRAW2 This, DWORD dwFlags,
726                               LPDDSURFACEDESC pDDSD, LPVOID context,
727                               LPDDENUMSURFACESCALLBACK cb)
728 {
729     struct surfacescallback_context cbcontext;
730
731     cbcontext.func    = cb;
732     cbcontext.context = context;
733
734     return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
735                                                         IDirectDraw2,
736                                                         IDirectDraw7, This),
737                                      dwFlags, (LPDDSURFACEDESC2)pDDSD,
738                                      &cbcontext, EnumSurfacesCallbackThunk);
739 }
740
741 static HRESULT WINAPI
742 IDirectDraw3Impl_EnumSurfaces(LPDIRECTDRAW3 This, DWORD dwFlags,
743                               LPDDSURFACEDESC pDDSD, LPVOID context,
744                               LPDDENUMSURFACESCALLBACK cb)
745 {
746     struct surfacescallback_context cbcontext;
747
748     cbcontext.func    = cb;
749     cbcontext.context = context;
750
751     return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
752                                                         IDirectDraw3,
753                                                         IDirectDraw7, This),
754                                      dwFlags, (LPDDSURFACEDESC2)pDDSD,
755                                      &cbcontext, EnumSurfacesCallbackThunk);
756 }
757
758 static HRESULT WINAPI
759 IDirectDraw4Impl_EnumSurfaces(LPDIRECTDRAW4 This, DWORD dwFlags,
760                               LPDDSURFACEDESC2 pDDSD, LPVOID context,
761                               LPDDENUMSURFACESCALLBACK2 cb)
762 {
763     return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
764                                                         IDirectDraw4,
765                                                         IDirectDraw7, This),
766                                      dwFlags, pDDSD, context,
767                                      (LPDDENUMSURFACESCALLBACK7)cb);
768 }
769
770 static HRESULT WINAPI
771 IDirectDrawImpl_FlipToGDISurface(LPDIRECTDRAW This)
772 {
773     return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
774                                                             IDirectDraw,
775                                                             IDirectDraw7,
776                                                             This));
777 }
778
779 static HRESULT WINAPI
780 IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 This)
781 {
782     return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
783                                                             IDirectDraw2,
784                                                             IDirectDraw7,
785                                                             This));
786 }
787
788 static HRESULT WINAPI
789 IDirectDraw3Impl_FlipToGDISurface(LPDIRECTDRAW3 This)
790 {
791     return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
792                                                             IDirectDraw3,
793                                                             IDirectDraw7,
794                                                             This));
795 }
796
797 static HRESULT WINAPI
798 IDirectDraw4Impl_FlipToGDISurface(LPDIRECTDRAW4 This)
799 {
800     return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
801                                                             IDirectDraw4,
802                                                             IDirectDraw7,
803                                                             This));
804 }
805
806 static HRESULT WINAPI
807 IDirectDrawImpl_GetCaps(LPDIRECTDRAW This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
808 {
809     return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl,
810                                                    IDirectDraw, IDirectDraw7,
811                                                    This), pDDC1, pDDC2);
812 }
813
814 static HRESULT WINAPI
815 IDirectDraw2Impl_GetCaps(LPDIRECTDRAW2 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
816 {
817     return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl,
818                                                    IDirectDraw2, IDirectDraw7,
819                                                    This), pDDC1, pDDC2);
820 }
821
822 static HRESULT WINAPI
823 IDirectDraw3Impl_GetCaps(LPDIRECTDRAW3 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
824 {
825     return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl,
826                                                    IDirectDraw3, IDirectDraw7,
827                                                    This), pDDC1, pDDC2);
828 }
829
830 static HRESULT WINAPI
831 IDirectDraw4Impl_GetCaps(LPDIRECTDRAW4 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
832 {
833     return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl,
834                                                    IDirectDraw4, IDirectDraw7,
835                                                    This), pDDC1, pDDC2);
836 }
837
838 static HRESULT WINAPI
839 IDirectDrawImpl_GetDisplayMode(LPDIRECTDRAW This, LPDDSURFACEDESC pDDSD)
840 {
841     return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
842                                                           IDirectDraw,
843                                                           IDirectDraw7, This),
844                                        (LPDDSURFACEDESC2)pDDSD);
845 }
846
847 static HRESULT WINAPI
848 IDirectDraw2Impl_GetDisplayMode(LPDIRECTDRAW2 This, LPDDSURFACEDESC pDDSD)
849 {
850     return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
851                                                           IDirectDraw2,
852                                                           IDirectDraw7, This),
853                                        (LPDDSURFACEDESC2)pDDSD);
854 }
855
856 static HRESULT WINAPI
857 IDirectDraw3Impl_GetDisplayMode(LPDIRECTDRAW3 This, LPDDSURFACEDESC pDDSD)
858 {
859     return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
860                                                           IDirectDraw3,
861                                                           IDirectDraw7, This),
862                                        (LPDDSURFACEDESC2)pDDSD);
863 }
864
865 static HRESULT WINAPI
866 IDirectDraw4Impl_GetDisplayMode(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pDDSD)
867 {
868     return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
869                                                           IDirectDraw4,
870                                                           IDirectDraw7, This),
871                                        pDDSD);
872 }
873
874 static HRESULT WINAPI
875 IDirectDrawImpl_GetFourCCCodes(LPDIRECTDRAW This, LPDWORD lpNumCodes,
876                                LPDWORD lpCodes)
877 {
878     return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl,
879                                                           IDirectDraw,
880                                                           IDirectDraw7,
881                                                           This),
882                                        lpNumCodes, lpCodes);
883 }
884
885 static HRESULT WINAPI
886 IDirectDraw2Impl_GetFourCCCodes(LPDIRECTDRAW2 This, LPDWORD lpNumCodes,
887                                 LPDWORD lpCodes)
888 {
889     return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl,
890                                                           IDirectDraw2,
891                                                           IDirectDraw7,
892                                                           This),
893                                        lpNumCodes, lpCodes);
894 }
895
896 static HRESULT WINAPI
897 IDirectDraw3Impl_GetFourCCCodes(LPDIRECTDRAW3 This, LPDWORD lpNumCodes,
898                                 LPDWORD lpCodes)
899 {
900     return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl,
901                                                           IDirectDraw3,
902                                                           IDirectDraw7,
903                                                           This),
904                                        lpNumCodes, lpCodes);
905 }
906
907 static HRESULT WINAPI
908 IDirectDraw4Impl_GetFourCCCodes(LPDIRECTDRAW4 This, LPDWORD lpNumCodes,
909                                 LPDWORD lpCodes)
910 {
911     return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl,
912                                                           IDirectDraw4,
913                                                           IDirectDraw7,
914                                                           This),
915                                        lpNumCodes, lpCodes);
916 }
917
918 static HRESULT WINAPI
919 IDirectDrawImpl_GetGDISurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE *ppSurf)
920 {
921     LPDIRECTDRAWSURFACE7 pSurf7;
922     HRESULT hr;
923
924     hr = IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
925                                                        IDirectDraw,
926                                                        IDirectDraw7,
927                                                        This), &pSurf7);
928
929     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
930      * IDirectDrawSurface vtable layout at the beginning  */
931     *ppSurf = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
932                                  IDirectDrawSurface3, pSurf7);
933
934     return hr;
935 }
936
937 static HRESULT WINAPI
938 IDirectDraw2Impl_GetGDISurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE *ppSurf)
939 {
940     LPDIRECTDRAWSURFACE7 pSurf7;
941     HRESULT hr;
942
943     hr = IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
944                                                        IDirectDraw2,
945                                                        IDirectDraw7,
946                                                        This), &pSurf7);
947
948     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
949      * IDirectDrawSurface vtable layout at the beginning  */
950     *ppSurf = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
951                                  IDirectDrawSurface3, pSurf7);
952
953     return hr;
954 }
955
956 static HRESULT WINAPI
957 IDirectDraw3Impl_GetGDISurface(LPDIRECTDRAW3 This, LPDIRECTDRAWSURFACE *ppSurf)
958 {
959     LPDIRECTDRAWSURFACE7 pSurf7;
960     HRESULT hr;
961
962     hr = IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
963                                                        IDirectDraw3,
964                                                        IDirectDraw7,
965                                                        This), &pSurf7);
966
967     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
968      * IDirectDrawSurface vtable layout at the beginning  */
969     *ppSurf = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
970                                  IDirectDrawSurface3, pSurf7);
971
972     return hr;
973 }
974
975 static HRESULT WINAPI
976 IDirectDraw4Impl_GetGDISurface(LPDIRECTDRAW4 This,
977                                LPDIRECTDRAWSURFACE4 *ppSurf)
978 {
979     return IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
980                                                          IDirectDraw4,
981                                                          IDirectDraw7,
982                                                          This),
983                                       (LPDIRECTDRAWSURFACE7 *)ppSurf);
984 }
985
986 static HRESULT WINAPI
987 IDirectDrawImpl_GetMonitorFrequency(LPDIRECTDRAW This, LPDWORD pdwFreq)
988 {
989     return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl,
990                                                                IDirectDraw,
991                                                                IDirectDraw7,
992                                                                This),
993                                             pdwFreq);
994 }
995
996 static HRESULT WINAPI
997 IDirectDraw2Impl_GetMonitorFrequency(LPDIRECTDRAW2 This, LPDWORD pdwFreq)
998 {
999     return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl,
1000                                                                IDirectDraw2,
1001                                                                IDirectDraw7,
1002                                                                This),
1003                                             pdwFreq);
1004 }
1005
1006 static HRESULT WINAPI
1007 IDirectDraw3Impl_GetMonitorFrequency(LPDIRECTDRAW3 This, LPDWORD pdwFreq)
1008 {
1009     return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl,
1010                                                                IDirectDraw3,
1011                                                                IDirectDraw7,
1012                                                                This),
1013                                             pdwFreq);
1014 }
1015
1016 static HRESULT WINAPI
1017 IDirectDraw4Impl_GetMonitorFrequency(LPDIRECTDRAW4 This, LPDWORD pdwFreq)
1018 {
1019     return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl,
1020                                                                IDirectDraw4,
1021                                                                IDirectDraw7,
1022                                                                This),
1023                                             pdwFreq);
1024 }
1025
1026 static HRESULT WINAPI
1027 IDirectDrawImpl_GetScanLine(LPDIRECTDRAW This, LPDWORD pdwLine)
1028 {
1029     return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl,
1030                                                        IDirectDraw,
1031                                                        IDirectDraw7,
1032                                                        This), pdwLine);
1033 }
1034
1035 static HRESULT WINAPI
1036 IDirectDraw2Impl_GetScanLine(LPDIRECTDRAW2 This, LPDWORD pdwLine)
1037 {
1038     return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl,
1039                                                        IDirectDraw2,
1040                                                        IDirectDraw7,
1041                                                        This), pdwLine);
1042 }
1043
1044 static HRESULT WINAPI
1045 IDirectDraw3Impl_GetScanLine(LPDIRECTDRAW3 This, LPDWORD pdwLine)
1046 {
1047     return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl,
1048                                                        IDirectDraw3,
1049                                                        IDirectDraw7,
1050                                                        This), pdwLine);
1051 }
1052
1053 static HRESULT WINAPI
1054 IDirectDraw4Impl_GetScanLine(LPDIRECTDRAW4 This, LPDWORD pdwLine)
1055 {
1056     return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl,
1057                                                        IDirectDraw4,
1058                                                        IDirectDraw7,
1059                                                        This), pdwLine);
1060 }
1061
1062 static HRESULT WINAPI
1063 IDirectDrawImpl_GetVerticalBlankStatus(LPDIRECTDRAW This, LPBOOL lpbIsInVB)
1064 {
1065     return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl,
1066                                                                   IDirectDraw,
1067                                                                   IDirectDraw7,
1068                                                                   This),
1069                                                lpbIsInVB);
1070 }
1071
1072 static HRESULT WINAPI
1073 IDirectDraw2Impl_GetVerticalBlankStatus(LPDIRECTDRAW2 This, LPBOOL lpbIsInVB)
1074 {
1075     return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl,
1076                                                                   IDirectDraw2,
1077                                                                   IDirectDraw7,
1078                                                                   This),
1079                                                lpbIsInVB);
1080 }
1081
1082 static HRESULT WINAPI
1083 IDirectDraw3Impl_GetVerticalBlankStatus(LPDIRECTDRAW3 This, LPBOOL lpbIsInVB)
1084 {
1085     return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl,
1086                                                                   IDirectDraw3,
1087                                                                   IDirectDraw7,
1088                                                                   This),
1089                                                lpbIsInVB);
1090 }
1091
1092 static HRESULT WINAPI
1093 IDirectDraw4Impl_GetVerticalBlankStatus(LPDIRECTDRAW4 This, LPBOOL lpbIsInVB)
1094 {
1095     return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl,
1096                                                                   IDirectDraw4,
1097                                                                   IDirectDraw7,
1098                                                                   This),
1099                                                lpbIsInVB);
1100 }
1101
1102 static HRESULT WINAPI
1103 IDirectDrawImpl_Initialize(LPDIRECTDRAW iface, LPGUID pGUID)
1104 {
1105     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw, iface);
1106     HRESULT ret_value;
1107
1108     ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID);
1109
1110     return ret_value;
1111 }
1112
1113 static HRESULT WINAPI
1114 IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, LPGUID pGUID)
1115 {
1116     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw2, iface);
1117     HRESULT ret_value;
1118
1119     ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID);
1120
1121     return ret_value;
1122 }
1123
1124 static HRESULT WINAPI
1125 IDirectDraw3Impl_Initialize(LPDIRECTDRAW3 iface, LPGUID pGUID)
1126 {
1127     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw3, iface);
1128     HRESULT ret_value;
1129
1130     ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID);
1131
1132     return ret_value;
1133 }
1134
1135 static HRESULT WINAPI
1136 IDirectDraw4Impl_Initialize(LPDIRECTDRAW4 iface, LPGUID pGUID)
1137 {
1138     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw4, iface);
1139     HRESULT ret_value;
1140
1141     ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID);
1142
1143     return ret_value;
1144 }
1145
1146
1147 static HRESULT WINAPI
1148 IDirectDrawImpl_RestoreDisplayMode(LPDIRECTDRAW This)
1149 {
1150     return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
1151                                                               IDirectDraw,
1152                                                               IDirectDraw7,
1153                                                               This));
1154 }
1155
1156 static HRESULT WINAPI
1157 IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 This)
1158 {
1159     return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
1160                                                               IDirectDraw2,
1161                                                               IDirectDraw7,
1162                                                               This));
1163 }
1164
1165 static HRESULT WINAPI
1166 IDirectDraw3Impl_RestoreDisplayMode(LPDIRECTDRAW3 This)
1167 {
1168     return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
1169                                                               IDirectDraw3,
1170                                                               IDirectDraw7,
1171                                                               This));
1172 }
1173
1174 static HRESULT WINAPI
1175 IDirectDraw4Impl_RestoreDisplayMode(LPDIRECTDRAW4 This)
1176 {
1177     return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
1178                                                               IDirectDraw4,
1179                                                               IDirectDraw7,
1180                                                               This));
1181 }
1182
1183 static HRESULT WINAPI
1184 IDirectDrawImpl_SetCooperativeLevel(LPDIRECTDRAW This, HWND hWnd,
1185                                     DWORD dwFlags)
1186 {
1187     return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
1188                                                                IDirectDraw,
1189                                                                IDirectDraw7,
1190                                                                This),
1191                                             hWnd, dwFlags);
1192 }
1193
1194 static HRESULT WINAPI
1195 IDirectDraw2Impl_SetCooperativeLevel(LPDIRECTDRAW2 This, HWND hWnd,
1196                                      DWORD dwFlags)
1197 {
1198     return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
1199                                                                IDirectDraw2,
1200                                                                IDirectDraw7,
1201                                                                This),
1202                                             hWnd, dwFlags);
1203 }
1204
1205 static HRESULT WINAPI
1206 IDirectDraw3Impl_SetCooperativeLevel(LPDIRECTDRAW3 This, HWND hWnd,
1207                                      DWORD dwFlags)
1208 {
1209     return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
1210                                                                IDirectDraw3,
1211                                                                IDirectDraw7,
1212                                                                This),
1213                                             hWnd, dwFlags);
1214 }
1215
1216 static HRESULT WINAPI
1217 IDirectDraw4Impl_SetCooperativeLevel(LPDIRECTDRAW4 This, HWND hWnd,
1218                                      DWORD dwFlags)
1219 {
1220     return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
1221                                                                IDirectDraw4,
1222                                                                IDirectDraw7,
1223                                                                This),
1224                                             hWnd, dwFlags);
1225 }
1226
1227 static HRESULT WINAPI
1228 IDirectDrawImpl_SetDisplayMode(LPDIRECTDRAW This, DWORD a, DWORD b, DWORD c)
1229 {
1230     return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
1231                                                           IDirectDraw,
1232                                                           IDirectDraw7,
1233                                                           This),
1234                                        a, b, c, 0, 0);
1235 }
1236
1237 static HRESULT WINAPI
1238 IDirectDraw2Impl_SetDisplayMode(LPDIRECTDRAW2 This, DWORD a, DWORD b, DWORD c,
1239                                 DWORD d, DWORD e)
1240 {
1241     return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
1242                                                           IDirectDraw2,
1243                                                           IDirectDraw7,
1244                                                           This),
1245                                        a, b, c, d, e);
1246 }
1247
1248 static HRESULT WINAPI
1249 IDirectDraw3Impl_SetDisplayMode(LPDIRECTDRAW3 This, DWORD a, DWORD b, DWORD c,
1250                                 DWORD d, DWORD e)
1251 {
1252     return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
1253                                                           IDirectDraw3,
1254                                                           IDirectDraw7,
1255                                                           This),
1256                                        a, b, c, d, e);
1257 }
1258
1259 static HRESULT WINAPI
1260 IDirectDraw4Impl_SetDisplayMode(LPDIRECTDRAW4 This, DWORD a, DWORD b, DWORD c,
1261                                 DWORD d, DWORD e)
1262 {
1263     return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
1264                                                           IDirectDraw4,
1265                                                           IDirectDraw7,
1266                                                           This),
1267                                        a, b, c, d, e);
1268 }
1269
1270 static HRESULT WINAPI
1271 IDirectDrawImpl_WaitForVerticalBlank(LPDIRECTDRAW This, DWORD dwFlags,
1272                                      HANDLE hEvent)
1273 {
1274     return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl,
1275                                                                 IDirectDraw,
1276                                                                 IDirectDraw7,
1277                                                                 This),
1278                                              dwFlags, hEvent);
1279 }
1280
1281 static HRESULT WINAPI
1282 IDirectDraw2Impl_WaitForVerticalBlank(LPDIRECTDRAW2 This, DWORD dwFlags,
1283                                       HANDLE hEvent)
1284 {
1285     return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl,
1286                                                                 IDirectDraw2,
1287                                                                 IDirectDraw7,
1288                                                                 This),
1289                                              dwFlags, hEvent);
1290 }
1291
1292 static HRESULT WINAPI
1293 IDirectDraw3Impl_WaitForVerticalBlank(LPDIRECTDRAW3 This, DWORD dwFlags,
1294                                       HANDLE hEvent)
1295 {
1296     return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl,
1297                                                                 IDirectDraw3,
1298                                                                 IDirectDraw7,
1299                                                                 This),
1300                                              dwFlags, hEvent);
1301 }
1302
1303 static HRESULT WINAPI
1304 IDirectDraw4Impl_WaitForVerticalBlank(LPDIRECTDRAW4 This, DWORD dwFlags,
1305                                       HANDLE hEvent)
1306 {
1307     return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl,
1308                                                                 IDirectDraw4,
1309                                                                 IDirectDraw7,
1310                                                                 This),
1311                                              dwFlags, hEvent);
1312 }
1313
1314 static HRESULT WINAPI
1315 IDirectDraw2Impl_GetAvailableVidMem(LPDIRECTDRAW2 This, LPDDSCAPS pCaps,
1316                                     LPDWORD pdwTotal, LPDWORD pdwFree)
1317 {
1318     DDSCAPS2 Caps2;
1319     DDRAW_Convert_DDSCAPS_1_To_2(pCaps, &Caps2);
1320
1321     return IDirectDraw7_GetAvailableVidMem(COM_INTERFACE_CAST(IDirectDrawImpl,
1322                                                               IDirectDraw2,
1323                                                               IDirectDraw7,
1324                                                               This),
1325                                            &Caps2, pdwTotal, pdwFree);
1326 }
1327
1328 static HRESULT WINAPI
1329 IDirectDraw3Impl_GetAvailableVidMem(LPDIRECTDRAW3 This, LPDDSCAPS pCaps,
1330                                     LPDWORD pdwTotal, LPDWORD pdwFree)
1331 {
1332     DDSCAPS2 Caps2;
1333     DDRAW_Convert_DDSCAPS_1_To_2(pCaps, &Caps2);
1334
1335     return IDirectDraw7_GetAvailableVidMem(COM_INTERFACE_CAST(IDirectDrawImpl,
1336                                                               IDirectDraw3,
1337                                                               IDirectDraw7,
1338                                                               This),
1339                                            &Caps2, pdwTotal, pdwFree);
1340 }
1341
1342 static HRESULT WINAPI
1343 IDirectDraw4Impl_GetAvailableVidMem(LPDIRECTDRAW4 This, LPDDSCAPS2 pCaps,
1344                                     LPDWORD pdwTotal, LPDWORD pdwFree)
1345 {
1346     return IDirectDraw7_GetAvailableVidMem(COM_INTERFACE_CAST(IDirectDrawImpl,
1347                                                               IDirectDraw4,
1348                                                               IDirectDraw7,
1349                                                               This),
1350                                            pCaps, pdwTotal, pdwFree);
1351 }
1352
1353 static HRESULT WINAPI
1354 IDirectDraw3Impl_GetSurfaceFromDC(LPDIRECTDRAW3 This, HDC hDC,
1355                                   LPDIRECTDRAWSURFACE *pSurf)
1356 {
1357     return IDirectDraw7_GetSurfaceFromDC(COM_INTERFACE_CAST(IDirectDrawImpl,
1358                                                             IDirectDraw3,
1359                                                             IDirectDraw7,
1360                                                             This),
1361                                          hDC, (LPDIRECTDRAWSURFACE7 *)pSurf);
1362 }
1363
1364 static HRESULT WINAPI
1365 IDirectDraw4Impl_GetSurfaceFromDC(LPDIRECTDRAW4 This, HDC hDC,
1366                                   LPDIRECTDRAWSURFACE4 *pSurf)
1367 {
1368     return IDirectDraw7_GetSurfaceFromDC(COM_INTERFACE_CAST(IDirectDrawImpl,
1369                                                             IDirectDraw4,
1370                                                             IDirectDraw7,
1371                                                             This),
1372                                          hDC, (LPDIRECTDRAWSURFACE7 *)pSurf);
1373 }
1374
1375 static HRESULT WINAPI
1376 IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 This)
1377 {
1378     return IDirectDraw7_RestoreAllSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
1379                                                               IDirectDraw4,
1380                                                               IDirectDraw7,
1381                                                               This));
1382 }
1383
1384 static HRESULT WINAPI
1385 IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 This)
1386 {
1387     return IDirectDraw7_TestCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
1388                                                                 IDirectDraw4,
1389                                                                 IDirectDraw7,
1390                                                                 This));
1391 }
1392
1393 static HRESULT WINAPI
1394 IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 This,
1395                                      LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags)
1396 {
1397     DDDEVICEIDENTIFIER2 DDDI2;
1398     HRESULT hr;
1399
1400     hr = IDirectDraw7_GetDeviceIdentifier(COM_INTERFACE_CAST(IDirectDrawImpl,
1401                                                              IDirectDraw4,
1402                                                              IDirectDraw7,
1403                                                              This),
1404                                           &DDDI2, dwFlags);
1405
1406     DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(&DDDI2, pDDDI);
1407
1408     return hr;
1409 }
1410
1411 const IDirectDrawVtbl IDirectDraw1_Vtbl =
1412 {
1413     IDirectDrawImpl_QueryInterface,
1414     IDirectDrawImpl_AddRef,
1415     IDirectDrawImpl_Release,
1416     IDirectDrawImpl_Compact,
1417     IDirectDrawImpl_CreateClipper,
1418     IDirectDrawImpl_CreatePalette,
1419     IDirectDrawImpl_CreateSurface,
1420     IDirectDrawImpl_DuplicateSurface,
1421     IDirectDrawImpl_EnumDisplayModes,
1422     IDirectDrawImpl_EnumSurfaces,
1423     IDirectDrawImpl_FlipToGDISurface,
1424     IDirectDrawImpl_GetCaps,
1425     IDirectDrawImpl_GetDisplayMode,
1426     IDirectDrawImpl_GetFourCCCodes,
1427     IDirectDrawImpl_GetGDISurface,
1428     IDirectDrawImpl_GetMonitorFrequency,
1429     IDirectDrawImpl_GetScanLine,
1430     IDirectDrawImpl_GetVerticalBlankStatus,
1431     IDirectDrawImpl_Initialize,
1432     IDirectDrawImpl_RestoreDisplayMode,
1433     IDirectDrawImpl_SetCooperativeLevel,
1434     IDirectDrawImpl_SetDisplayMode,
1435     IDirectDrawImpl_WaitForVerticalBlank,
1436 };
1437
1438 const IDirectDraw2Vtbl IDirectDraw2_Vtbl =
1439 {
1440     IDirectDraw2Impl_QueryInterface,
1441     IDirectDraw2Impl_AddRef,
1442     IDirectDraw2Impl_Release,
1443     IDirectDraw2Impl_Compact,
1444     IDirectDraw2Impl_CreateClipper,
1445     IDirectDraw2Impl_CreatePalette,
1446     IDirectDraw2Impl_CreateSurface,
1447     IDirectDraw2Impl_DuplicateSurface,
1448     IDirectDraw2Impl_EnumDisplayModes,
1449     IDirectDraw2Impl_EnumSurfaces,
1450     IDirectDraw2Impl_FlipToGDISurface,
1451     IDirectDraw2Impl_GetCaps,
1452     IDirectDraw2Impl_GetDisplayMode,
1453     IDirectDraw2Impl_GetFourCCCodes,
1454     IDirectDraw2Impl_GetGDISurface,
1455     IDirectDraw2Impl_GetMonitorFrequency,
1456     IDirectDraw2Impl_GetScanLine,
1457     IDirectDraw2Impl_GetVerticalBlankStatus,
1458     IDirectDraw2Impl_Initialize,
1459     IDirectDraw2Impl_RestoreDisplayMode,
1460     IDirectDraw2Impl_SetCooperativeLevel,
1461     IDirectDraw2Impl_SetDisplayMode,
1462     IDirectDraw2Impl_WaitForVerticalBlank,
1463     IDirectDraw2Impl_GetAvailableVidMem
1464 };
1465
1466 const IDirectDraw3Vtbl IDirectDraw3_Vtbl =
1467 {
1468     IDirectDraw3Impl_QueryInterface,
1469     IDirectDraw3Impl_AddRef,
1470     IDirectDraw3Impl_Release,
1471     IDirectDraw3Impl_Compact,
1472     IDirectDraw3Impl_CreateClipper,
1473     IDirectDraw3Impl_CreatePalette,
1474     IDirectDraw3Impl_CreateSurface,
1475     IDirectDraw3Impl_DuplicateSurface,
1476     IDirectDraw3Impl_EnumDisplayModes,
1477     IDirectDraw3Impl_EnumSurfaces,
1478     IDirectDraw3Impl_FlipToGDISurface,
1479     IDirectDraw3Impl_GetCaps,
1480     IDirectDraw3Impl_GetDisplayMode,
1481     IDirectDraw3Impl_GetFourCCCodes,
1482     IDirectDraw3Impl_GetGDISurface,
1483     IDirectDraw3Impl_GetMonitorFrequency,
1484     IDirectDraw3Impl_GetScanLine,
1485     IDirectDraw3Impl_GetVerticalBlankStatus,
1486     IDirectDraw3Impl_Initialize,
1487     IDirectDraw3Impl_RestoreDisplayMode,
1488     IDirectDraw3Impl_SetCooperativeLevel,
1489     IDirectDraw3Impl_SetDisplayMode,
1490     IDirectDraw3Impl_WaitForVerticalBlank,
1491     IDirectDraw3Impl_GetAvailableVidMem,
1492     IDirectDraw3Impl_GetSurfaceFromDC,
1493 };
1494
1495 const IDirectDraw4Vtbl IDirectDraw4_Vtbl =
1496 {
1497     IDirectDraw4Impl_QueryInterface,
1498     IDirectDraw4Impl_AddRef,
1499     IDirectDraw4Impl_Release,
1500     IDirectDraw4Impl_Compact,
1501     IDirectDraw4Impl_CreateClipper,
1502     IDirectDraw4Impl_CreatePalette,
1503     IDirectDraw4Impl_CreateSurface,
1504     IDirectDraw4Impl_DuplicateSurface,
1505     IDirectDraw4Impl_EnumDisplayModes,
1506     IDirectDraw4Impl_EnumSurfaces,
1507     IDirectDraw4Impl_FlipToGDISurface,
1508     IDirectDraw4Impl_GetCaps,
1509     IDirectDraw4Impl_GetDisplayMode,
1510     IDirectDraw4Impl_GetFourCCCodes,
1511     IDirectDraw4Impl_GetGDISurface,
1512     IDirectDraw4Impl_GetMonitorFrequency,
1513     IDirectDraw4Impl_GetScanLine,
1514     IDirectDraw4Impl_GetVerticalBlankStatus,
1515     IDirectDraw4Impl_Initialize,
1516     IDirectDraw4Impl_RestoreDisplayMode,
1517     IDirectDraw4Impl_SetCooperativeLevel,
1518     IDirectDraw4Impl_SetDisplayMode,
1519     IDirectDraw4Impl_WaitForVerticalBlank,
1520     IDirectDraw4Impl_GetAvailableVidMem,
1521     IDirectDraw4Impl_GetSurfaceFromDC,
1522     IDirectDraw4Impl_RestoreAllSurfaces,
1523     IDirectDraw4Impl_TestCooperativeLevel,
1524     IDirectDraw4Impl_GetDeviceIdentifier
1525 };