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