1 /* Direct Draw Thunks and old vtables
2 * Copyright 2000 TransGaming Technologies Inc.
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.
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.
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
20 #include "wine/port.h"
28 #define NONAMELESSUNION
34 #include "wine/exception.h"
39 #include "ddraw_private.h"
40 #include "wine/debug.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(ddraw_thunk
);
43 WINE_DECLARE_DEBUG_CHANNEL(ddraw
);
46 IDirectDrawImpl_QueryInterface(LPDIRECTDRAW This
, REFIID iid
, LPVOID
*ppObj
)
48 return IDirectDraw7_QueryInterface((IDirectDraw7
*)ddraw_from_ddraw1(This
), iid
, ppObj
);
52 IDirectDraw2Impl_QueryInterface(LPDIRECTDRAW2 This
, REFIID iid
, LPVOID
*ppObj
)
54 return IDirectDraw7_QueryInterface((IDirectDraw7
*)ddraw_from_ddraw2(This
), iid
, ppObj
);
58 IDirectDraw4Impl_QueryInterface(LPDIRECTDRAW4 This
, REFIID iid
, LPVOID
*ppObj
)
60 return IDirectDraw7_QueryInterface((IDirectDraw7
*)ddraw_from_ddraw4(This
), iid
, ppObj
);
64 IDirectDrawImpl_AddRef(LPDIRECTDRAW iface
)
66 IDirectDrawImpl
*This
= ddraw_from_ddraw1(iface
);
67 ULONG ref
= InterlockedIncrement(&This
->ref1
);
69 TRACE("(%p) : incrementing IDirectDraw refcount from %u.\n", This
, ref
-1);
71 if(ref
== 1) InterlockedIncrement(&This
->numIfaces
);
77 IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 iface
)
79 IDirectDrawImpl
*This
= ddraw_from_ddraw2(iface
);
80 ULONG ref
= InterlockedIncrement(&This
->ref2
);
82 TRACE("(%p) : incrementing IDirectDraw2 refcount from %u.\n", This
, ref
-1);
84 if(ref
== 1) InterlockedIncrement(&This
->numIfaces
);
90 IDirectDraw4Impl_AddRef(LPDIRECTDRAW4 iface
)
92 IDirectDrawImpl
*This
= ddraw_from_ddraw4(iface
);
93 ULONG ref
= InterlockedIncrement(&This
->ref4
);
95 TRACE("(%p) : incrementing IDirectDraw4 refcount from %u.\n", This
, ref
-1);
97 if(ref
== 1) InterlockedIncrement(&This
->numIfaces
);
103 IDirectDrawImpl_Release(LPDIRECTDRAW iface
)
105 IDirectDrawImpl
*This
= ddraw_from_ddraw1(iface
);
106 ULONG ref
= InterlockedDecrement(&This
->ref1
);
108 TRACE_(ddraw
)("(%p)->() decrementing IDirectDraw refcount from %u.\n", This
, ref
+1);
112 ULONG ifacecount
= InterlockedDecrement(&This
->numIfaces
);
113 if(ifacecount
== 0) IDirectDrawImpl_Destroy(This
);
120 IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface
)
122 IDirectDrawImpl
*This
= ddraw_from_ddraw2(iface
);
123 ULONG ref
= InterlockedDecrement(&This
->ref2
);
125 TRACE_(ddraw
)("(%p)->() decrementing IDirectDraw2 refcount from %u.\n", This
, ref
+1);
129 ULONG ifacecount
= InterlockedDecrement(&This
->numIfaces
);
130 if(ifacecount
== 0) IDirectDrawImpl_Destroy(This
);
137 IDirectDraw4Impl_Release(LPDIRECTDRAW4 iface
)
139 IDirectDrawImpl
*This
= ddraw_from_ddraw4(iface
);
140 ULONG ref
= InterlockedDecrement(&This
->ref4
);
142 TRACE_(ddraw
)("(%p)->() decrementing IDirectDraw4 refcount from %u.\n", This
, ref
+1);
146 ULONG ifacecount
= InterlockedDecrement(&This
->numIfaces
);
147 if(ifacecount
== 0) IDirectDrawImpl_Destroy(This
);
153 static HRESULT WINAPI
154 IDirectDrawImpl_Compact(LPDIRECTDRAW This
)
156 return IDirectDraw7_Compact((IDirectDraw7
*)ddraw_from_ddraw1(This
));
159 static HRESULT WINAPI
160 IDirectDraw2Impl_Compact(LPDIRECTDRAW2 This
)
162 return IDirectDraw7_Compact((IDirectDraw7
*)ddraw_from_ddraw2(This
));
165 static HRESULT WINAPI
166 IDirectDraw4Impl_Compact(LPDIRECTDRAW4 This
)
168 return IDirectDraw7_Compact((IDirectDraw7
*)ddraw_from_ddraw4(This
));
171 static HRESULT WINAPI
172 IDirectDrawImpl_CreateClipper(LPDIRECTDRAW This
, DWORD dwFlags
,
173 LPDIRECTDRAWCLIPPER
*ppClipper
,
176 return IDirectDraw7_CreateClipper((IDirectDraw7
*)ddraw_from_ddraw1(This
), dwFlags
, ppClipper
, pUnkOuter
);
179 static HRESULT WINAPI
180 IDirectDraw2Impl_CreateClipper(LPDIRECTDRAW2 This
, DWORD dwFlags
,
181 LPDIRECTDRAWCLIPPER
*ppClipper
,
184 return IDirectDraw7_CreateClipper((IDirectDraw7
*)ddraw_from_ddraw2(This
), dwFlags
, ppClipper
, pUnkOuter
);
187 static HRESULT WINAPI
188 IDirectDraw4Impl_CreateClipper(LPDIRECTDRAW4 This
, DWORD dwFlags
,
189 LPDIRECTDRAWCLIPPER
*ppClipper
,
192 return IDirectDraw7_CreateClipper((IDirectDraw7
*)ddraw_from_ddraw4(This
), dwFlags
, ppClipper
, pUnkOuter
);
195 static HRESULT WINAPI
196 IDirectDrawImpl_CreatePalette(LPDIRECTDRAW This
, DWORD dwFlags
,
197 LPPALETTEENTRY pEntries
,
198 LPDIRECTDRAWPALETTE
*ppPalette
,
202 hr
= IDirectDraw7_CreatePalette((IDirectDraw7
*)ddraw_from_ddraw1(This
), dwFlags
, pEntries
, ppPalette
, pUnkOuter
);
203 if(SUCCEEDED(hr
) && *ppPalette
)
205 IDirectDrawPaletteImpl
*impl
= (IDirectDrawPaletteImpl
*)*ppPalette
;
206 IDirectDraw7_Release((IDirectDraw7
*)ddraw_from_ddraw1(This
));
207 impl
->ifaceToRelease
= NULL
;
213 static HRESULT WINAPI
214 IDirectDraw2Impl_CreatePalette(LPDIRECTDRAW2 This
, DWORD dwFlags
,
215 LPPALETTEENTRY pEntries
,
216 LPDIRECTDRAWPALETTE
*ppPalette
,
220 hr
= IDirectDraw7_CreatePalette((IDirectDraw7
*)ddraw_from_ddraw2(This
), dwFlags
, pEntries
, ppPalette
, pUnkOuter
);
221 if(SUCCEEDED(hr
) && *ppPalette
)
223 IDirectDrawPaletteImpl
*impl
= (IDirectDrawPaletteImpl
*)*ppPalette
;
224 IDirectDraw7_Release((IDirectDraw7
*)ddraw_from_ddraw2(This
));
225 impl
->ifaceToRelease
= NULL
;
230 static HRESULT WINAPI
231 IDirectDraw4Impl_CreatePalette(LPDIRECTDRAW4 This
, DWORD dwFlags
,
232 LPPALETTEENTRY pEntries
,
233 LPDIRECTDRAWPALETTE
*ppPalette
,
237 hr
= IDirectDraw7_CreatePalette((IDirectDraw7
*)ddraw_from_ddraw4(This
), dwFlags
, pEntries
, ppPalette
, pUnkOuter
);
238 if(SUCCEEDED(hr
) && *ppPalette
)
240 IDirectDrawPaletteImpl
*impl
= (IDirectDrawPaletteImpl
*)*ppPalette
;
241 IDirectDraw7_Release((IDirectDraw7
*)ddraw_from_ddraw4(This
));
242 IDirectDraw4_AddRef(This
);
243 impl
->ifaceToRelease
= (IUnknown
*) This
;
248 /* Must set all attached surfaces (e.g. mipmaps) versions as well */
249 static void set_surf_version(IDirectDrawSurfaceImpl
*surf
, int version
)
252 TRACE("%p->version(%d) = %d\n", surf
, surf
->version
, version
);
253 surf
->version
= version
;
254 for(i
= 0; i
< MAX_COMPLEX_ATTACHED
; i
++)
256 if(!surf
->complex_array
[i
]) break;
257 set_surf_version(surf
->complex_array
[i
], version
);
259 while( (surf
= surf
->next_attached
) )
261 set_surf_version(surf
, version
);
265 static HRESULT WINAPI
266 IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This
, LPDDSURFACEDESC pSDesc
,
267 LPDIRECTDRAWSURFACE
*ppSurface
,
270 LPDIRECTDRAWSURFACE7 pSurface7
;
271 IDirectDrawSurfaceImpl
*impl
;
274 /* Remove front buffer flag, this causes failure in v7, and its added to normal
277 pSDesc
->ddsCaps
.dwCaps
&= ~DDSCAPS_FRONTBUFFER
;
278 /* the LPDDSURFACEDESC -> LPDDSURFACEDESC2 conversion should be ok,
279 * since the data layout is the same */
280 hr
= IDirectDraw7_CreateSurface((IDirectDraw7
*)ddraw_from_ddraw1(This
),
281 (LPDDSURFACEDESC2
)pSDesc
, &pSurface7
, pUnkOuter
);
288 impl
= (IDirectDrawSurfaceImpl
*)pSurface7
;
289 *ppSurface
= (IDirectDrawSurface
*)&impl
->IDirectDrawSurface3_vtbl
;
290 set_surf_version(impl
, 1);
291 IDirectDraw7_Release((IDirectDraw7
*)ddraw_from_ddraw1(This
));
292 impl
->ifaceToRelease
= NULL
;
297 static HRESULT WINAPI
298 IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This
, LPDDSURFACEDESC pSDesc
,
299 LPDIRECTDRAWSURFACE
*ppSurface
,
302 LPDIRECTDRAWSURFACE7 pSurface7
;
303 IDirectDrawSurfaceImpl
*impl
;
306 hr
= IDirectDraw7_CreateSurface((IDirectDraw7
*)ddraw_from_ddraw2(This
),
307 (LPDDSURFACEDESC2
)pSDesc
, &pSurface7
, pUnkOuter
);
314 impl
= (IDirectDrawSurfaceImpl
*)pSurface7
;
315 *ppSurface
= (IDirectDrawSurface
*)&impl
->IDirectDrawSurface3_vtbl
;
316 set_surf_version(impl
, 2);
317 IDirectDraw7_Release((IDirectDraw7
*)ddraw_from_ddraw2(This
));
318 impl
->ifaceToRelease
= NULL
;
323 static HRESULT WINAPI
324 IDirectDraw4Impl_CreateSurface(LPDIRECTDRAW4 This
, LPDDSURFACEDESC2 pSDesc
,
325 LPDIRECTDRAWSURFACE4
*ppSurface
,
329 IDirectDrawSurfaceImpl
*impl
;
331 hr
= IDirectDraw7_CreateSurface((IDirectDraw7
*)ddraw_from_ddraw4(This
),
332 pSDesc
, (LPDIRECTDRAWSURFACE7
*)ppSurface
, pUnkOuter
);
333 impl
= (IDirectDrawSurfaceImpl
*)*ppSurface
;
334 if(SUCCEEDED(hr
) && impl
)
336 set_surf_version(impl
, 4);
337 IDirectDraw7_Release((IDirectDraw7
*)ddraw_from_ddraw4(This
));
338 IDirectDraw4_AddRef(This
);
339 impl
->ifaceToRelease
= (IUnknown
*) This
;
344 static HRESULT WINAPI
345 IDirectDrawImpl_DuplicateSurface(LPDIRECTDRAW This
, LPDIRECTDRAWSURFACE pSrc
,
346 LPDIRECTDRAWSURFACE
*ppDst
)
348 LPDIRECTDRAWSURFACE7 pDst7
;
351 hr
= IDirectDraw7_DuplicateSurface((IDirectDraw7
*)ddraw_from_ddraw1(This
),
352 pSrc
? (IDirectDrawSurface7
*)surface_from_surface3((IDirectDrawSurface3
*)pSrc
) : NULL
, &pDst7
);
354 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
355 * IDirectDrawSurface vtable layout at the beginning */
356 *ppDst
= pDst7
? (IDirectDrawSurface
*)&((IDirectDrawSurfaceImpl
*)pDst7
)->IDirectDrawSurface3_vtbl
: NULL
;
361 static HRESULT WINAPI
362 IDirectDraw2Impl_DuplicateSurface(LPDIRECTDRAW2 This
, LPDIRECTDRAWSURFACE pSrc
,
363 LPDIRECTDRAWSURFACE
*ppDst
)
365 LPDIRECTDRAWSURFACE7 pDst7
;
368 hr
= IDirectDraw7_DuplicateSurface((IDirectDraw7
*)ddraw_from_ddraw2(This
),
369 pSrc
? (IDirectDrawSurface7
*)surface_from_surface3((IDirectDrawSurface3
*)pSrc
) : NULL
, &pDst7
);
371 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
372 * IDirectDrawSurface vtable layout at the beginning */
373 *ppDst
= pDst7
? (IDirectDrawSurface
*)&((IDirectDrawSurfaceImpl
*)pDst7
)->IDirectDrawSurface3_vtbl
: NULL
;
378 static HRESULT WINAPI
379 IDirectDraw4Impl_DuplicateSurface(LPDIRECTDRAW4 This
,
380 LPDIRECTDRAWSURFACE4 pSrc
,
381 LPDIRECTDRAWSURFACE4
*ppDst
)
383 return IDirectDraw7_DuplicateSurface((IDirectDraw7
*)ddraw_from_ddraw4(This
),
384 (LPDIRECTDRAWSURFACE7
)pSrc
, (LPDIRECTDRAWSURFACE7
*)ppDst
);
387 struct displaymodescallback_context
389 LPDDENUMMODESCALLBACK func
;
393 static HRESULT CALLBACK
394 EnumDisplayModesCallbackThunk(LPDDSURFACEDESC2 pDDSD2
, LPVOID context
)
397 struct displaymodescallback_context
*cbcontext
= context
;
399 memcpy(&DDSD
,pDDSD2
,sizeof(DDSD
));
400 DDSD
.dwSize
= sizeof(DDSD
);
402 return cbcontext
->func(&DDSD
, cbcontext
->context
);
405 static HRESULT WINAPI
406 IDirectDrawImpl_EnumDisplayModes(LPDIRECTDRAW This
, DWORD dwFlags
,
407 LPDDSURFACEDESC pDDSD
, LPVOID context
,
408 LPDDENUMMODESCALLBACK cb
)
410 struct displaymodescallback_context cbcontext
;
413 cbcontext
.context
= context
;
415 return IDirectDraw7_EnumDisplayModes((IDirectDraw7
*)ddraw_from_ddraw1(This
),
416 dwFlags
, (LPDDSURFACEDESC2
)pDDSD
, &cbcontext
, EnumDisplayModesCallbackThunk
);
419 static HRESULT WINAPI
420 IDirectDraw2Impl_EnumDisplayModes(LPDIRECTDRAW2 This
, DWORD dwFlags
,
421 LPDDSURFACEDESC pDDSD
, LPVOID context
,
422 LPDDENUMMODESCALLBACK cb
)
424 struct displaymodescallback_context cbcontext
;
427 cbcontext
.context
= context
;
429 return IDirectDraw7_EnumDisplayModes((IDirectDraw7
*)ddraw_from_ddraw2(This
),
430 dwFlags
, (LPDDSURFACEDESC2
)pDDSD
, &cbcontext
, EnumDisplayModesCallbackThunk
);
433 static HRESULT WINAPI
434 IDirectDraw4Impl_EnumDisplayModes(LPDIRECTDRAW4 This
, DWORD dwFlags
,
435 LPDDSURFACEDESC2 pDDSD
, LPVOID context
,
436 LPDDENUMMODESCALLBACK2 cb
)
438 return IDirectDraw7_EnumDisplayModes((IDirectDraw7
*)ddraw_from_ddraw4(This
), dwFlags
, pDDSD
, context
, cb
);
441 struct surfacescallback_context
443 LPDDENUMSURFACESCALLBACK func
;
447 static HRESULT CALLBACK
448 EnumSurfacesCallbackThunk(LPDIRECTDRAWSURFACE7 pSurf
, LPDDSURFACEDESC2 pDDSD
,
451 struct surfacescallback_context
*cbcontext
= context
;
453 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
454 * IDirectDrawSurface vtable layout at the beginning */
455 return cbcontext
->func(
456 pSurf
? (IDirectDrawSurface
*)&((IDirectDrawSurfaceImpl
*)pSurf
)->IDirectDrawSurface3_vtbl
: NULL
,
457 (LPDDSURFACEDESC
)pDDSD
, cbcontext
->context
);
460 static HRESULT WINAPI
461 IDirectDrawImpl_EnumSurfaces(LPDIRECTDRAW This
, DWORD dwFlags
,
462 LPDDSURFACEDESC pDDSD
, LPVOID context
,
463 LPDDENUMSURFACESCALLBACK cb
)
465 struct surfacescallback_context cbcontext
;
468 cbcontext
.context
= context
;
470 return IDirectDraw7_EnumSurfaces((IDirectDraw7
*)ddraw_from_ddraw1(This
),
471 dwFlags
, (LPDDSURFACEDESC2
)pDDSD
, &cbcontext
, EnumSurfacesCallbackThunk
);
474 static HRESULT WINAPI
475 IDirectDraw2Impl_EnumSurfaces(LPDIRECTDRAW2 This
, DWORD dwFlags
,
476 LPDDSURFACEDESC pDDSD
, LPVOID context
,
477 LPDDENUMSURFACESCALLBACK cb
)
479 struct surfacescallback_context cbcontext
;
482 cbcontext
.context
= context
;
484 return IDirectDraw7_EnumSurfaces((IDirectDraw7
*)ddraw_from_ddraw2(This
),
485 dwFlags
, (LPDDSURFACEDESC2
)pDDSD
, &cbcontext
, EnumSurfacesCallbackThunk
);
488 static HRESULT WINAPI
489 IDirectDraw4Impl_EnumSurfaces(LPDIRECTDRAW4 This
, DWORD dwFlags
,
490 LPDDSURFACEDESC2 pDDSD
, LPVOID context
,
491 LPDDENUMSURFACESCALLBACK2 cb
)
493 return IDirectDraw7_EnumSurfaces((IDirectDraw7
*)ddraw_from_ddraw4(This
),
494 dwFlags
, pDDSD
, context
, (LPDDENUMSURFACESCALLBACK7
)cb
);
497 static HRESULT WINAPI
498 IDirectDrawImpl_FlipToGDISurface(LPDIRECTDRAW This
)
500 return IDirectDraw7_FlipToGDISurface((IDirectDraw7
*)ddraw_from_ddraw1(This
));
503 static HRESULT WINAPI
504 IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 This
)
506 return IDirectDraw7_FlipToGDISurface((IDirectDraw7
*)ddraw_from_ddraw2(This
));
509 static HRESULT WINAPI
510 IDirectDraw4Impl_FlipToGDISurface(LPDIRECTDRAW4 This
)
512 return IDirectDraw7_FlipToGDISurface((IDirectDraw7
*)ddraw_from_ddraw4(This
));
515 static HRESULT WINAPI
516 IDirectDrawImpl_GetCaps(LPDIRECTDRAW This
, LPDDCAPS pDDC1
, LPDDCAPS pDDC2
)
518 return IDirectDraw7_GetCaps((IDirectDraw7
*)ddraw_from_ddraw1(This
), pDDC1
, pDDC2
);
521 static HRESULT WINAPI
522 IDirectDraw2Impl_GetCaps(LPDIRECTDRAW2 This
, LPDDCAPS pDDC1
, LPDDCAPS pDDC2
)
524 return IDirectDraw7_GetCaps((IDirectDraw7
*)ddraw_from_ddraw2(This
), pDDC1
, pDDC2
);
527 static HRESULT WINAPI
528 IDirectDraw4Impl_GetCaps(LPDIRECTDRAW4 This
, LPDDCAPS pDDC1
, LPDDCAPS pDDC2
)
530 return IDirectDraw7_GetCaps((IDirectDraw7
*)ddraw_from_ddraw4(This
), pDDC1
, pDDC2
);
533 static HRESULT WINAPI
534 IDirectDrawImpl_GetDisplayMode(LPDIRECTDRAW This
, LPDDSURFACEDESC pDDSD
)
536 return IDirectDraw7_GetDisplayMode((IDirectDraw7
*)ddraw_from_ddraw1(This
), (LPDDSURFACEDESC2
)pDDSD
);
539 static HRESULT WINAPI
540 IDirectDraw2Impl_GetDisplayMode(LPDIRECTDRAW2 This
, LPDDSURFACEDESC pDDSD
)
542 return IDirectDraw7_GetDisplayMode((IDirectDraw7
*)ddraw_from_ddraw2(This
), (LPDDSURFACEDESC2
)pDDSD
);
545 static HRESULT WINAPI
546 IDirectDraw4Impl_GetDisplayMode(LPDIRECTDRAW4 This
, LPDDSURFACEDESC2 pDDSD
)
548 return IDirectDraw7_GetDisplayMode((IDirectDraw7
*)ddraw_from_ddraw4(This
), (LPDDSURFACEDESC2
)pDDSD
);
551 static HRESULT WINAPI
552 IDirectDrawImpl_GetFourCCCodes(LPDIRECTDRAW This
, LPDWORD lpNumCodes
,
555 return IDirectDraw7_GetFourCCCodes((IDirectDraw7
*)ddraw_from_ddraw1(This
), lpNumCodes
, lpCodes
);
558 static HRESULT WINAPI
559 IDirectDraw2Impl_GetFourCCCodes(LPDIRECTDRAW2 This
, LPDWORD lpNumCodes
,
562 return IDirectDraw7_GetFourCCCodes((IDirectDraw7
*)ddraw_from_ddraw2(This
), lpNumCodes
, lpCodes
);
565 static HRESULT WINAPI
566 IDirectDraw4Impl_GetFourCCCodes(LPDIRECTDRAW4 This
, LPDWORD lpNumCodes
,
569 return IDirectDraw7_GetFourCCCodes((IDirectDraw7
*)ddraw_from_ddraw4(This
), lpNumCodes
, lpCodes
);
572 static HRESULT WINAPI
573 IDirectDrawImpl_GetGDISurface(LPDIRECTDRAW This
, LPDIRECTDRAWSURFACE
*ppSurf
)
575 LPDIRECTDRAWSURFACE7 pSurf7
;
578 hr
= IDirectDraw7_GetGDISurface((IDirectDraw7
*)ddraw_from_ddraw1(This
), &pSurf7
);
580 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
581 * IDirectDrawSurface vtable layout at the beginning */
582 *ppSurf
= pSurf7
? (IDirectDrawSurface
*)&((IDirectDrawSurfaceImpl
*)pSurf7
)->IDirectDrawSurface3_vtbl
: NULL
;
587 static HRESULT WINAPI
588 IDirectDraw2Impl_GetGDISurface(LPDIRECTDRAW2 This
, LPDIRECTDRAWSURFACE
*ppSurf
)
590 LPDIRECTDRAWSURFACE7 pSurf7
;
593 hr
= IDirectDraw7_GetGDISurface((IDirectDraw7
*)ddraw_from_ddraw2(This
), &pSurf7
);
595 /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
596 * IDirectDrawSurface vtable layout at the beginning */
597 *ppSurf
= pSurf7
? (IDirectDrawSurface
*)&((IDirectDrawSurfaceImpl
*)pSurf7
)->IDirectDrawSurface3_vtbl
: NULL
;
602 static HRESULT WINAPI
603 IDirectDraw4Impl_GetGDISurface(LPDIRECTDRAW4 This
,
604 LPDIRECTDRAWSURFACE4
*ppSurf
)
606 return IDirectDraw7_GetGDISurface((IDirectDraw7
*)ddraw_from_ddraw4(This
), (LPDIRECTDRAWSURFACE7
*)ppSurf
);
609 static HRESULT WINAPI
610 IDirectDrawImpl_GetMonitorFrequency(LPDIRECTDRAW This
, LPDWORD pdwFreq
)
612 return IDirectDraw7_GetMonitorFrequency((IDirectDraw7
*)ddraw_from_ddraw1(This
), pdwFreq
);
615 static HRESULT WINAPI
616 IDirectDraw2Impl_GetMonitorFrequency(LPDIRECTDRAW2 This
, LPDWORD pdwFreq
)
618 return IDirectDraw7_GetMonitorFrequency((IDirectDraw7
*)ddraw_from_ddraw2(This
), pdwFreq
);
621 static HRESULT WINAPI
622 IDirectDraw4Impl_GetMonitorFrequency(LPDIRECTDRAW4 This
, LPDWORD pdwFreq
)
624 return IDirectDraw7_GetMonitorFrequency((IDirectDraw7
*)ddraw_from_ddraw4(This
), pdwFreq
);
627 static HRESULT WINAPI
628 IDirectDrawImpl_GetScanLine(LPDIRECTDRAW This
, LPDWORD pdwLine
)
630 return IDirectDraw7_GetScanLine((IDirectDraw7
*)ddraw_from_ddraw1(This
), pdwLine
);
633 static HRESULT WINAPI
634 IDirectDraw2Impl_GetScanLine(LPDIRECTDRAW2 This
, LPDWORD pdwLine
)
636 return IDirectDraw7_GetScanLine((IDirectDraw7
*)ddraw_from_ddraw2(This
), pdwLine
);
639 static HRESULT WINAPI
640 IDirectDraw4Impl_GetScanLine(LPDIRECTDRAW4 This
, LPDWORD pdwLine
)
642 return IDirectDraw7_GetScanLine((IDirectDraw7
*)ddraw_from_ddraw4(This
), pdwLine
);
645 static HRESULT WINAPI
646 IDirectDrawImpl_GetVerticalBlankStatus(LPDIRECTDRAW This
, LPBOOL lpbIsInVB
)
648 return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7
*)ddraw_from_ddraw1(This
), lpbIsInVB
);
651 static HRESULT WINAPI
652 IDirectDraw2Impl_GetVerticalBlankStatus(LPDIRECTDRAW2 This
, LPBOOL lpbIsInVB
)
654 return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7
*)ddraw_from_ddraw2(This
), lpbIsInVB
);
657 static HRESULT WINAPI
658 IDirectDraw4Impl_GetVerticalBlankStatus(LPDIRECTDRAW4 This
, LPBOOL lpbIsInVB
)
660 return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7
*)ddraw_from_ddraw4(This
), lpbIsInVB
);
663 static HRESULT WINAPI
664 IDirectDrawImpl_Initialize(LPDIRECTDRAW iface
, LPGUID pGUID
)
666 IDirectDrawImpl
*This
= ddraw_from_ddraw1(iface
);
669 ret_value
= IDirectDraw7_Initialize((IDirectDraw7
*)This
, pGUID
);
674 static HRESULT WINAPI
675 IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface
, LPGUID pGUID
)
677 IDirectDrawImpl
*This
= ddraw_from_ddraw2(iface
);
680 ret_value
= IDirectDraw7_Initialize((IDirectDraw7
*)This
, pGUID
);
685 static HRESULT WINAPI
686 IDirectDraw4Impl_Initialize(LPDIRECTDRAW4 iface
, LPGUID pGUID
)
688 IDirectDrawImpl
*This
= ddraw_from_ddraw4(iface
);
691 ret_value
= IDirectDraw7_Initialize((IDirectDraw7
*)This
, pGUID
);
697 static HRESULT WINAPI
698 IDirectDrawImpl_RestoreDisplayMode(LPDIRECTDRAW This
)
700 return IDirectDraw7_RestoreDisplayMode((IDirectDraw7
*)ddraw_from_ddraw1(This
));
703 static HRESULT WINAPI
704 IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 This
)
706 return IDirectDraw7_RestoreDisplayMode((IDirectDraw7
*)ddraw_from_ddraw2(This
));
709 static HRESULT WINAPI
710 IDirectDraw4Impl_RestoreDisplayMode(LPDIRECTDRAW4 This
)
712 return IDirectDraw7_RestoreDisplayMode((IDirectDraw7
*)ddraw_from_ddraw4(This
));
715 static HRESULT WINAPI
716 IDirectDrawImpl_SetCooperativeLevel(LPDIRECTDRAW This
, HWND hWnd
,
719 return IDirectDraw7_SetCooperativeLevel((IDirectDraw7
*)ddraw_from_ddraw1(This
), hWnd
, dwFlags
);
722 static HRESULT WINAPI
723 IDirectDraw2Impl_SetCooperativeLevel(LPDIRECTDRAW2 This
, HWND hWnd
,
726 return IDirectDraw7_SetCooperativeLevel((IDirectDraw7
*)ddraw_from_ddraw2(This
), hWnd
, dwFlags
);
729 static HRESULT WINAPI
730 IDirectDraw4Impl_SetCooperativeLevel(LPDIRECTDRAW4 This
, HWND hWnd
,
733 return IDirectDraw7_SetCooperativeLevel((IDirectDraw7
*)ddraw_from_ddraw4(This
), hWnd
, dwFlags
);
736 static HRESULT WINAPI
737 IDirectDrawImpl_SetDisplayMode(LPDIRECTDRAW This
, DWORD a
, DWORD b
, DWORD c
)
739 return IDirectDraw7_SetDisplayMode((IDirectDraw7
*)ddraw_from_ddraw1(This
), a
, b
, c
, 0, 0);
742 static HRESULT WINAPI
743 IDirectDraw2Impl_SetDisplayMode(LPDIRECTDRAW2 This
, DWORD a
, DWORD b
, DWORD c
,
746 return IDirectDraw7_SetDisplayMode((IDirectDraw7
*)ddraw_from_ddraw2(This
), a
, b
, c
, d
, e
);
749 static HRESULT WINAPI
750 IDirectDraw4Impl_SetDisplayMode(LPDIRECTDRAW4 This
, DWORD a
, DWORD b
, DWORD c
,
753 return IDirectDraw7_SetDisplayMode((IDirectDraw7
*)ddraw_from_ddraw4(This
), a
, b
, c
, d
, e
);
756 static HRESULT WINAPI
757 IDirectDrawImpl_WaitForVerticalBlank(LPDIRECTDRAW This
, DWORD dwFlags
,
760 return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7
*)ddraw_from_ddraw1(This
), dwFlags
, hEvent
);
763 static HRESULT WINAPI
764 IDirectDraw2Impl_WaitForVerticalBlank(LPDIRECTDRAW2 This
, DWORD dwFlags
,
767 return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7
*)ddraw_from_ddraw2(This
), dwFlags
, hEvent
);
770 static HRESULT WINAPI
771 IDirectDraw4Impl_WaitForVerticalBlank(LPDIRECTDRAW4 This
, DWORD dwFlags
,
774 return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7
*)ddraw_from_ddraw4(This
), dwFlags
, hEvent
);
777 static HRESULT WINAPI
778 IDirectDraw2Impl_GetAvailableVidMem(LPDIRECTDRAW2 This
, LPDDSCAPS pCaps
,
779 LPDWORD pdwTotal
, LPDWORD pdwFree
)
782 DDRAW_Convert_DDSCAPS_1_To_2(pCaps
, &Caps2
);
784 return IDirectDraw7_GetAvailableVidMem((IDirectDraw7
*)ddraw_from_ddraw2(This
), &Caps2
, pdwTotal
, pdwFree
);
787 static HRESULT WINAPI
788 IDirectDraw4Impl_GetAvailableVidMem(LPDIRECTDRAW4 This
, LPDDSCAPS2 pCaps
,
789 LPDWORD pdwTotal
, LPDWORD pdwFree
)
791 return IDirectDraw7_GetAvailableVidMem((IDirectDraw7
*)ddraw_from_ddraw4(This
), pCaps
, pdwTotal
, pdwFree
);
794 static HRESULT WINAPI
795 IDirectDraw4Impl_GetSurfaceFromDC(LPDIRECTDRAW4 This
, HDC hDC
,
796 LPDIRECTDRAWSURFACE4
*pSurf
)
798 return IDirectDraw7_GetSurfaceFromDC((IDirectDraw7
*)ddraw_from_ddraw4(This
), hDC
, (LPDIRECTDRAWSURFACE7
*)pSurf
);
801 static HRESULT WINAPI
802 IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 This
)
804 return IDirectDraw7_RestoreAllSurfaces((IDirectDraw7
*)ddraw_from_ddraw4(This
));
807 static HRESULT WINAPI
808 IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 This
)
810 return IDirectDraw7_TestCooperativeLevel((IDirectDraw7
*)ddraw_from_ddraw4(This
));
813 static HRESULT WINAPI
814 IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 This
,
815 LPDDDEVICEIDENTIFIER pDDDI
, DWORD dwFlags
)
817 DDDEVICEIDENTIFIER2 DDDI2
;
820 hr
= IDirectDraw7_GetDeviceIdentifier((IDirectDraw7
*)ddraw_from_ddraw4(This
), &DDDI2
, dwFlags
);
822 DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(&DDDI2
, pDDDI
);
827 const IDirectDrawVtbl IDirectDraw1_Vtbl
=
829 IDirectDrawImpl_QueryInterface
,
830 IDirectDrawImpl_AddRef
,
831 IDirectDrawImpl_Release
,
832 IDirectDrawImpl_Compact
,
833 IDirectDrawImpl_CreateClipper
,
834 IDirectDrawImpl_CreatePalette
,
835 IDirectDrawImpl_CreateSurface
,
836 IDirectDrawImpl_DuplicateSurface
,
837 IDirectDrawImpl_EnumDisplayModes
,
838 IDirectDrawImpl_EnumSurfaces
,
839 IDirectDrawImpl_FlipToGDISurface
,
840 IDirectDrawImpl_GetCaps
,
841 IDirectDrawImpl_GetDisplayMode
,
842 IDirectDrawImpl_GetFourCCCodes
,
843 IDirectDrawImpl_GetGDISurface
,
844 IDirectDrawImpl_GetMonitorFrequency
,
845 IDirectDrawImpl_GetScanLine
,
846 IDirectDrawImpl_GetVerticalBlankStatus
,
847 IDirectDrawImpl_Initialize
,
848 IDirectDrawImpl_RestoreDisplayMode
,
849 IDirectDrawImpl_SetCooperativeLevel
,
850 IDirectDrawImpl_SetDisplayMode
,
851 IDirectDrawImpl_WaitForVerticalBlank
,
854 const IDirectDraw2Vtbl IDirectDraw2_Vtbl
=
856 IDirectDraw2Impl_QueryInterface
,
857 IDirectDraw2Impl_AddRef
,
858 IDirectDraw2Impl_Release
,
859 IDirectDraw2Impl_Compact
,
860 IDirectDraw2Impl_CreateClipper
,
861 IDirectDraw2Impl_CreatePalette
,
862 IDirectDraw2Impl_CreateSurface
,
863 IDirectDraw2Impl_DuplicateSurface
,
864 IDirectDraw2Impl_EnumDisplayModes
,
865 IDirectDraw2Impl_EnumSurfaces
,
866 IDirectDraw2Impl_FlipToGDISurface
,
867 IDirectDraw2Impl_GetCaps
,
868 IDirectDraw2Impl_GetDisplayMode
,
869 IDirectDraw2Impl_GetFourCCCodes
,
870 IDirectDraw2Impl_GetGDISurface
,
871 IDirectDraw2Impl_GetMonitorFrequency
,
872 IDirectDraw2Impl_GetScanLine
,
873 IDirectDraw2Impl_GetVerticalBlankStatus
,
874 IDirectDraw2Impl_Initialize
,
875 IDirectDraw2Impl_RestoreDisplayMode
,
876 IDirectDraw2Impl_SetCooperativeLevel
,
877 IDirectDraw2Impl_SetDisplayMode
,
878 IDirectDraw2Impl_WaitForVerticalBlank
,
879 IDirectDraw2Impl_GetAvailableVidMem
882 const IDirectDraw4Vtbl IDirectDraw4_Vtbl
=
884 IDirectDraw4Impl_QueryInterface
,
885 IDirectDraw4Impl_AddRef
,
886 IDirectDraw4Impl_Release
,
887 IDirectDraw4Impl_Compact
,
888 IDirectDraw4Impl_CreateClipper
,
889 IDirectDraw4Impl_CreatePalette
,
890 IDirectDraw4Impl_CreateSurface
,
891 IDirectDraw4Impl_DuplicateSurface
,
892 IDirectDraw4Impl_EnumDisplayModes
,
893 IDirectDraw4Impl_EnumSurfaces
,
894 IDirectDraw4Impl_FlipToGDISurface
,
895 IDirectDraw4Impl_GetCaps
,
896 IDirectDraw4Impl_GetDisplayMode
,
897 IDirectDraw4Impl_GetFourCCCodes
,
898 IDirectDraw4Impl_GetGDISurface
,
899 IDirectDraw4Impl_GetMonitorFrequency
,
900 IDirectDraw4Impl_GetScanLine
,
901 IDirectDraw4Impl_GetVerticalBlankStatus
,
902 IDirectDraw4Impl_Initialize
,
903 IDirectDraw4Impl_RestoreDisplayMode
,
904 IDirectDraw4Impl_SetCooperativeLevel
,
905 IDirectDraw4Impl_SetDisplayMode
,
906 IDirectDraw4Impl_WaitForVerticalBlank
,
907 IDirectDraw4Impl_GetAvailableVidMem
,
908 IDirectDraw4Impl_GetSurfaceFromDC
,
909 IDirectDraw4Impl_RestoreAllSurfaces
,
910 IDirectDraw4Impl_TestCooperativeLevel
,
911 IDirectDraw4Impl_GetDeviceIdentifier