move more dlls
[reactos.git] / reactos / dll / ddraw / thunks / ddraw_thunk.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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18
19 /*
20 * Taken form wine (wine/dlls/ddraw/ddraw_thunks.c rev 1.2)
21 * with some little changes
22 *
23 */
24
25 #include "winedraw.h"
26
27
28 static HRESULT WINAPI
29 IDirectDrawImpl_QueryInterface(LPDIRECTDRAW This, REFIID iid, LPVOID *ppObj)
30 {
31 return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl,
32 IDirectDraw,
33 IDirectDraw7, This),
34 iid, ppObj);
35 }
36
37 static HRESULT WINAPI
38 IDirectDraw2Impl_QueryInterface(LPDIRECTDRAW2 This, REFIID iid, LPVOID *ppObj)
39 {
40 return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl,
41 IDirectDraw2,
42 IDirectDraw7, This),
43 iid, ppObj);
44 }
45
46
47 static HRESULT WINAPI
48 IDirectDraw4Impl_QueryInterface(LPDIRECTDRAW4 This, REFIID iid, LPVOID *ppObj)
49 {
50 return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl,
51 IDirectDraw4,
52 IDirectDraw7, This),
53 iid, ppObj);
54 }
55
56 static ULONG WINAPI
57 IDirectDrawImpl_AddRef(LPDIRECTDRAW This)
58 {
59 return IDirectDraw7_AddRef(COM_INTERFACE_CAST(IDirectDrawImpl,
60 IDirectDraw, IDirectDraw7,
61 This));
62 }
63
64 static ULONG WINAPI
65 IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 This)
66 {
67 return IDirectDraw7_AddRef(COM_INTERFACE_CAST(IDirectDrawImpl,
68 IDirectDraw2, IDirectDraw7,
69 This));
70 }
71
72 static ULONG WINAPI
73 IDirectDraw4Impl_AddRef(LPDIRECTDRAW4 This)
74 {
75 return IDirectDraw7_AddRef(COM_INTERFACE_CAST(IDirectDrawImpl,
76 IDirectDraw4, IDirectDraw7,
77 This));
78 }
79
80 static ULONG WINAPI
81 IDirectDrawImpl_Release(LPDIRECTDRAW This)
82 {
83 return IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
84 IDirectDraw, IDirectDraw7,
85 This));
86 }
87
88 static ULONG WINAPI
89 IDirectDraw2Impl_Release(LPDIRECTDRAW2 This)
90 {
91 return IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
92 IDirectDraw2, IDirectDraw7,
93 This));
94 }
95
96 static ULONG WINAPI
97 IDirectDraw4Impl_Release(LPDIRECTDRAW4 This)
98 {
99 return IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
100 IDirectDraw4, IDirectDraw7,
101 This));
102 }
103
104 static HRESULT WINAPI
105 IDirectDrawImpl_Compact(LPDIRECTDRAW This)
106 {
107 return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl,
108 IDirectDraw, IDirectDraw7,
109 This));
110 }
111
112 static HRESULT WINAPI
113 IDirectDraw2Impl_Compact(LPDIRECTDRAW2 This)
114 {
115 return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl,
116 IDirectDraw2, IDirectDraw7,
117 This));
118 }
119
120 static HRESULT WINAPI
121 IDirectDraw4Impl_Compact(LPDIRECTDRAW4 This)
122 {
123 return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl,
124 IDirectDraw4, IDirectDraw7,
125 This));
126 }
127
128 static HRESULT WINAPI
129 IDirectDrawImpl_CreateClipper(LPDIRECTDRAW This, DWORD dwFlags,
130 LPDIRECTDRAWCLIPPER *ppClipper,
131 IUnknown *pUnkOuter)
132 {
133 return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl,
134 IDirectDraw,
135 IDirectDraw7,
136 This),
137 dwFlags, ppClipper, pUnkOuter);
138 }
139
140 static HRESULT WINAPI
141 IDirectDraw2Impl_CreateClipper(LPDIRECTDRAW2 This, DWORD dwFlags,
142 LPDIRECTDRAWCLIPPER *ppClipper,
143 IUnknown *pUnkOuter)
144 {
145 return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl,
146 IDirectDraw2,
147 IDirectDraw7,
148 This),
149 dwFlags, ppClipper, pUnkOuter);
150 }
151
152 static HRESULT WINAPI
153 IDirectDraw4Impl_CreateClipper(LPDIRECTDRAW4 This, DWORD dwFlags,
154 LPDIRECTDRAWCLIPPER *ppClipper,
155 IUnknown *pUnkOuter)
156 {
157 return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl,
158 IDirectDraw4,
159 IDirectDraw7,
160 This),
161 dwFlags, ppClipper, pUnkOuter);
162 }
163
164 static HRESULT WINAPI
165 IDirectDrawImpl_CreatePalette(LPDIRECTDRAW This, DWORD dwFlags,
166 LPPALETTEENTRY pEntries,
167 LPDIRECTDRAWPALETTE *ppPalette,
168 IUnknown *pUnkOuter)
169 {
170 return IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl,
171 IDirectDraw,
172 IDirectDraw7,
173 This),
174 dwFlags, pEntries, ppPalette, pUnkOuter);
175 }
176
177 static HRESULT WINAPI
178 IDirectDraw2Impl_CreatePalette(LPDIRECTDRAW2 This, DWORD dwFlags,
179 LPPALETTEENTRY pEntries,
180 LPDIRECTDRAWPALETTE *ppPalette,
181 IUnknown *pUnkOuter)
182 {
183 return IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl,
184 IDirectDraw2,
185 IDirectDraw7,
186 This),
187 dwFlags, pEntries, ppPalette, pUnkOuter);
188 }
189
190 static HRESULT WINAPI
191 IDirectDraw4Impl_CreatePalette(LPDIRECTDRAW4 This, DWORD dwFlags,
192 LPPALETTEENTRY pEntries,
193 LPDIRECTDRAWPALETTE *ppPalette,
194 IUnknown *pUnkOuter)
195 {
196 return IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl,
197 IDirectDraw4,
198 IDirectDraw7,
199 This),
200 dwFlags, pEntries, ppPalette, pUnkOuter);
201 }
202
203 static HRESULT WINAPI
204 IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
205 LPDIRECTDRAWSURFACE *ppSurface,
206 IUnknown *pUnkOuter)
207 {
208 LPDIRECTDRAWSURFACE7 pSurface7;
209 HRESULT hr;
210
211 /* the LPDDSURFACEDESC -> LPDDSURFACEDESC2 conversion should be ok,
212 * since the data layout is the same */
213 hr = IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
214 IDirectDraw,
215 IDirectDraw7,
216 This),
217 (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
218
219 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
220 * IDirectDrawSurface vtable layout at the beginning */
221 *ppSurface = (LPDIRECTDRAWSURFACE) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
222 IDirectDrawSurface7, IDirectDrawSurface3,
223 pSurface7);
224
225 return hr;
226 }
227
228 static HRESULT WINAPI
229 IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc,
230 LPDIRECTDRAWSURFACE *ppSurface,
231 IUnknown *pUnkOuter)
232 {
233 LPDIRECTDRAWSURFACE7 pSurface7;
234 HRESULT hr;
235
236 hr = IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
237 IDirectDraw2,
238 IDirectDraw7,
239 This),
240 (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
241
242 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
243 * IDirectDrawSurface vtable layout at the beginning */
244 *ppSurface = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
245 IDirectDrawSurface7, IDirectDrawSurface3,
246 pSurface7);
247
248 return hr;
249 }
250
251 static HRESULT WINAPI
252 IDirectDraw4Impl_CreateSurface(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pSDesc,
253 LPDIRECTDRAWSURFACE4 *ppSurface,
254 IUnknown *pUnkOuter)
255 {
256 return IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
257 IDirectDraw4,
258 IDirectDraw7,
259 This),
260 pSDesc,
261 (LPDIRECTDRAWSURFACE7 *)ppSurface,
262 pUnkOuter);
263 }
264
265 static HRESULT WINAPI
266 IDirectDrawImpl_DuplicateSurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE pSrc,
267 LPDIRECTDRAWSURFACE *ppDst)
268 {
269 LPDIRECTDRAWSURFACE7 pDst7;
270 HRESULT hr;
271
272 hr = IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
273 IDirectDraw,
274 IDirectDraw7, This),
275 COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
276 IDirectDrawSurface3,
277 IDirectDrawSurface7,
278 pSrc),
279 &pDst7);
280
281 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
282 * IDirectDrawSurface vtable layout at the beginning */
283 *ppDst = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
284 IDirectDrawSurface3, pDst7);
285
286 return hr;
287 }
288
289 static HRESULT WINAPI
290 IDirectDraw2Impl_DuplicateSurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE pSrc,
291 LPDIRECTDRAWSURFACE *ppDst)
292 {
293 LPDIRECTDRAWSURFACE7 pDst7;
294 HRESULT hr;
295
296 hr = IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
297 IDirectDraw2,
298 IDirectDraw7, This),
299 COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
300 IDirectDrawSurface3,
301 IDirectDrawSurface7,
302 pSrc),
303 &pDst7);
304
305 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
306 * IDirectDrawSurface vtable layout at the beginning */
307 *ppDst = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
308 IDirectDrawSurface3, pDst7);
309
310 return hr;
311 }
312
313 static HRESULT WINAPI
314 IDirectDraw4Impl_DuplicateSurface(LPDIRECTDRAW4 This,
315 LPDIRECTDRAWSURFACE4 pSrc,
316 LPDIRECTDRAWSURFACE4 *ppDst)
317 {
318 return IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
319 IDirectDraw4,
320 IDirectDraw7,
321 This),
322 (LPDIRECTDRAWSURFACE7)pSrc,
323 (LPDIRECTDRAWSURFACE7 *)ppDst);
324 }
325
326 struct displaymodescallback_context
327 {
328 LPDDENUMMODESCALLBACK func;
329 LPVOID context;
330 };
331
332 static HRESULT CALLBACK
333 EnumDisplayModesCallbackThunk(LPDDSURFACEDESC2 pDDSD2, LPVOID context)
334 {
335 DDSURFACEDESC DDSD;
336 struct displaymodescallback_context *cbcontext = context;
337
338 memcpy(&DDSD,pDDSD2,sizeof(DDSD));
339 DDSD.dwSize = sizeof(DDSD);
340
341 return cbcontext->func(&DDSD, cbcontext->context);
342 }
343
344 static HRESULT WINAPI
345 IDirectDrawImpl_EnumDisplayModes(LPDIRECTDRAW This, DWORD dwFlags,
346 LPDDSURFACEDESC pDDSD, LPVOID context,
347 LPDDENUMMODESCALLBACK cb)
348 {
349 struct displaymodescallback_context cbcontext;
350
351 cbcontext.func = cb;
352 cbcontext.context = context;
353
354 return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl,
355 IDirectDraw,
356 IDirectDraw7,
357 This),
358 dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext,
359 EnumDisplayModesCallbackThunk);
360 }
361
362 static HRESULT WINAPI
363 IDirectDraw2Impl_EnumDisplayModes(LPDIRECTDRAW2 This, DWORD dwFlags,
364 LPDDSURFACEDESC pDDSD, LPVOID context,
365 LPDDENUMMODESCALLBACK cb)
366 {
367 struct displaymodescallback_context cbcontext;
368
369 cbcontext.func = cb;
370 cbcontext.context = context;
371
372 return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl,
373 IDirectDraw2,
374 IDirectDraw7,
375 This),
376 dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext,
377 EnumDisplayModesCallbackThunk);
378 }
379
380 static HRESULT WINAPI
381 IDirectDraw4Impl_EnumDisplayModes(LPDIRECTDRAW4 This, DWORD dwFlags,
382 LPDDSURFACEDESC2 pDDSD, LPVOID context,
383 LPDDENUMMODESCALLBACK2 cb)
384 {
385 return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl,
386 IDirectDraw4,
387 IDirectDraw7,
388 This),
389 dwFlags, pDDSD, context, cb);
390 }
391
392 struct surfacescallback_context
393 {
394 LPDDENUMSURFACESCALLBACK func;
395 LPVOID context;
396 };
397
398 static HRESULT CALLBACK
399 EnumSurfacesCallbackThunk(LPDIRECTDRAWSURFACE7 pSurf, LPDDSURFACEDESC2 pDDSD,
400 LPVOID context)
401 {
402 struct surfacescallback_context *cbcontext = context;
403
404 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
405 * IDirectDrawSurface vtable layout at the beginning */
406 return cbcontext->func((LPDIRECTDRAWSURFACE)
407 COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
408 IDirectDrawSurface7,
409 IDirectDrawSurface3, pSurf),
410 (LPDDSURFACEDESC)pDDSD, cbcontext->context);
411 }
412
413 static HRESULT WINAPI
414 IDirectDrawImpl_EnumSurfaces(LPDIRECTDRAW This, DWORD dwFlags,
415 LPDDSURFACEDESC pDDSD, LPVOID context,
416 LPDDENUMSURFACESCALLBACK cb)
417 {
418 struct surfacescallback_context cbcontext;
419
420 cbcontext.func = cb;
421 cbcontext.context = context;
422
423 return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
424 IDirectDraw,
425 IDirectDraw7, This),
426 dwFlags, (LPDDSURFACEDESC2)pDDSD,
427 &cbcontext, EnumSurfacesCallbackThunk);
428 }
429
430 static HRESULT WINAPI
431 IDirectDraw2Impl_EnumSurfaces(LPDIRECTDRAW2 This, DWORD dwFlags,
432 LPDDSURFACEDESC pDDSD, LPVOID context,
433 LPDDENUMSURFACESCALLBACK cb)
434 {
435 struct surfacescallback_context cbcontext;
436
437 cbcontext.func = cb;
438 cbcontext.context = context;
439
440 return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
441 IDirectDraw2,
442 IDirectDraw7, This),
443 dwFlags, (LPDDSURFACEDESC2)pDDSD,
444 &cbcontext, EnumSurfacesCallbackThunk);
445 }
446
447 static HRESULT WINAPI
448 IDirectDraw4Impl_EnumSurfaces(LPDIRECTDRAW4 This, DWORD dwFlags,
449 LPDDSURFACEDESC2 pDDSD, LPVOID context,
450 LPDDENUMSURFACESCALLBACK2 cb)
451 {
452 return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
453 IDirectDraw4,
454 IDirectDraw7, This),
455 dwFlags, pDDSD, context,
456 (LPDDENUMSURFACESCALLBACK7)cb);
457 }
458
459 static HRESULT WINAPI
460 IDirectDrawImpl_FlipToGDISurface(LPDIRECTDRAW This)
461 {
462 return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
463 IDirectDraw,
464 IDirectDraw7,
465 This));
466 }
467
468 static HRESULT WINAPI
469 IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 This)
470 {
471 return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
472 IDirectDraw2,
473 IDirectDraw7,
474 This));
475 }
476
477 static HRESULT WINAPI
478 IDirectDraw4Impl_FlipToGDISurface(LPDIRECTDRAW4 This)
479 {
480 return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
481 IDirectDraw4,
482 IDirectDraw7,
483 This));
484 }
485
486 static HRESULT WINAPI
487 IDirectDrawImpl_GetCaps(LPDIRECTDRAW This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
488 {
489 return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl,
490 IDirectDraw, IDirectDraw7,
491 This), pDDC1, pDDC2);
492 }
493
494 static HRESULT WINAPI
495 IDirectDraw2Impl_GetCaps(LPDIRECTDRAW2 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
496 {
497 return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl,
498 IDirectDraw2, IDirectDraw7,
499 This), pDDC1, pDDC2);
500 }
501
502 static HRESULT WINAPI
503 IDirectDraw4Impl_GetCaps(LPDIRECTDRAW4 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
504 {
505 return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl,
506 IDirectDraw4, IDirectDraw7,
507 This), pDDC1, pDDC2);
508 }
509
510 static HRESULT WINAPI
511 IDirectDrawImpl_GetDisplayMode(LPDIRECTDRAW This, LPDDSURFACEDESC pDDSD)
512 {
513 return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
514 IDirectDraw,
515 IDirectDraw7, This),
516 (LPDDSURFACEDESC2)pDDSD);
517 }
518
519 static HRESULT WINAPI
520 IDirectDraw2Impl_GetDisplayMode(LPDIRECTDRAW2 This, LPDDSURFACEDESC pDDSD)
521 {
522 return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
523 IDirectDraw2,
524 IDirectDraw7, This),
525 (LPDDSURFACEDESC2)pDDSD);
526 }
527
528 static HRESULT WINAPI
529 IDirectDraw4Impl_GetDisplayMode(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pDDSD)
530 {
531 return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
532 IDirectDraw4,
533 IDirectDraw7, This),
534 pDDSD);
535 }
536
537 static HRESULT WINAPI
538 IDirectDrawImpl_GetFourCCCodes(LPDIRECTDRAW This, LPDWORD lpNumCodes,
539 LPDWORD lpCodes)
540 {
541 return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl,
542 IDirectDraw,
543 IDirectDraw7,
544 This),
545 lpNumCodes, lpCodes);
546 }
547
548 static HRESULT WINAPI
549 IDirectDraw2Impl_GetFourCCCodes(LPDIRECTDRAW2 This, LPDWORD lpNumCodes,
550 LPDWORD lpCodes)
551 {
552 return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl,
553 IDirectDraw2,
554 IDirectDraw7,
555 This),
556 lpNumCodes, lpCodes);
557 }
558
559 static HRESULT WINAPI
560 IDirectDraw4Impl_GetFourCCCodes(LPDIRECTDRAW4 This, LPDWORD lpNumCodes,
561 LPDWORD lpCodes)
562 {
563 return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl,
564 IDirectDraw4,
565 IDirectDraw7,
566 This),
567 lpNumCodes, lpCodes);
568 }
569
570 static HRESULT WINAPI
571 IDirectDrawImpl_GetGDISurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE *ppSurf)
572 {
573 LPDIRECTDRAWSURFACE7 pSurf7;
574 HRESULT hr;
575
576 hr = IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
577 IDirectDraw,
578 IDirectDraw7,
579 This), &pSurf7);
580
581 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
582 * IDirectDrawSurface vtable layout at the beginning */
583 *ppSurf = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
584 IDirectDrawSurface3, pSurf7);
585
586 return hr;
587 }
588
589 static HRESULT WINAPI
590 IDirectDraw2Impl_GetGDISurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE *ppSurf)
591 {
592 LPDIRECTDRAWSURFACE7 pSurf7;
593 HRESULT hr;
594
595 hr = IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
596 IDirectDraw2,
597 IDirectDraw7,
598 This), &pSurf7);
599
600 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
601 * IDirectDrawSurface vtable layout at the beginning */
602 *ppSurf = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
603 IDirectDrawSurface3, pSurf7);
604
605 return hr;
606 }
607
608 static HRESULT WINAPI
609 IDirectDraw4Impl_GetGDISurface(LPDIRECTDRAW4 This,
610 LPDIRECTDRAWSURFACE4 *ppSurf)
611 {
612 return IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
613 IDirectDraw4,
614 IDirectDraw7,
615 This),
616 (LPDIRECTDRAWSURFACE7 *)ppSurf);
617 }
618
619 static HRESULT WINAPI
620 IDirectDrawImpl_GetMonitorFrequency(LPDIRECTDRAW This, LPDWORD pdwFreq)
621 {
622 return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl,
623 IDirectDraw,
624 IDirectDraw7,
625 This),
626 pdwFreq);
627 }
628
629 static HRESULT WINAPI
630 IDirectDraw2Impl_GetMonitorFrequency(LPDIRECTDRAW2 This, LPDWORD pdwFreq)
631 {
632 return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl,
633 IDirectDraw2,
634 IDirectDraw7,
635 This),
636 pdwFreq);
637 }
638
639 static HRESULT WINAPI
640 IDirectDraw4Impl_GetMonitorFrequency(LPDIRECTDRAW4 This, LPDWORD pdwFreq)
641 {
642 return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl,
643 IDirectDraw4,
644 IDirectDraw7,
645 This),
646 pdwFreq);
647 }
648
649 static HRESULT WINAPI
650 IDirectDrawImpl_GetScanLine(LPDIRECTDRAW This, LPDWORD pdwLine)
651 {
652 return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl,
653 IDirectDraw,
654 IDirectDraw7,
655 This), pdwLine);
656 }
657
658 static HRESULT WINAPI
659 IDirectDraw2Impl_GetScanLine(LPDIRECTDRAW2 This, LPDWORD pdwLine)
660 {
661 return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl,
662 IDirectDraw2,
663 IDirectDraw7,
664 This), pdwLine);
665 }
666
667 static HRESULT WINAPI
668 IDirectDraw4Impl_GetScanLine(LPDIRECTDRAW4 This, LPDWORD pdwLine)
669 {
670 return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl,
671 IDirectDraw4,
672 IDirectDraw7,
673 This), pdwLine);
674 }
675
676 static HRESULT WINAPI
677 IDirectDrawImpl_GetVerticalBlankStatus(LPDIRECTDRAW This, LPBOOL lpbIsInVB)
678 {
679 return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl,
680 IDirectDraw,
681 IDirectDraw7,
682 This),
683 lpbIsInVB);
684 }
685
686 static HRESULT WINAPI
687 IDirectDraw2Impl_GetVerticalBlankStatus(LPDIRECTDRAW2 This, LPBOOL lpbIsInVB)
688 {
689 return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl,
690 IDirectDraw2,
691 IDirectDraw7,
692 This),
693 lpbIsInVB);
694 }
695
696 static HRESULT WINAPI
697 IDirectDraw4Impl_GetVerticalBlankStatus(LPDIRECTDRAW4 This, LPBOOL lpbIsInVB)
698 {
699 return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl,
700 IDirectDraw4,
701 IDirectDraw7,
702 This),
703 lpbIsInVB);
704 }
705
706 static HRESULT WINAPI
707 IDirectDrawImpl_Initialize(LPDIRECTDRAW iface, LPGUID pGUID)
708 {
709 ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw, iface);
710 HRESULT ret_value;
711
712 ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID);
713
714 /* Overwrite the falsely set 'DIRECTDRAW7' flag */
715 //This->local.dwLocalFlags &= ~DDRAWILCL_DIRECTDRAW7;
716
717 return ret_value;
718 }
719
720 static HRESULT WINAPI
721 IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, LPGUID pGUID)
722 {
723 ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw2, iface);
724 HRESULT ret_value;
725
726 ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID);
727
728 /* Overwrite the falsely set 'DIRECTDRAW7' flag */
729 //This->local.dwLocalFlags &= ~DDRAWILCL_DIRECTDRAW7;
730
731 return ret_value;
732 }
733
734 static HRESULT WINAPI
735 IDirectDraw4Impl_Initialize(LPDIRECTDRAW4 iface, LPGUID pGUID)
736 {
737 ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw4, iface);
738 HRESULT ret_value;
739
740 ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID);
741
742 /* Overwrite the falsely set 'DIRECTDRAW7' flag */
743 //This->local.dwLocalFlags &= ~DDRAWILCL_DIRECTDRAW7;
744
745 return ret_value;
746 }
747
748
749 static HRESULT WINAPI
750 IDirectDrawImpl_RestoreDisplayMode(LPDIRECTDRAW This)
751 {
752 return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
753 IDirectDraw,
754 IDirectDraw7,
755 This));
756 }
757
758 static HRESULT WINAPI
759 IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 This)
760 {
761 return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
762 IDirectDraw2,
763 IDirectDraw7,
764 This));
765 }
766
767 static HRESULT WINAPI
768 IDirectDraw4Impl_RestoreDisplayMode(LPDIRECTDRAW4 This)
769 {
770 return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
771 IDirectDraw4,
772 IDirectDraw7,
773 This));
774 }
775
776 static HRESULT WINAPI
777 IDirectDrawImpl_SetCooperativeLevel(LPDIRECTDRAW This, HWND hWnd,
778 DWORD dwFlags)
779 {
780 return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
781 IDirectDraw,
782 IDirectDraw7,
783 This),
784 hWnd, dwFlags);
785 }
786
787 static HRESULT WINAPI
788 IDirectDraw2Impl_SetCooperativeLevel(LPDIRECTDRAW2 This, HWND hWnd,
789 DWORD dwFlags)
790 {
791 return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
792 IDirectDraw2,
793 IDirectDraw7,
794 This),
795 hWnd, dwFlags);
796 }
797
798 static HRESULT WINAPI
799 IDirectDraw4Impl_SetCooperativeLevel(LPDIRECTDRAW4 This, HWND hWnd,
800 DWORD dwFlags)
801 {
802 return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
803 IDirectDraw4,
804 IDirectDraw7,
805 This),
806 hWnd, dwFlags);
807 }
808
809 static HRESULT WINAPI
810 IDirectDrawImpl_SetDisplayMode(LPDIRECTDRAW This, DWORD a, DWORD b, DWORD c)
811 {
812 return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
813 IDirectDraw,
814 IDirectDraw7,
815 This),
816 a, b, c, 0, 0);
817 }
818
819 static HRESULT WINAPI
820 IDirectDraw2Impl_SetDisplayMode(LPDIRECTDRAW2 This, DWORD a, DWORD b, DWORD c,
821 DWORD d, DWORD e)
822 {
823 return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
824 IDirectDraw2,
825 IDirectDraw7,
826 This),
827 a, b, c, d, e);
828 }
829
830 static HRESULT WINAPI
831 IDirectDraw4Impl_SetDisplayMode(LPDIRECTDRAW4 This, DWORD a, DWORD b, DWORD c,
832 DWORD d, DWORD e)
833 {
834 return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
835 IDirectDraw4,
836 IDirectDraw7,
837 This),
838 a, b, c, d, e);
839 }
840
841 static HRESULT WINAPI
842 IDirectDrawImpl_WaitForVerticalBlank(LPDIRECTDRAW This, DWORD dwFlags,
843 HANDLE hEvent)
844 {
845 return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl,
846 IDirectDraw,
847 IDirectDraw7,
848 This),
849 dwFlags, hEvent);
850 }
851
852 static HRESULT WINAPI
853 IDirectDraw2Impl_WaitForVerticalBlank(LPDIRECTDRAW2 This, DWORD dwFlags,
854 HANDLE hEvent)
855 {
856 return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl,
857 IDirectDraw2,
858 IDirectDraw7,
859 This),
860 dwFlags, hEvent);
861 }
862
863 static HRESULT WINAPI
864 IDirectDraw4Impl_WaitForVerticalBlank(LPDIRECTDRAW4 This, DWORD dwFlags,
865 HANDLE hEvent)
866 {
867 return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl,
868 IDirectDraw4,
869 IDirectDraw7,
870 This),
871 dwFlags, hEvent);
872 }
873
874 void DDRAW_Convert_DDSCAPS_1_To_2(const DDSCAPS* pIn, DDSCAPS2* pOut)
875 {
876 /* 2 adds three additional caps fields to the end. Both versions
877 * are unversioned. */
878 pOut->dwCaps = pIn->dwCaps;
879 pOut->dwCaps2 = 0;
880 pOut->dwCaps3 = 0;
881 pOut->dwCaps4 = 0;
882 }
883
884 static HRESULT WINAPI
885 IDirectDraw2Impl_GetAvailableVidMem(LPDIRECTDRAW2 This, LPDDSCAPS pCaps,
886 LPDWORD pdwTotal, LPDWORD pdwFree)
887 {
888 DDSCAPS2 Caps2;
889 DDRAW_Convert_DDSCAPS_1_To_2(pCaps, &Caps2);
890
891 return IDirectDraw7_GetAvailableVidMem(COM_INTERFACE_CAST(IDirectDrawImpl,
892 IDirectDraw2,
893 IDirectDraw7,
894 This),
895 &Caps2, pdwTotal, pdwFree);
896 }
897
898 static HRESULT WINAPI
899 IDirectDraw4Impl_GetAvailableVidMem(LPDIRECTDRAW4 This, LPDDSCAPS2 pCaps,
900 LPDWORD pdwTotal, LPDWORD pdwFree)
901 {
902 return IDirectDraw7_GetAvailableVidMem(COM_INTERFACE_CAST(IDirectDrawImpl,
903 IDirectDraw4,
904 IDirectDraw7,
905 This),
906 pCaps, pdwTotal, pdwFree);
907 }
908
909 static HRESULT WINAPI
910 IDirectDraw4Impl_GetSurfaceFromDC(LPDIRECTDRAW4 This, HDC hDC,
911 LPDIRECTDRAWSURFACE4 *pSurf)
912 {
913 return IDirectDraw7_GetSurfaceFromDC(COM_INTERFACE_CAST(IDirectDrawImpl,
914 IDirectDraw4,
915 IDirectDraw7,
916 This),
917 hDC, (LPDIRECTDRAWSURFACE7 *)pSurf);
918 }
919
920 static HRESULT WINAPI
921 IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 This)
922 {
923 return IDirectDraw7_RestoreAllSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
924 IDirectDraw4,
925 IDirectDraw7,
926 This));
927 }
928
929 static HRESULT WINAPI
930 IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 This)
931 {
932 return IDirectDraw7_TestCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
933 IDirectDraw4,
934 IDirectDraw7,
935 This));
936 }
937
938 void DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(const DDDEVICEIDENTIFIER2* pIn,
939 DDDEVICEIDENTIFIER* pOut)
940 {
941 /* 2 adds a dwWHQLLevel field to the end. Both structures are
942 * unversioned. */
943 memcpy(pOut, pIn, sizeof(*pOut));
944 }
945
946 static HRESULT WINAPI
947 IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 This,
948 LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags)
949 {
950 DDDEVICEIDENTIFIER2 DDDI2;
951 HRESULT hr;
952
953 hr = IDirectDraw7_GetDeviceIdentifier(COM_INTERFACE_CAST(IDirectDrawImpl,
954 IDirectDraw4,
955 IDirectDraw7,
956 This),
957 &DDDI2, dwFlags);
958
959 DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(&DDDI2, pDDDI);
960
961 return hr;
962 }
963
964 IDirectDrawVtbl DDRAW_IDirectDraw_VTable =
965 {
966 IDirectDrawImpl_QueryInterface,
967 IDirectDrawImpl_AddRef,
968 IDirectDrawImpl_Release,
969 IDirectDrawImpl_Compact,
970 IDirectDrawImpl_CreateClipper,
971 IDirectDrawImpl_CreatePalette,
972 IDirectDrawImpl_CreateSurface,
973 IDirectDrawImpl_DuplicateSurface,
974 IDirectDrawImpl_EnumDisplayModes,
975 IDirectDrawImpl_EnumSurfaces,
976 IDirectDrawImpl_FlipToGDISurface,
977 IDirectDrawImpl_GetCaps,
978 IDirectDrawImpl_GetDisplayMode,
979 IDirectDrawImpl_GetFourCCCodes,
980 IDirectDrawImpl_GetGDISurface,
981 IDirectDrawImpl_GetMonitorFrequency,
982 IDirectDrawImpl_GetScanLine,
983 IDirectDrawImpl_GetVerticalBlankStatus,
984 IDirectDrawImpl_Initialize,
985 IDirectDrawImpl_RestoreDisplayMode,
986 IDirectDrawImpl_SetCooperativeLevel,
987 IDirectDrawImpl_SetDisplayMode,
988 IDirectDrawImpl_WaitForVerticalBlank,
989 };
990
991 IDirectDraw2Vtbl DDRAW_IDirectDraw2_VTable =
992 {
993 IDirectDraw2Impl_QueryInterface,
994 IDirectDraw2Impl_AddRef,
995 IDirectDraw2Impl_Release,
996 IDirectDraw2Impl_Compact,
997 IDirectDraw2Impl_CreateClipper,
998 IDirectDraw2Impl_CreatePalette,
999 IDirectDraw2Impl_CreateSurface,
1000 IDirectDraw2Impl_DuplicateSurface,
1001 IDirectDraw2Impl_EnumDisplayModes,
1002 IDirectDraw2Impl_EnumSurfaces,
1003 IDirectDraw2Impl_FlipToGDISurface,
1004 IDirectDraw2Impl_GetCaps,
1005 IDirectDraw2Impl_GetDisplayMode,
1006 IDirectDraw2Impl_GetFourCCCodes,
1007 IDirectDraw2Impl_GetGDISurface,
1008 IDirectDraw2Impl_GetMonitorFrequency,
1009 IDirectDraw2Impl_GetScanLine,
1010 IDirectDraw2Impl_GetVerticalBlankStatus,
1011 IDirectDraw2Impl_Initialize,
1012 IDirectDraw2Impl_RestoreDisplayMode,
1013 IDirectDraw2Impl_SetCooperativeLevel,
1014 IDirectDraw2Impl_SetDisplayMode,
1015 IDirectDraw2Impl_WaitForVerticalBlank,
1016 IDirectDraw2Impl_GetAvailableVidMem
1017 };
1018
1019 IDirectDraw4Vtbl DDRAW_IDirectDraw4_VTable =
1020 {
1021 IDirectDraw4Impl_QueryInterface,
1022 IDirectDraw4Impl_AddRef,
1023 IDirectDraw4Impl_Release,
1024 IDirectDraw4Impl_Compact,
1025 IDirectDraw4Impl_CreateClipper,
1026 IDirectDraw4Impl_CreatePalette,
1027 IDirectDraw4Impl_CreateSurface,
1028 IDirectDraw4Impl_DuplicateSurface,
1029 IDirectDraw4Impl_EnumDisplayModes,
1030 IDirectDraw4Impl_EnumSurfaces,
1031 IDirectDraw4Impl_FlipToGDISurface,
1032 IDirectDraw4Impl_GetCaps,
1033 IDirectDraw4Impl_GetDisplayMode,
1034 IDirectDraw4Impl_GetFourCCCodes,
1035 IDirectDraw4Impl_GetGDISurface,
1036 IDirectDraw4Impl_GetMonitorFrequency,
1037 IDirectDraw4Impl_GetScanLine,
1038 IDirectDraw4Impl_GetVerticalBlankStatus,
1039 IDirectDraw4Impl_Initialize,
1040 IDirectDraw4Impl_RestoreDisplayMode,
1041 IDirectDraw4Impl_SetCooperativeLevel,
1042 IDirectDraw4Impl_SetDisplayMode,
1043 IDirectDraw4Impl_WaitForVerticalBlank,
1044 IDirectDraw4Impl_GetAvailableVidMem,
1045 IDirectDraw4Impl_GetSurfaceFromDC,
1046 IDirectDraw4Impl_RestoreAllSurfaces,
1047 IDirectDraw4Impl_TestCooperativeLevel,
1048 IDirectDraw4Impl_GetDeviceIdentifier
1049 };