Implemented thunks for IDirectDrawSurface and IDirectDraw. This isn't
good code, because it is a mixture of wine and our code. But it works as
far as I can see. I will fix it someday.
Modified: trunk/reactos/lib/ddraw/ddraw.xml
Modified: trunk/reactos/lib/ddraw/main/clipper.c
Modified: trunk/reactos/lib/ddraw/main/color.c
Modified: trunk/reactos/lib/ddraw/main/ddraw.c
Modified: trunk/reactos/lib/ddraw/main/gamma.c
Modified: trunk/reactos/lib/ddraw/main/palette.c
Modified: trunk/reactos/lib/ddraw/main/surface.c
Modified: trunk/reactos/lib/ddraw/main.c
Modified: trunk/reactos/lib/ddraw/rosdraw.h
Added: trunk/reactos/lib/ddraw/thunks/ddraw.c
Added: trunk/reactos/lib/ddraw/thunks/surface.c
Added: trunk/reactos/lib/ddraw/winedraw.h
_____
Modified: trunk/reactos/lib/ddraw/ddraw.xml
--- trunk/reactos/lib/ddraw/ddraw.xml 2005-10-24 15:56:03 UTC (rev
18739)
+++ trunk/reactos/lib/ddraw/ddraw.xml 2005-10-24 16:29:36 UTC (rev
18740)
@@ -1,4 +1,4 @@
-<module name="ddraw" type="win32dll"
installbase="system32"
installname="ddraw.dll" allowwarnings="true">
+<module name="ddraw" type="win32dll"
installbase="system32"
installname="ddraw.dll">
<importlibrary definition="ddraw.def" />
<include base="ddraw">.</include>
<define name="UNICODE" />
@@ -35,4 +35,9 @@
<file>ddraw.c</file>
<file>surface.c</file>
</directory>
+
+ <directory name="thunks">
+ <file>ddraw.c</file>
+ <file>surface.c</file>
+ </directory>
</module>
_____
Modified: trunk/reactos/lib/ddraw/main/clipper.c
--- trunk/reactos/lib/ddraw/main/clipper.c 2005-10-24 15:56:03 UTC
(rev 18739)
+++ trunk/reactos/lib/ddraw/main/clipper.c 2005-10-24 16:29:36 UTC
(rev 18740)
@@ -3,7 +3,7 @@
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS
* FILE: lib/ddraw/main/clipper.c
- * PURPOSE: DirectDraw Implementation
+ * PURPOSE: IDirectDrawClipper Implementation
* PROGRAMMER: Maarten Bosma
*
*/
_____
Modified: trunk/reactos/lib/ddraw/main/color.c
--- trunk/reactos/lib/ddraw/main/color.c 2005-10-24 15:56:03 UTC
(rev 18739)
+++ trunk/reactos/lib/ddraw/main/color.c 2005-10-24 16:29:36 UTC
(rev 18740)
@@ -3,7 +3,7 @@
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS
* FILE: lib/ddraw/main/color.c
- * PURPOSE: DirectDraw Implementation
+ * PURPOSE: IDirectDrawColorControl Implementation
* PROGRAMMER: Maarten Bosma
*
*/
_____
Modified: trunk/reactos/lib/ddraw/main/ddraw.c
--- trunk/reactos/lib/ddraw/main/ddraw.c 2005-10-24 15:56:03 UTC
(rev 18739)
+++ trunk/reactos/lib/ddraw/main/ddraw.c 2005-10-24 16:29:36 UTC
(rev 18740)
@@ -3,7 +3,7 @@
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS
* FILE: lib/ddraw/main/ddraw.c
- * PURPOSE: DirectDraw Implementation
+ * PURPOSE: IDirectDraw7 Implementation
* PROGRAMMER: Magnus Olsen, Maarten Bosma
*
*/
@@ -140,7 +140,9 @@
if (That == NULL)
return E_OUTOFMEMORY;
- That->lpVtbl = &DirectDrawSurface_Vtable;
+ That->lpVtbl = &DirectDrawSurface7_Vtable;
+ That->lpVtbl_v3 = &DDRAW_IDDS3_Thunk_VTable;
+
That->ref = 1;
*ppSurf = (LPDIRECTDRAWSURFACE7)That;
@@ -173,13 +175,39 @@
return ref;
}
-/**** Stubs ****/
+HRESULT WINAPI Main_DirectDraw_QueryInterface (
+ LPDIRECTDRAW7 iface, REFIID id, LPVOID *obj )
+{
+ IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
+
+ if (IsEqualGUID(&IID_IDirectDraw7, id))
+ {
+ *obj = &This->lpVtbl;
+ }
+ else if (IsEqualGUID(&IID_IDirectDraw, id))
+ {
+ *obj = &This->lpVtbl_v1;
+ }
+ else if (IsEqualGUID(&IID_IDirectDraw2, id))
+ {
+ *obj = &This->lpVtbl_v2;
+ }
+ else if (IsEqualGUID(&IID_IDirectDraw4, id))
+ {
+ *obj = &This->lpVtbl_v4;
+ }
+ else
+ {
+ *obj = NULL;
+ return E_NOINTERFACE;
+ }
-HRESULT WINAPI Main_DirectDraw_QueryInterface (LPDIRECTDRAW7
iface,REFIID refiid,LPVOID *obj)
-{
- DX_STUB;
+ Main_DirectDraw_AddRef(iface);
+ return S_OK;
}
+/**** Stubs ****/
+
HRESULT WINAPI Main_DirectDraw_Compact(LPDIRECTDRAW7 iface)
{
DX_STUB;
@@ -380,7 +408,7 @@
DX_STUB;
}
-IDirectDraw7Vtbl DirectDraw_Vtable =
+IDirectDraw7Vtbl DirectDraw7_Vtable =
{
Main_DirectDraw_QueryInterface,
Main_DirectDraw_AddRef,
_____
Modified: trunk/reactos/lib/ddraw/main/gamma.c
--- trunk/reactos/lib/ddraw/main/gamma.c 2005-10-24 15:56:03 UTC
(rev 18739)
+++ trunk/reactos/lib/ddraw/main/gamma.c 2005-10-24 16:29:36 UTC
(rev 18740)
@@ -3,7 +3,7 @@
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS
* FILE: lib/ddraw/main/gamma.c
- * PURPOSE: DirectDraw Implementation
+ * PURPOSE: IDirectDrawGamma Implementation
* PROGRAMMER: Maarten Bosma
*
*/
_____
Modified: trunk/reactos/lib/ddraw/main/palette.c
--- trunk/reactos/lib/ddraw/main/palette.c 2005-10-24 15:56:03 UTC
(rev 18739)
+++ trunk/reactos/lib/ddraw/main/palette.c 2005-10-24 16:29:36 UTC
(rev 18740)
@@ -3,7 +3,7 @@
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS
* FILE: lib/ddraw/main/palette.c
- * PURPOSE: DirectDraw Implementation
+ * PURPOSE: IDirectDrawPalette Implementation
* PROGRAMMER: Maarten Bosma
*
*/
_____
Modified: trunk/reactos/lib/ddraw/main/surface.c
--- trunk/reactos/lib/ddraw/main/surface.c 2005-10-24 15:56:03 UTC
(rev 18739)
+++ trunk/reactos/lib/ddraw/main/surface.c 2005-10-24 16:29:36 UTC
(rev 18740)
@@ -3,7 +3,7 @@
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS
* FILE: lib/ddraw/main/surface.c
- * PURPOSE: DirectDraw Implementation
+ * PURPOSE: IDirectDrawSurface7 Implementation
* PROGRAMMER: Magnus Olsen, Maarten Bosma
*
*/
@@ -113,6 +113,13 @@
/**** Stubs ****/
+HRESULT WINAPI
+Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface, REFIID
riid,
+ LPVOID* ppObj)
+{
+ DX_STUB;
+}
+
HRESULT WINAPI Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT
rdst,
LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, DWORD
dwFlags, LPDDBLTFX lpbltfx)
{
@@ -131,13 +138,6 @@
}
HRESULT WINAPI
-Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface, REFIID
riid,
- LPVOID* ppObj)
-{
- DX_STUB;
-}
-
-HRESULT WINAPI
Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
LPDIRECTDRAWSURFACE7 pAttach)
{
@@ -421,7 +421,7 @@
DX_STUB;
}
-IDirectDrawSurface7Vtbl DirectDrawSurface_Vtable =
+IDirectDrawSurface7Vtbl DirectDrawSurface7_Vtable =
{
Main_DDrawSurface_QueryInterface,
Main_DDrawSurface_AddRef,
_____
Modified: trunk/reactos/lib/ddraw/main.c
--- trunk/reactos/lib/ddraw/main.c 2005-10-24 15:56:03 UTC (rev
18739)
+++ trunk/reactos/lib/ddraw/main.c 2005-10-24 16:29:36 UTC (rev
18740)
@@ -13,8 +13,7 @@
#include "rosdraw.h"
-HRESULT WINAPI Create_DirectDraw (LPGUID pGUID, LPDIRECTDRAW* pIface,
-
IUnknown* pUnkOuter, BOOL ex)
+HRESULT WINAPI Create_DirectDraw (LPGUID pGUID, LPDIRECTDRAW* pIface,
REFIID id, BOOL ex)
{
IDirectDrawImpl* This =
(IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(IDirectDrawImpl));
@@ -23,10 +22,17 @@
ZeroMemory(This,sizeof(IDirectDrawImpl));
- This->lpVtbl = &DirectDraw_Vtable;
+ This->lpVtbl = &DirectDraw7_Vtable;
+ This->lpVtbl_v1 = &DDRAW_IDirectDraw_VTable;
+ This->lpVtbl_v2 = &DDRAW_IDirectDraw2_VTable;
+ This->lpVtbl_v4 = &DDRAW_IDirectDraw4_VTable;
+
This->DirectDrawGlobal.dwRefCnt = 1;
*pIface = (LPDIRECTDRAW)This;
+ if(This->lpVtbl->QueryInterface ((LPDIRECTDRAW7)This, id,
(void**)&pIface) != S_OK)
+ return DDERR_INVALIDPARAMS;
+
return This->lpVtbl->Initialize ((LPDIRECTDRAW7)This, pGUID);
}
@@ -39,10 +45,10 @@
return DDERR_INVALIDPARAMS;
}
- return Create_DirectDraw (lpGUID, lplpDD, pUnkOuter, FALSE);
+ return Create_DirectDraw (lpGUID, lplpDD, &IID_IDirectDraw,
FALSE);
}
-HRESULT WINAPI DirectDrawCreateEx(LPGUID lpGUID, LPVOID* lplpDD, REFIID
iid, LPUNKNOWN pUnkOuter)
+HRESULT WINAPI DirectDrawCreateEx(LPGUID lpGUID, LPVOID* lplpDD, REFIID
id, LPUNKNOWN pUnkOuter)
{
/* check see if pUnkOuter is null or not */
if (pUnkOuter)
@@ -52,12 +58,12 @@
}
/* Is it a DirectDraw 7 Request or not */
- if (!IsEqualGUID(iid, &IID_IDirectDraw7))
+ if (!IsEqualGUID(id, &IID_IDirectDraw7))
{
return DDERR_INVALIDPARAMS;
}
- return Create_DirectDraw (lpGUID, (LPDIRECTDRAW*)lplpDD, pUnkOuter,
TRUE);
+ return Create_DirectDraw (lpGUID, (LPDIRECTDRAW*)lplpDD, id, TRUE);
}
HRESULT WINAPI DirectDrawEnumerateA(
@@ -65,7 +71,7 @@
LPVOID lpContext
)
{
- return DD_OK;
+ DX_STUB;
}
@@ -74,7 +80,7 @@
LPVOID lpContext
)
{
- return DD_OK;
+ DX_STUB;
}
HRESULT WINAPI DirectDrawEnumerateExA(
@@ -83,7 +89,7 @@
DWORD dwFlags
)
{
- return DD_OK;
+ DX_STUB;
}
HRESULT WINAPI DirectDrawEnumerateExW(
@@ -92,7 +98,7 @@
DWORD dwFlags
)
{
- return DD_OK;
+ DX_STUB;
}
HRESULT WINAPI DirectDrawCreateClipper(
@@ -101,6 +107,5 @@
LPUNKNOWN pUnkOuter
)
{
- return DD_OK;
+ DX_STUB;
}
-
_____
Modified: trunk/reactos/lib/ddraw/rosdraw.h
--- trunk/reactos/lib/ddraw/rosdraw.h 2005-10-24 15:56:03 UTC (rev
18739)
+++ trunk/reactos/lib/ddraw/rosdraw.h 2005-10-24 16:29:36 UTC (rev
18740)
@@ -3,7 +3,6 @@
/********* Includes *********/
-
#include <windows.h>
#include <stdio.h>
#include <ddraw.h>
@@ -16,6 +15,10 @@
typedef struct
{
IDirectDraw7Vtbl* lpVtbl;
+ IDirectDraw4Vtbl* lpVtbl_v4;
+ IDirectDraw2Vtbl* lpVtbl_v2;
+ IDirectDrawVtbl* lpVtbl_v1;
+
DDRAWI_DIRECTDRAW_GBL DirectDrawGlobal;
DDHALINFO HalInfo;
@@ -33,6 +36,8 @@
typedef struct
{
IDirectDrawSurface7Vtbl* lpVtbl;
+ IDirectDrawSurface3Vtbl* lpVtbl_v3;
+
LONG ref;
IDirectDrawImpl* owner;
@@ -63,8 +68,14 @@
/*********** VTables ************/
-extern IDirectDraw7Vtbl
DirectDraw_Vtable;
-extern IDirectDrawSurface7Vtbl DirectDrawSurface_Vtable;
+extern IDirectDraw7Vtbl
DirectDraw7_Vtable;
+extern IDirectDrawVtbl
DDRAW_IDirectDraw_VTable;
+extern IDirectDraw2Vtbl
DDRAW_IDirectDraw2_VTable;
+extern IDirectDraw4Vtbl
DDRAW_IDirectDraw4_VTable;
+
+extern IDirectDrawSurface7Vtbl DirectDrawSurface7_Vtable;
+extern IDirectDrawSurface3Vtbl DDRAW_IDDS3_Thunk_VTable;
+
extern IDirectDrawPaletteVtbl DirectDrawPalette_Vtable;
extern IDirectDrawClipperVtbl DirectDrawClipper_Vtable;
extern IDirectDrawColorControlVtbl DirectDrawColorControl_Vtable;
_____
Added: trunk/reactos/lib/ddraw/thunks/ddraw.c
--- trunk/reactos/lib/ddraw/thunks/ddraw.c 2005-10-24 15:56:03 UTC
(rev 18739)
+++ trunk/reactos/lib/ddraw/thunks/ddraw.c 2005-10-24 16:29:36 UTC
(rev 18740)
@@ -0,0 +1,1049 @@
+/* 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
+ */
+
+/*
+ * Taken form wine (wine/dlls/ddraw/ddraw_thunks.c rev 1.2)
+ * with some little changes
+ *
+ */
+
+#include "winedraw.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,
[truncated at 1000 lines; 966 more skipped]