|  | /* Direct Draw Thunks and old vtables | 
|  | * Copyright 2000 TransGaming Technologies Inc. | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License as published by the Free Software Foundation; either | 
|  | * version 2.1 of the License, or (at your option) any later version. | 
|  | * | 
|  | * This library is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
|  | */ | 
|  | #include <stdarg.h> | 
|  |  | 
|  | #include "windef.h" | 
|  | #include "winbase.h" | 
|  | #include "wingdi.h" | 
|  | #include "ddraw.h" | 
|  | #include "ddraw_private.h" | 
|  | #include "ddcomimpl.h" | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_QueryInterface(LPDIRECTDRAW This, REFIID iid, LPVOID *ppObj) | 
|  | { | 
|  | return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, This), | 
|  | iid, ppObj); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_QueryInterface(LPDIRECTDRAW2 This, REFIID iid, LPVOID *ppObj) | 
|  | { | 
|  | return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, This), | 
|  | iid, ppObj); | 
|  | } | 
|  |  | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_QueryInterface(LPDIRECTDRAW4 This, REFIID iid, LPVOID *ppObj) | 
|  | { | 
|  | return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, This), | 
|  | iid, ppObj); | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI | 
|  | IDirectDrawImpl_AddRef(LPDIRECTDRAW This) | 
|  | { | 
|  | return IDirectDraw7_AddRef(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI | 
|  | IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 This) | 
|  | { | 
|  | return IDirectDraw7_AddRef(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI | 
|  | IDirectDraw4Impl_AddRef(LPDIRECTDRAW4 This) | 
|  | { | 
|  | return IDirectDraw7_AddRef(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI | 
|  | IDirectDrawImpl_Release(LPDIRECTDRAW This) | 
|  | { | 
|  | return IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI | 
|  | IDirectDraw2Impl_Release(LPDIRECTDRAW2 This) | 
|  | { | 
|  | return IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI | 
|  | IDirectDraw4Impl_Release(LPDIRECTDRAW4 This) | 
|  | { | 
|  | return IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_Compact(LPDIRECTDRAW This) | 
|  | { | 
|  | return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_Compact(LPDIRECTDRAW2 This) | 
|  | { | 
|  | return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_Compact(LPDIRECTDRAW4 This) | 
|  | { | 
|  | return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_CreateClipper(LPDIRECTDRAW This, DWORD dwFlags, | 
|  | LPDIRECTDRAWCLIPPER *ppClipper, | 
|  | IUnknown *pUnkOuter) | 
|  | { | 
|  | return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | dwFlags, ppClipper, pUnkOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_CreateClipper(LPDIRECTDRAW2 This, DWORD dwFlags, | 
|  | LPDIRECTDRAWCLIPPER *ppClipper, | 
|  | IUnknown *pUnkOuter) | 
|  | { | 
|  | return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | dwFlags, ppClipper, pUnkOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_CreateClipper(LPDIRECTDRAW4 This, DWORD dwFlags, | 
|  | LPDIRECTDRAWCLIPPER *ppClipper, | 
|  | IUnknown *pUnkOuter) | 
|  | { | 
|  | return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | dwFlags, ppClipper, pUnkOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_CreatePalette(LPDIRECTDRAW This, DWORD dwFlags, | 
|  | LPPALETTEENTRY pEntries, | 
|  | LPDIRECTDRAWPALETTE *ppPalette, | 
|  | IUnknown *pUnkOuter) | 
|  | { | 
|  | return IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | dwFlags, pEntries, ppPalette, pUnkOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_CreatePalette(LPDIRECTDRAW2 This, DWORD dwFlags, | 
|  | LPPALETTEENTRY pEntries, | 
|  | LPDIRECTDRAWPALETTE *ppPalette, | 
|  | IUnknown *pUnkOuter) | 
|  | { | 
|  | return IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | dwFlags, pEntries, ppPalette, pUnkOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_CreatePalette(LPDIRECTDRAW4 This, DWORD dwFlags, | 
|  | LPPALETTEENTRY pEntries, | 
|  | LPDIRECTDRAWPALETTE *ppPalette, | 
|  | IUnknown *pUnkOuter) | 
|  | { | 
|  | return IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | dwFlags, pEntries, ppPalette, pUnkOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc, | 
|  | LPDIRECTDRAWSURFACE *ppSurface, | 
|  | IUnknown *pUnkOuter) | 
|  | { | 
|  | LPDIRECTDRAWSURFACE7 pSurface7; | 
|  | HRESULT hr; | 
|  |  | 
|  | /* the LPDDSURFACEDESC -> LPDDSURFACEDESC2 conversion should be ok, | 
|  | * since the data layout is the same */ | 
|  | hr = IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter); | 
|  |  | 
|  | /* This coercion is safe, since the IDirectDrawSurface3 vtable has the | 
|  | * IDirectDrawSurface vtable layout at the beginning  */ | 
|  | *ppSurface = (LPDIRECTDRAWSURFACE) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, | 
|  | IDirectDrawSurface7, IDirectDrawSurface3, | 
|  | pSurface7); | 
|  |  | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc, | 
|  | LPDIRECTDRAWSURFACE *ppSurface, | 
|  | IUnknown *pUnkOuter) | 
|  | { | 
|  | LPDIRECTDRAWSURFACE7 pSurface7; | 
|  | HRESULT hr; | 
|  |  | 
|  | hr = IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter); | 
|  |  | 
|  | /* This coercion is safe, since the IDirectDrawSurface3 vtable has the | 
|  | * IDirectDrawSurface vtable layout at the beginning  */ | 
|  | *ppSurface = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, | 
|  | IDirectDrawSurface7, IDirectDrawSurface3, | 
|  | pSurface7); | 
|  |  | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_CreateSurface(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pSDesc, | 
|  | LPDIRECTDRAWSURFACE4 *ppSurface, | 
|  | IUnknown *pUnkOuter) | 
|  | { | 
|  | return IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | pSDesc, | 
|  | (LPDIRECTDRAWSURFACE7 *)ppSurface, | 
|  | pUnkOuter); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_DuplicateSurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE pSrc, | 
|  | LPDIRECTDRAWSURFACE *ppDst) | 
|  | { | 
|  | LPDIRECTDRAWSURFACE7 pDst7; | 
|  | HRESULT hr; | 
|  |  | 
|  | hr = IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, This), | 
|  | COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, | 
|  | IDirectDrawSurface3, | 
|  | IDirectDrawSurface7, | 
|  | pSrc), | 
|  | &pDst7); | 
|  |  | 
|  | /* This coercion is safe, since the IDirectDrawSurface3 vtable has the | 
|  | * IDirectDrawSurface vtable layout at the beginning  */ | 
|  | *ppDst = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7, | 
|  | IDirectDrawSurface3, pDst7); | 
|  |  | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_DuplicateSurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE pSrc, | 
|  | LPDIRECTDRAWSURFACE *ppDst) | 
|  | { | 
|  | LPDIRECTDRAWSURFACE7 pDst7; | 
|  | HRESULT hr; | 
|  |  | 
|  | hr = IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, This), | 
|  | COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, | 
|  | IDirectDrawSurface3, | 
|  | IDirectDrawSurface7, | 
|  | pSrc), | 
|  | &pDst7); | 
|  |  | 
|  | /* This coercion is safe, since the IDirectDrawSurface3 vtable has the | 
|  | * IDirectDrawSurface vtable layout at the beginning  */ | 
|  | *ppDst = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7, | 
|  | IDirectDrawSurface3, pDst7); | 
|  |  | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_DuplicateSurface(LPDIRECTDRAW4 This, | 
|  | LPDIRECTDRAWSURFACE4 pSrc, | 
|  | LPDIRECTDRAWSURFACE4 *ppDst) | 
|  | { | 
|  | return IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | (LPDIRECTDRAWSURFACE7)pSrc, | 
|  | (LPDIRECTDRAWSURFACE7 *)ppDst); | 
|  | } | 
|  |  | 
|  | struct displaymodescallback_context | 
|  | { | 
|  | LPDDENUMMODESCALLBACK func; | 
|  | LPVOID context; | 
|  | }; | 
|  |  | 
|  | static HRESULT CALLBACK | 
|  | EnumDisplayModesCallbackThunk(LPDDSURFACEDESC2 pDDSD2, LPVOID context) | 
|  | { | 
|  | DDSURFACEDESC DDSD; | 
|  | struct displaymodescallback_context *cbcontext = context; | 
|  |  | 
|  | memcpy(&DDSD,pDDSD2,sizeof(DDSD)); | 
|  | DDSD.dwSize = sizeof(DDSD); | 
|  |  | 
|  | return cbcontext->func(&DDSD, cbcontext->context); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_EnumDisplayModes(LPDIRECTDRAW This, DWORD dwFlags, | 
|  | LPDDSURFACEDESC pDDSD, LPVOID context, | 
|  | LPDDENUMMODESCALLBACK cb) | 
|  | { | 
|  | struct displaymodescallback_context cbcontext; | 
|  |  | 
|  | cbcontext.func    = cb; | 
|  | cbcontext.context = context; | 
|  |  | 
|  | return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, | 
|  | EnumDisplayModesCallbackThunk); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_EnumDisplayModes(LPDIRECTDRAW2 This, DWORD dwFlags, | 
|  | LPDDSURFACEDESC pDDSD, LPVOID context, | 
|  | LPDDENUMMODESCALLBACK cb) | 
|  | { | 
|  | struct displaymodescallback_context cbcontext; | 
|  |  | 
|  | cbcontext.func    = cb; | 
|  | cbcontext.context = context; | 
|  |  | 
|  | return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, | 
|  | EnumDisplayModesCallbackThunk); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_EnumDisplayModes(LPDIRECTDRAW4 This, DWORD dwFlags, | 
|  | LPDDSURFACEDESC2 pDDSD, LPVOID context, | 
|  | LPDDENUMMODESCALLBACK2 cb) | 
|  | { | 
|  | return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | dwFlags, pDDSD, context, cb); | 
|  | } | 
|  |  | 
|  | struct surfacescallback_context | 
|  | { | 
|  | LPDDENUMSURFACESCALLBACK func; | 
|  | LPVOID context; | 
|  | }; | 
|  |  | 
|  | static HRESULT CALLBACK | 
|  | EnumSurfacesCallbackThunk(LPDIRECTDRAWSURFACE7 pSurf, LPDDSURFACEDESC2 pDDSD, | 
|  | LPVOID context) | 
|  | { | 
|  | struct surfacescallback_context *cbcontext = context; | 
|  |  | 
|  | /* This coercion is safe, since the IDirectDrawSurface3 vtable has the | 
|  | * IDirectDrawSurface vtable layout at the beginning  */ | 
|  | return cbcontext->func((LPDIRECTDRAWSURFACE) | 
|  | COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, | 
|  | IDirectDrawSurface7, | 
|  | IDirectDrawSurface3, pSurf), | 
|  | (LPDDSURFACEDESC)pDDSD, cbcontext->context); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_EnumSurfaces(LPDIRECTDRAW This, DWORD dwFlags, | 
|  | LPDDSURFACEDESC pDDSD, LPVOID context, | 
|  | LPDDENUMSURFACESCALLBACK cb) | 
|  | { | 
|  | struct surfacescallback_context cbcontext; | 
|  |  | 
|  | cbcontext.func    = cb; | 
|  | cbcontext.context = context; | 
|  |  | 
|  | return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, This), | 
|  | dwFlags, (LPDDSURFACEDESC2)pDDSD, | 
|  | &cbcontext, EnumSurfacesCallbackThunk); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_EnumSurfaces(LPDIRECTDRAW2 This, DWORD dwFlags, | 
|  | LPDDSURFACEDESC pDDSD, LPVOID context, | 
|  | LPDDENUMSURFACESCALLBACK cb) | 
|  | { | 
|  | struct surfacescallback_context cbcontext; | 
|  |  | 
|  | cbcontext.func    = cb; | 
|  | cbcontext.context = context; | 
|  |  | 
|  | return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, This), | 
|  | dwFlags, (LPDDSURFACEDESC2)pDDSD, | 
|  | &cbcontext, EnumSurfacesCallbackThunk); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_EnumSurfaces(LPDIRECTDRAW4 This, DWORD dwFlags, | 
|  | LPDDSURFACEDESC2 pDDSD, LPVOID context, | 
|  | LPDDENUMSURFACESCALLBACK2 cb) | 
|  | { | 
|  | return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, This), | 
|  | dwFlags, pDDSD, context, | 
|  | (LPDDENUMSURFACESCALLBACK7)cb); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_FlipToGDISurface(LPDIRECTDRAW This) | 
|  | { | 
|  | return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 This) | 
|  | { | 
|  | return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_FlipToGDISurface(LPDIRECTDRAW4 This) | 
|  | { | 
|  | return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_GetCaps(LPDIRECTDRAW This, LPDDCAPS pDDC1, LPDDCAPS pDDC2) | 
|  | { | 
|  | return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, IDirectDraw7, | 
|  | This), pDDC1, pDDC2); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_GetCaps(LPDIRECTDRAW2 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2) | 
|  | { | 
|  | return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, IDirectDraw7, | 
|  | This), pDDC1, pDDC2); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_GetCaps(LPDIRECTDRAW4 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2) | 
|  | { | 
|  | return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, IDirectDraw7, | 
|  | This), pDDC1, pDDC2); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_GetDisplayMode(LPDIRECTDRAW This, LPDDSURFACEDESC pDDSD) | 
|  | { | 
|  | return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, This), | 
|  | (LPDDSURFACEDESC2)pDDSD); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_GetDisplayMode(LPDIRECTDRAW2 This, LPDDSURFACEDESC pDDSD) | 
|  | { | 
|  | return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, This), | 
|  | (LPDDSURFACEDESC2)pDDSD); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_GetDisplayMode(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pDDSD) | 
|  | { | 
|  | return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, This), | 
|  | pDDSD); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_GetFourCCCodes(LPDIRECTDRAW This, LPDWORD lpNumCodes, | 
|  | LPDWORD lpCodes) | 
|  | { | 
|  | return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | lpNumCodes, lpCodes); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_GetFourCCCodes(LPDIRECTDRAW2 This, LPDWORD lpNumCodes, | 
|  | LPDWORD lpCodes) | 
|  | { | 
|  | return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | lpNumCodes, lpCodes); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_GetFourCCCodes(LPDIRECTDRAW4 This, LPDWORD lpNumCodes, | 
|  | LPDWORD lpCodes) | 
|  | { | 
|  | return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | lpNumCodes, lpCodes); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_GetGDISurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE *ppSurf) | 
|  | { | 
|  | LPDIRECTDRAWSURFACE7 pSurf7; | 
|  | HRESULT hr; | 
|  |  | 
|  | hr = IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This), &pSurf7); | 
|  |  | 
|  | /* This coercion is safe, since the IDirectDrawSurface3 vtable has the | 
|  | * IDirectDrawSurface vtable layout at the beginning  */ | 
|  | *ppSurf = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7, | 
|  | IDirectDrawSurface3, pSurf7); | 
|  |  | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_GetGDISurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE *ppSurf) | 
|  | { | 
|  | LPDIRECTDRAWSURFACE7 pSurf7; | 
|  | HRESULT hr; | 
|  |  | 
|  | hr = IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), &pSurf7); | 
|  |  | 
|  | /* This coercion is safe, since the IDirectDrawSurface3 vtable has the | 
|  | * IDirectDrawSurface vtable layout at the beginning  */ | 
|  | *ppSurf = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7, | 
|  | IDirectDrawSurface3, pSurf7); | 
|  |  | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_GetGDISurface(LPDIRECTDRAW4 This, | 
|  | LPDIRECTDRAWSURFACE4 *ppSurf) | 
|  | { | 
|  | return IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | (LPDIRECTDRAWSURFACE7 *)ppSurf); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_GetMonitorFrequency(LPDIRECTDRAW This, LPDWORD pdwFreq) | 
|  | { | 
|  | return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | pdwFreq); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_GetMonitorFrequency(LPDIRECTDRAW2 This, LPDWORD pdwFreq) | 
|  | { | 
|  | return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | pdwFreq); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_GetMonitorFrequency(LPDIRECTDRAW4 This, LPDWORD pdwFreq) | 
|  | { | 
|  | return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | pdwFreq); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_GetScanLine(LPDIRECTDRAW This, LPDWORD pdwLine) | 
|  | { | 
|  | return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This), pdwLine); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_GetScanLine(LPDIRECTDRAW2 This, LPDWORD pdwLine) | 
|  | { | 
|  | return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), pdwLine); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_GetScanLine(LPDIRECTDRAW4 This, LPDWORD pdwLine) | 
|  | { | 
|  | return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), pdwLine); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_GetVerticalBlankStatus(LPDIRECTDRAW This, LPBOOL lpbIsInVB) | 
|  | { | 
|  | return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | lpbIsInVB); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_GetVerticalBlankStatus(LPDIRECTDRAW2 This, LPBOOL lpbIsInVB) | 
|  | { | 
|  | return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | lpbIsInVB); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_GetVerticalBlankStatus(LPDIRECTDRAW4 This, LPBOOL lpbIsInVB) | 
|  | { | 
|  | return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | lpbIsInVB); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_Initialize(LPDIRECTDRAW iface, LPGUID pGUID) | 
|  | { | 
|  | ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw, iface); | 
|  | HRESULT ret_value; | 
|  |  | 
|  | ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID); | 
|  |  | 
|  | /* Overwrite the falsely set 'DIRECTDRAW7' flag */ | 
|  | This->local.dwLocalFlags &= ~DDRAWILCL_DIRECTDRAW7; | 
|  |  | 
|  | return ret_value; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, LPGUID pGUID) | 
|  | { | 
|  | ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw2, iface); | 
|  | HRESULT ret_value; | 
|  |  | 
|  | ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID); | 
|  |  | 
|  | /* Overwrite the falsely set 'DIRECTDRAW7' flag */ | 
|  | This->local.dwLocalFlags &= ~DDRAWILCL_DIRECTDRAW7; | 
|  |  | 
|  | return ret_value; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_Initialize(LPDIRECTDRAW4 iface, LPGUID pGUID) | 
|  | { | 
|  | ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw4, iface); | 
|  | HRESULT ret_value; | 
|  |  | 
|  | ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID); | 
|  |  | 
|  | /* Overwrite the falsely set 'DIRECTDRAW7' flag */ | 
|  | This->local.dwLocalFlags &= ~DDRAWILCL_DIRECTDRAW7; | 
|  |  | 
|  | return ret_value; | 
|  | } | 
|  |  | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_RestoreDisplayMode(LPDIRECTDRAW This) | 
|  | { | 
|  | return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 This) | 
|  | { | 
|  | return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_RestoreDisplayMode(LPDIRECTDRAW4 This) | 
|  | { | 
|  | return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_SetCooperativeLevel(LPDIRECTDRAW This, HWND hWnd, | 
|  | DWORD dwFlags) | 
|  | { | 
|  | return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | hWnd, dwFlags); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_SetCooperativeLevel(LPDIRECTDRAW2 This, HWND hWnd, | 
|  | DWORD dwFlags) | 
|  | { | 
|  | return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | hWnd, dwFlags); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_SetCooperativeLevel(LPDIRECTDRAW4 This, HWND hWnd, | 
|  | DWORD dwFlags) | 
|  | { | 
|  | return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | hWnd, dwFlags); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_SetDisplayMode(LPDIRECTDRAW This, DWORD a, DWORD b, DWORD c) | 
|  | { | 
|  | return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | a, b, c, 0, 0); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_SetDisplayMode(LPDIRECTDRAW2 This, DWORD a, DWORD b, DWORD c, | 
|  | DWORD d, DWORD e) | 
|  | { | 
|  | return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | a, b, c, d, e); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_SetDisplayMode(LPDIRECTDRAW4 This, DWORD a, DWORD b, DWORD c, | 
|  | DWORD d, DWORD e) | 
|  | { | 
|  | return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | a, b, c, d, e); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDrawImpl_WaitForVerticalBlank(LPDIRECTDRAW This, DWORD dwFlags, | 
|  | HANDLE hEvent) | 
|  | { | 
|  | return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | dwFlags, hEvent); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_WaitForVerticalBlank(LPDIRECTDRAW2 This, DWORD dwFlags, | 
|  | HANDLE hEvent) | 
|  | { | 
|  | return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | dwFlags, hEvent); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_WaitForVerticalBlank(LPDIRECTDRAW4 This, DWORD dwFlags, | 
|  | HANDLE hEvent) | 
|  | { | 
|  | return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | dwFlags, hEvent); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw2Impl_GetAvailableVidMem(LPDIRECTDRAW2 This, LPDDSCAPS pCaps, | 
|  | LPDWORD pdwTotal, LPDWORD pdwFree) | 
|  | { | 
|  | DDSCAPS2 Caps2; | 
|  | DDRAW_Convert_DDSCAPS_1_To_2(pCaps, &Caps2); | 
|  |  | 
|  | return IDirectDraw7_GetAvailableVidMem(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw2, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | &Caps2, pdwTotal, pdwFree); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_GetAvailableVidMem(LPDIRECTDRAW4 This, LPDDSCAPS2 pCaps, | 
|  | LPDWORD pdwTotal, LPDWORD pdwFree) | 
|  | { | 
|  | return IDirectDraw7_GetAvailableVidMem(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | pCaps, pdwTotal, pdwFree); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_GetSurfaceFromDC(LPDIRECTDRAW4 This, HDC hDC, | 
|  | LPDIRECTDRAWSURFACE4 *pSurf) | 
|  | { | 
|  | return IDirectDraw7_GetSurfaceFromDC(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | hDC, (LPDIRECTDRAWSURFACE7 *)pSurf); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 This) | 
|  | { | 
|  | return IDirectDraw7_RestoreAllSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 This) | 
|  | { | 
|  | return IDirectDraw7_TestCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This)); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI | 
|  | IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 This, | 
|  | LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags) | 
|  | { | 
|  | DDDEVICEIDENTIFIER2 DDDI2; | 
|  | HRESULT hr; | 
|  |  | 
|  | hr = IDirectDraw7_GetDeviceIdentifier(COM_INTERFACE_CAST(IDirectDrawImpl, | 
|  | IDirectDraw4, | 
|  | IDirectDraw7, | 
|  | This), | 
|  | &DDDI2, dwFlags); | 
|  |  | 
|  | DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(&DDDI2, pDDDI); | 
|  |  | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | const IDirectDrawVtbl DDRAW_IDirectDraw_VTable = | 
|  | { | 
|  | IDirectDrawImpl_QueryInterface, | 
|  | IDirectDrawImpl_AddRef, | 
|  | IDirectDrawImpl_Release, | 
|  | IDirectDrawImpl_Compact, | 
|  | IDirectDrawImpl_CreateClipper, | 
|  | IDirectDrawImpl_CreatePalette, | 
|  | IDirectDrawImpl_CreateSurface, | 
|  | IDirectDrawImpl_DuplicateSurface, | 
|  | IDirectDrawImpl_EnumDisplayModes, | 
|  | IDirectDrawImpl_EnumSurfaces, | 
|  | IDirectDrawImpl_FlipToGDISurface, | 
|  | IDirectDrawImpl_GetCaps, | 
|  | IDirectDrawImpl_GetDisplayMode, | 
|  | IDirectDrawImpl_GetFourCCCodes, | 
|  | IDirectDrawImpl_GetGDISurface, | 
|  | IDirectDrawImpl_GetMonitorFrequency, | 
|  | IDirectDrawImpl_GetScanLine, | 
|  | IDirectDrawImpl_GetVerticalBlankStatus, | 
|  | IDirectDrawImpl_Initialize, | 
|  | IDirectDrawImpl_RestoreDisplayMode, | 
|  | IDirectDrawImpl_SetCooperativeLevel, | 
|  | IDirectDrawImpl_SetDisplayMode, | 
|  | IDirectDrawImpl_WaitForVerticalBlank, | 
|  | }; | 
|  |  | 
|  | const IDirectDraw2Vtbl DDRAW_IDirectDraw2_VTable = | 
|  | { | 
|  | IDirectDraw2Impl_QueryInterface, | 
|  | IDirectDraw2Impl_AddRef, | 
|  | IDirectDraw2Impl_Release, | 
|  | IDirectDraw2Impl_Compact, | 
|  | IDirectDraw2Impl_CreateClipper, | 
|  | IDirectDraw2Impl_CreatePalette, | 
|  | IDirectDraw2Impl_CreateSurface, | 
|  | IDirectDraw2Impl_DuplicateSurface, | 
|  | IDirectDraw2Impl_EnumDisplayModes, | 
|  | IDirectDraw2Impl_EnumSurfaces, | 
|  | IDirectDraw2Impl_FlipToGDISurface, | 
|  | IDirectDraw2Impl_GetCaps, | 
|  | IDirectDraw2Impl_GetDisplayMode, | 
|  | IDirectDraw2Impl_GetFourCCCodes, | 
|  | IDirectDraw2Impl_GetGDISurface, | 
|  | IDirectDraw2Impl_GetMonitorFrequency, | 
|  | IDirectDraw2Impl_GetScanLine, | 
|  | IDirectDraw2Impl_GetVerticalBlankStatus, | 
|  | IDirectDraw2Impl_Initialize, | 
|  | IDirectDraw2Impl_RestoreDisplayMode, | 
|  | IDirectDraw2Impl_SetCooperativeLevel, | 
|  | IDirectDraw2Impl_SetDisplayMode, | 
|  | IDirectDraw2Impl_WaitForVerticalBlank, | 
|  | IDirectDraw2Impl_GetAvailableVidMem | 
|  | }; | 
|  |  | 
|  | const IDirectDraw4Vtbl DDRAW_IDirectDraw4_VTable = | 
|  | { | 
|  | IDirectDraw4Impl_QueryInterface, | 
|  | IDirectDraw4Impl_AddRef, | 
|  | IDirectDraw4Impl_Release, | 
|  | IDirectDraw4Impl_Compact, | 
|  | IDirectDraw4Impl_CreateClipper, | 
|  | IDirectDraw4Impl_CreatePalette, | 
|  | IDirectDraw4Impl_CreateSurface, | 
|  | IDirectDraw4Impl_DuplicateSurface, | 
|  | IDirectDraw4Impl_EnumDisplayModes, | 
|  | IDirectDraw4Impl_EnumSurfaces, | 
|  | IDirectDraw4Impl_FlipToGDISurface, | 
|  | IDirectDraw4Impl_GetCaps, | 
|  | IDirectDraw4Impl_GetDisplayMode, | 
|  | IDirectDraw4Impl_GetFourCCCodes, | 
|  | IDirectDraw4Impl_GetGDISurface, | 
|  | IDirectDraw4Impl_GetMonitorFrequency, | 
|  | IDirectDraw4Impl_GetScanLine, | 
|  | IDirectDraw4Impl_GetVerticalBlankStatus, | 
|  | IDirectDraw4Impl_Initialize, | 
|  | IDirectDraw4Impl_RestoreDisplayMode, | 
|  | IDirectDraw4Impl_SetCooperativeLevel, | 
|  | IDirectDraw4Impl_SetDisplayMode, | 
|  | IDirectDraw4Impl_WaitForVerticalBlank, | 
|  | IDirectDraw4Impl_GetAvailableVidMem, | 
|  | IDirectDraw4Impl_GetSurfaceFromDC, | 
|  | IDirectDraw4Impl_RestoreAllSurfaces, | 
|  | IDirectDraw4Impl_TestCooperativeLevel, | 
|  | IDirectDraw4Impl_GetDeviceIdentifier | 
|  | }; |