[PATCH] DDrawex: Implement a wrapper around IDirectDraw=0A=

Stefan Doesinger stefan at codeweavers.com
Fri Jan 9 12:23:17 CST 2009


=0A=
This allows us to cleanly implement the differences between ddraw.dll and=0A=
ddrawex.dll without private functions and if checks if an object was =
created=0A=
by ddraw or ddrawex. A similar wrapper will be added for =
IDirectDrawSurface=0A=
=0A=
The differences that are / will be cought by this wrapper:=0A=
=0A=
*) DDrawex supports IDirectDraw3. This is fairly streightforward=0A=
*) DDrawex supports aggregation: Not yet implemented, but easy to add too=0A=
*) Certain differences in CreateSurface: Easy once the surface wrapper is=0A=
there=0A=
---=0A=
 dlls/ddrawex/Makefile.in       |    1 +=0A=
 dlls/ddrawex/ddraw.c           | 1484 =
++++++++++++++++++++++++++++++++++++++++=0A=
 dlls/ddrawex/ddrawex_private.h |   21 +-=0A=
 dlls/ddrawex/main.c            |   32 +-=0A=
 4 files changed, 1506 insertions(+), 32 deletions(-)=0A=
 create mode 100644 dlls/ddrawex/ddraw.c=0A=
=0A=
diff --git a/dlls/ddrawex/Makefile.in b/dlls/ddrawex/Makefile.in=0A=
index 8cf514b..e6b927b 100644=0A=
--- a/dlls/ddrawex/Makefile.in=0A=
+++ b/dlls/ddrawex/Makefile.in=0A=
@@ -6,6 +6,7 @@ MODULE    =3D ddrawex.dll=0A=
 IMPORTS   =3D dxguid uuid ddraw ole32 advapi32 kernel32=0A=
 =0A=
 C_SRCS =3D \=0A=
+	ddraw.c \=0A=
 	main.c \=0A=
 	regsvr.c=0A=
 =0A=
diff --git a/dlls/ddrawex/ddraw.c b/dlls/ddrawex/ddraw.c=0A=
new file mode 100644=0A=
index 0000000..f3c5c41=0A=
--- /dev/null=0A=
+++ b/dlls/ddrawex/ddraw.c=0A=
@@ -0,0 +1,1484 @@=0A=
+/*=0A=
+ * Copyright 2008 Stefan D=C3=B6singer for CodeWeavers=0A=
+ *=0A=
+ * This library is free software; you can redistribute it and/or=0A=
+ * modify it under the terms of the GNU Lesser General Public=0A=
+ * License as published by the Free Software Foundation; either=0A=
+ * version 2.1 of the License, or (at your option) any later version.=0A=
+ *=0A=
+ * This library is distributed in the hope that it will be useful,=0A=
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of=0A=
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU=0A=
+ * Lesser General Public License for more details.=0A=
+ *=0A=
+ * You should have received a copy of the GNU Lesser General Public=0A=
+ * License along with this library; if not, write to the Free Software=0A=
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA =
02110-1301, USA=0A=
+ */=0A=
+#include "wine/debug.h"=0A=
+=0A=
+#define COBJMACROS=0A=
+=0A=
+#include "winbase.h"=0A=
+#include "wingdi.h"=0A=
+=0A=
+#include "ddraw.h"=0A=
+#include "d3d.h"=0A=
+=0A=
+#include "ddrawex_private.h"=0A=
+=0A=
+WINE_DEFAULT_DEBUG_CHANNEL(ddrawex);=0A=
+=0A=
+/***********************************************************************=
*******=0A=
+ * Helper functions for COM management=0A=
+ =
*************************************************************************=
*****/=0A=
+static IDirectDrawImpl *impl_from_dd1(IDirectDraw *iface)=0A=
+{=0A=
+    return (IDirectDrawImpl *)((char*)iface - =
FIELD_OFFSET(IDirectDrawImpl, IDirectDraw_Vtbl));=0A=
+}=0A=
+static IDirectDraw *dd1_from_impl(IDirectDrawImpl *This)=0A=
+{=0A=
+    return (IDirectDraw *) &This->IDirectDraw_Vtbl;=0A=
+}=0A=
+=0A=
+static IDirectDrawImpl *impl_from_dd2(IDirectDraw2 *iface)=0A=
+{=0A=
+    return (IDirectDrawImpl *)((char*)iface - =
FIELD_OFFSET(IDirectDrawImpl, IDirectDraw2_Vtbl));=0A=
+}=0A=
+static IDirectDraw2 *dd2_from_impl(IDirectDrawImpl *This)=0A=
+{=0A=
+    return (IDirectDraw2 *) &This->IDirectDraw2_Vtbl;=0A=
+}=0A=
+=0A=
+static IDirectDrawImpl *impl_from_dd3(IDirectDraw3 *iface)=0A=
+{=0A=
+    return (IDirectDrawImpl *)((char*)iface - =
FIELD_OFFSET(IDirectDrawImpl, IDirectDraw3_Vtbl));=0A=
+}=0A=
+static IDirectDraw3 *dd3_from_impl(IDirectDrawImpl *This)=0A=
+{=0A=
+    return (IDirectDraw3 *) &This->IDirectDraw3_Vtbl;=0A=
+}=0A=
+=0A=
+static IDirectDrawImpl *impl_from_dd4(IDirectDraw4 *iface)=0A=
+{=0A=
+    return (IDirectDrawImpl *)((char*)iface - =
FIELD_OFFSET(IDirectDrawImpl, IDirectDraw4_Vtbl));=0A=
+}=0A=
+static IDirectDraw4 *dd4_from_impl(IDirectDrawImpl *This)=0A=
+{=0A=
+    return (IDirectDraw4 *) &This->IDirectDraw4_Vtbl;=0A=
+}=0A=
+=0A=
+/***********************************************************************=
*******=0A=
+ * IDirectDraw4 -> ddraw.dll wrappers=0A=
+ =
*************************************************************************=
*****/=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_QueryInterface(IDirectDraw4 *iface,=0A=
+                                REFIID refiid,=0A=
+                                void **obj)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+=0A=
+    TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(refiid), obj);=0A=
+    *obj =3D NULL;=0A=
+=0A=
+    if(!refiid)=0A=
+    {=0A=
+        return DDERR_INVALIDPARAMS;=0A=
+    }=0A=
+=0A=
+    if (IsEqualGUID( &IID_IDirectDraw7, refiid ) )=0A=
+    {=0A=
+        WARN("IDirectDraw7 not allowed in ddrawex.dll\n");=0A=
+        return E_NOINTERFACE;=0A=
+    }=0A=
+    else if ( IsEqualGUID( &IID_IUnknown, refiid ) ||=0A=
+              IsEqualGUID( &IID_IDirectDraw4, refiid ) )=0A=
+    {=0A=
+        *obj =3D dd4_from_impl(This);=0A=
+        TRACE("(%p) Returning IDirectDraw4 interface at %p\n", This, =
*obj);=0A=
+        IDirectDraw4_AddRef((IDirectDraw4 *) *obj);=0A=
+    }=0A=
+    else if ( IsEqualGUID( &IID_IDirectDraw3, refiid ) )=0A=
+    {=0A=
+        *obj =3D dd3_from_impl(This);=0A=
+        TRACE("(%p) Returning IDirectDraw3 interface at %p\n", This, =
*obj);=0A=
+        IDirectDraw3_AddRef((IDirectDraw3 *) *obj);=0A=
+    }=0A=
+    else if ( IsEqualGUID( &IID_IDirectDraw2, refiid ) )=0A=
+    {=0A=
+        *obj =3D dd2_from_impl(This);=0A=
+        TRACE("(%p) Returning IDirectDraw2 interface at %p\n", This, =
*obj);=0A=
+        IDirectDraw2_AddRef((IDirectDraw2 *) *obj);=0A=
+    }=0A=
+    else if ( IsEqualGUID( &IID_IDirectDraw, refiid ) )=0A=
+    {=0A=
+        *obj =3D dd1_from_impl(This);=0A=
+        TRACE("(%p) Returning IDirectDraw interface at %p\n", This, =
*obj);=0A=
+        IDirectDraw_AddRef((IDirectDraw *) *obj);=0A=
+    }=0A=
+    else if ( IsEqualGUID( &IID_IDirect3D  , refiid ) ||=0A=
+              IsEqualGUID( &IID_IDirect3D2 , refiid ) ||=0A=
+              IsEqualGUID( &IID_IDirect3D3 , refiid ) ||=0A=
+              IsEqualGUID( &IID_IDirect3D7 , refiid ) )=0A=
+    {=0A=
+        WARN("Direct3D not allowed in ddrawex.dll\n");=0A=
+        return E_NOINTERFACE;=0A=
+    }=0A=
+    /* Unknown interface */=0A=
+    else=0A=
+    {=0A=
+        ERR("(%p)->(%s, %p): No interface found\n", This, =
debugstr_guid(refiid), obj);=0A=
+        return E_NOINTERFACE;=0A=
+    }=0A=
+    TRACE("Returning S_OK\n");=0A=
+    return S_OK;=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_QueryInterface(IDirectDraw3 *iface,=0A=
+                                REFIID refiid,=0A=
+                                void **obj)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_QueryInterface(dd4_from_impl(This), refiid, =
obj);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_QueryInterface(IDirectDraw2 *iface,=0A=
+                                REFIID refiid,=0A=
+                                void **obj)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_QueryInterface(dd4_from_impl(This), refiid, =
obj);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_QueryInterface(IDirectDraw *iface,=0A=
+                               REFIID refiid,=0A=
+                               void **obj)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_QueryInterface(dd4_from_impl(This), refiid, =
obj);=0A=
+}=0A=
+=0A=
+static ULONG WINAPI=0A=
+IDirectDraw4Impl_AddRef(IDirectDraw4 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    ULONG ref =3D InterlockedIncrement(&This->ref);=0A=
+=0A=
+    TRACE("(%p) : incrementing refcount from %u.\n", This, ref - 1);=0A=
+=0A=
+    return ref;=0A=
+}=0A=
+=0A=
+static ULONG WINAPI=0A=
+IDirectDraw3Impl_AddRef(IDirectDraw3 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_AddRef(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static ULONG WINAPI=0A=
+IDirectDraw2Impl_AddRef(IDirectDraw2 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_AddRef(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static ULONG WINAPI=0A=
+IDirectDrawImpl_AddRef(IDirectDraw *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_AddRef(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static ULONG WINAPI=0A=
+IDirectDraw4Impl_Release(IDirectDraw4 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    ULONG ref =3D InterlockedDecrement(&This->ref);=0A=
+=0A=
+    TRACE("(%p) : decrementing refcount to %u.\n", This, ref);=0A=
+=0A=
+    if(ref =3D=3D 0)=0A=
+    {=0A=
+        TRACE("Destroying object\n");=0A=
+        IDirectDraw4_Release(This->parent);=0A=
+        HeapFree(GetProcessHeap(), 0, This);=0A=
+    }=0A=
+    return ref;=0A=
+}=0A=
+=0A=
+static ULONG WINAPI=0A=
+IDirectDraw3Impl_Release(IDirectDraw3 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_Release(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static ULONG WINAPI=0A=
+IDirectDraw2Impl_Release(IDirectDraw2 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_Release(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static ULONG WINAPI=0A=
+IDirectDrawImpl_Release(IDirectDraw *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_Release(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_Compact(IDirectDraw4 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)\n", This);=0A=
+=0A=
+    return IDirectDraw4_Compact(This->parent);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_Compact(IDirectDraw3 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_Compact(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_Compact(IDirectDraw2 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_Compact(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_Compact(IDirectDraw *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_Compact(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_CreateClipper(IDirectDraw4 *iface,=0A=
+                               DWORD Flags,=0A=
+                               IDirectDrawClipper **clipper,=0A=
+                               IUnknown *UnkOuter)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(0x%08x, %p, %p)\n", This, Flags, clipper, UnkOuter);=0A=
+=0A=
+    if(UnkOuter !=3D NULL)=0A=
+    {=0A=
+        /* This may require a wrapper interface for clippers too which =
handles this */=0A=
+        FIXME("Test and implement Aggregation for ddrawex clippers\n");=0A=
+    }=0A=
+=0A=
+    return IDirectDraw4_CreateClipper(This->parent, Flags, clipper, =
UnkOuter);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_CreateClipper(IDirectDraw3 *iface,=0A=
+                               DWORD Flags,=0A=
+                               IDirectDrawClipper **clipper,=0A=
+                               IUnknown *UnkOuter)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_CreateClipper(dd4_from_impl(This), Flags, =
clipper, UnkOuter);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_CreateClipper(IDirectDraw2 *iface,=0A=
+                               DWORD Flags,=0A=
+                               IDirectDrawClipper **clipper,=0A=
+                               IUnknown *UnkOuter)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_CreateClipper(dd4_from_impl(This), Flags, =
clipper, UnkOuter);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_CreateClipper(IDirectDraw *iface,=0A=
+                              DWORD Flags,=0A=
+                              IDirectDrawClipper **clipper,=0A=
+                              IUnknown *UnkOuter)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_CreateClipper(dd4_from_impl(This), Flags, =
clipper, UnkOuter);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_CreatePalette(IDirectDraw4 *iface,=0A=
+                               DWORD Flags,=0A=
+                               PALETTEENTRY *ColorTable,=0A=
+                               IDirectDrawPalette **Palette,=0A=
+                               IUnknown *UnkOuter)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)(0x%08x,%p,%p,%p)\n", This, Flags, ColorTable, Palette, =
UnkOuter);=0A=
+=0A=
+    if(UnkOuter !=3D NULL)=0A=
+    {=0A=
+        /* This may require a wrapper interface for palettes too which =
handles this */=0A=
+        FIXME("Test and implement Aggregation for ddrawex palettes\n");=0A=
+    }=0A=
+=0A=
+    return IDirectDraw4_CreatePalette(This->parent, Flags, ColorTable, =
Palette, UnkOuter);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_CreatePalette(IDirectDraw3 *iface,=0A=
+                               DWORD Flags,=0A=
+                               PALETTEENTRY *ColorTable,=0A=
+                               IDirectDrawPalette **Palette,=0A=
+                               IUnknown *UnkOuter)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_CreatePalette(dd4_from_impl(This), Flags, =
ColorTable, Palette, UnkOuter);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_CreatePalette(IDirectDraw2 *iface,=0A=
+                               DWORD Flags,=0A=
+                               PALETTEENTRY *ColorTable,=0A=
+                               IDirectDrawPalette **Palette,=0A=
+                               IUnknown *UnkOuter)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_CreatePalette(dd4_from_impl(This), Flags, =
ColorTable, Palette, UnkOuter);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_CreatePalette(IDirectDraw *iface,=0A=
+                              DWORD Flags,=0A=
+                              PALETTEENTRY *ColorTable,=0A=
+                              IDirectDrawPalette **Palette,=0A=
+                              IUnknown *UnkOuter)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    return IDirectDraw4_CreatePalette(dd4_from_impl(This), Flags, =
ColorTable, Palette, UnkOuter);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_CreateSurface(IDirectDraw4 *iface,=0A=
+                               DDSURFACEDESC2 *DDSD,=0A=
+                               IDirectDrawSurface4 **Surf,=0A=
+                               IUnknown *UnkOuter)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)(%p, %p, %p)\n", This, DDSD, Surf, UnkOuter);=0A=
+=0A=
+    if(UnkOuter !=3D NULL)=0A=
+    {=0A=
+        /* Handle this in this dll. Don't forward the UnkOuter to =
ddraw.dll */=0A=
+        FIXME("Implement aggregation for ddrawex surfaces\n");=0A=
+    }=0A=
+=0A=
+    return IDirectDraw4_CreateSurface(This->parent, DDSD, Surf, =
UnkOuter);=0A=
+}=0A=
+=0A=
+static void DDSD_to_DDSD2(const DDSURFACEDESC *in, DDSURFACEDESC2 *out)=0A=
+{=0A=
+    memset(out, 0, sizeof(*out));=0A=
+    out->dwSize =3D sizeof(*out);=0A=
+    out->dwFlags =3D in->dwFlags;=0A=
+    if(in->dwFlags & DDSD_WIDTH) out->dwWidth =3D in->dwWidth;=0A=
+    if(in->dwFlags & DDSD_HEIGHT) out->dwHeight =3D in->dwHeight;=0A=
+    if(in->dwFlags & DDSD_PIXELFORMAT) out->ddpfPixelFormat =3D =
in->ddpfPixelFormat;=0A=
+    if(in->dwFlags & DDSD_CAPS) out->ddsCaps.dwCaps =3D =
in->ddsCaps.dwCaps;=0A=
+    if(in->dwFlags & DDSD_PITCH) out->lPitch =3D in->lPitch;=0A=
+    if(in->dwFlags & DDSD_BACKBUFFERCOUNT) out->dwBackBufferCount =3D =
in->dwBackBufferCount;=0A=
+    if(in->dwFlags & DDSD_ZBUFFERBITDEPTH) out->dwMipMapCount =3D =
in->dwZBufferBitDepth; /* same union */=0A=
+    if(in->dwFlags & DDSD_ALPHABITDEPTH) out->dwAlphaBitDepth =3D =
in->dwAlphaBitDepth;=0A=
+    if(in->dwFlags & DDSD_LPSURFACE) out->lpSurface =3D in->lpSurface;=0A=
+    if(in->dwFlags & DDSD_CKDESTOVERLAY) out->ddckCKDestOverlay =3D =
in->ddckCKDestOverlay;=0A=
+    if(in->dwFlags & DDSD_CKDESTBLT) out->ddckCKDestBlt =3D =
in->ddckCKDestBlt;=0A=
+    if(in->dwFlags & DDSD_CKSRCOVERLAY) out->ddckCKSrcOverlay =3D =
in->ddckCKSrcOverlay;=0A=
+    if(in->dwFlags & DDSD_CKSRCBLT) out->ddckCKSrcBlt =3D =
in->ddckCKSrcBlt;=0A=
+    if(in->dwFlags & DDSD_MIPMAPCOUNT) out->dwMipMapCount =3D =
in->dwMipMapCount;=0A=
+    if(in->dwFlags & DDSD_REFRESHRATE) out->dwRefreshRate =3D =
in->dwRefreshRate;=0A=
+    if(in->dwFlags & DDSD_LINEARSIZE) out->dwLinearSize =3D =
in->dwLinearSize;=0A=
+    /* Does not exist in DDSURFACEDESC:=0A=
+     * DDSD_TEXTURESTAGE, DDSD_FVF, DDSD_SRCVBHANDLE,=0A=
+     */=0A=
+}=0A=
+=0A=
+static void DDSD2_to_DDSD(const DDSURFACEDESC2 *in, DDSURFACEDESC *out)=0A=
+{=0A=
+    memset(out, 0, sizeof(*out));=0A=
+    out->dwSize =3D sizeof(*out);=0A=
+    out->dwFlags =3D in->dwFlags;=0A=
+    if(in->dwFlags & DDSD_WIDTH) out->dwWidth =3D in->dwWidth;=0A=
+    if(in->dwFlags & DDSD_HEIGHT) out->dwHeight =3D in->dwHeight;=0A=
+    if(in->dwFlags & DDSD_PIXELFORMAT) out->ddpfPixelFormat =3D =
in->ddpfPixelFormat;=0A=
+    if(in->dwFlags & DDSD_CAPS) out->ddsCaps.dwCaps =3D =
in->ddsCaps.dwCaps;=0A=
+    if(in->dwFlags & DDSD_PITCH) out->lPitch =3D in->lPitch;=0A=
+    if(in->dwFlags & DDSD_BACKBUFFERCOUNT) out->dwBackBufferCount =3D =
in->dwBackBufferCount;=0A=
+    if(in->dwFlags & DDSD_ZBUFFERBITDEPTH) out->dwZBufferBitDepth =3D =
in->dwMipMapCount; /* same union */=0A=
+    if(in->dwFlags & DDSD_ALPHABITDEPTH) out->dwAlphaBitDepth =3D =
in->dwAlphaBitDepth;=0A=
+    if(in->dwFlags & DDSD_LPSURFACE) out->lpSurface =3D in->lpSurface;=0A=
+    if(in->dwFlags & DDSD_CKDESTOVERLAY) out->ddckCKDestOverlay =3D =
in->ddckCKDestOverlay;=0A=
+    if(in->dwFlags & DDSD_CKDESTBLT) out->ddckCKDestBlt =3D =
in->ddckCKDestBlt;=0A=
+    if(in->dwFlags & DDSD_CKSRCOVERLAY) out->ddckCKSrcOverlay =3D =
in->ddckCKSrcOverlay;=0A=
+    if(in->dwFlags & DDSD_CKSRCBLT) out->ddckCKSrcBlt =3D =
in->ddckCKSrcBlt;=0A=
+    if(in->dwFlags & DDSD_MIPMAPCOUNT) out->dwMipMapCount =3D =
in->dwMipMapCount;=0A=
+    if(in->dwFlags & DDSD_REFRESHRATE) out->dwRefreshRate =3D =
in->dwRefreshRate;=0A=
+    if(in->dwFlags & DDSD_LINEARSIZE) out->dwLinearSize =3D =
in->dwLinearSize;=0A=
+    /* Does not exist in DDSURFACEDESC:=0A=
+     * DDSD_TEXTURESTAGE, DDSD_FVF, DDSD_SRCVBHANDLE,=0A=
+     */=0A=
+    if(in->dwFlags & DDSD_TEXTURESTAGE) WARN("Does not exist in =
DDSURFACEDESC: DDSD_TEXTURESTAGE\n");=0A=
+    if(in->dwFlags & DDSD_FVF) WARN("Does not exist in DDSURFACEDESC: =
DDSD_FVF\n");=0A=
+    if(in->dwFlags & DDSD_SRCVBHANDLE) WARN("Does not exist in =
DDSURFACEDESC: DDSD_SRCVBHANDLE\n");=0A=
+    out->dwFlags &=3D ~(DDSD_TEXTURESTAGE | DDSD_FVF | =
DDSD_SRCVBHANDLE);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_CreateSurface(IDirectDraw3 *iface,=0A=
+                               DDSURFACEDESC *DDSD,=0A=
+                               IDirectDrawSurface **Surf,=0A=
+                               IUnknown *UnkOuter)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    DDSURFACEDESC2 ddsd2;=0A=
+    IDirectDrawSurface4 *surf4 =3D NULL;=0A=
+    HRESULT hr;=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+=0A=
+    DDSD_to_DDSD2(DDSD, &ddsd2);=0A=
+=0A=
+    hr =3D IDirectDraw4_CreateSurface(dd4_from_impl(This), &ddsd2, =
&surf4, UnkOuter);=0A=
+    if(FAILED(hr))=0A=
+    {=0A=
+        *Surf =3D NULL;=0A=
+        return hr;=0A=
+    }=0A=
+=0A=
+    IDirectDrawSurface4_QueryInterface(surf4, &IID_IDirectDrawSurface, =
(void **) Surf);=0A=
+    IDirectDrawSurface4_Release(surf4);=0A=
+    return hr;=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_CreateSurface(IDirectDraw2 *iface,=0A=
+                               DDSURFACEDESC *DDSD,=0A=
+                               IDirectDrawSurface **Surf,=0A=
+                               IUnknown *UnkOuter)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("Thunking to IDirectDraw3\n");=0A=
+    return IDirectDraw3_CreateSurface(dd3_from_impl(This), DDSD, Surf, =
UnkOuter);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_CreateSurface(IDirectDraw *iface,=0A=
+                              DDSURFACEDESC *DDSD,=0A=
+                              IDirectDrawSurface **Surf,=0A=
+                              IUnknown *UnkOuter)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("Thunking to IDirectDraw3\n");=0A=
+    return IDirectDraw3_CreateSurface(dd3_from_impl(This), DDSD, Surf, =
UnkOuter);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_DuplicateSurface(IDirectDraw4 *iface,=0A=
+                                  IDirectDrawSurface4 *src,=0A=
+                                  IDirectDrawSurface4 **dst)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%p,%p)\n", This, src, dst);=0A=
+=0A=
+    return IDirectDraw4_DuplicateSurface(This->parent, src, dst);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_DuplicateSurface(IDirectDraw3 *iface,=0A=
+                                  IDirectDrawSurface *src,=0A=
+                                  IDirectDrawSurface **dst)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    IDirectDrawSurface4 *src_4;=0A=
+    IDirectDrawSurface4 *dst_4;=0A=
+    HRESULT hr;=0A=
+=0A=
+    TRACE("Thunking to IDirectDraw4\n");=0A=
+    IDirectDrawSurface_QueryInterface(src, &IID_IDirectDrawSurface4, =
(void **) &src_4);=0A=
+    hr =3D IDirectDraw4_DuplicateSurface(dd4_from_impl(This), src_4, =
&dst_4);=0A=
+    IDirectDrawSurface4_Release(src_4);=0A=
+=0A=
+    if(FAILED(hr))=0A=
+    {=0A=
+        *dst =3D NULL;=0A=
+        return hr;=0A=
+    }=0A=
+    IDirectDrawSurface4_QueryInterface(dst_4, &IID_IDirectDrawSurface, =
(void **) dst);=0A=
+    IDirectDrawSurface4_Release(dst_4);=0A=
+    return hr;=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_DuplicateSurface(IDirectDraw2 *iface,=0A=
+                                  IDirectDrawSurface *src,=0A=
+                                  IDirectDrawSurface **dst)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("Thunking to IDirectDraw3\n");=0A=
+    return IDirectDraw3_DuplicateSurface(dd3_from_impl(This), src, dst);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_DuplicateSurface(IDirectDraw *iface,=0A=
+                                 IDirectDrawSurface *src,=0A=
+                                 IDirectDrawSurface **dst)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("Thunking to IDirectDraw3\n");=0A=
+    return IDirectDraw3_DuplicateSurface(dd3_from_impl(This), src, dst);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_EnumDisplayModes(IDirectDraw4 *iface,=0A=
+                                  DWORD Flags,=0A=
+                                  DDSURFACEDESC2 *DDSD,=0A=
+                                  void *Context,=0A=
+                                  LPDDENUMMODESCALLBACK2 cb)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(0x%08x,%p,%p,%p)\n", This, Flags, DDSD, Context, cb);=0A=
+=0A=
+    return IDirectDraw4_EnumDisplayModes(This->parent, Flags, DDSD, =
Context, cb);=0A=
+}=0A=
+=0A=
+struct enummodes_ctx=0A=
+{=0A=
+    LPDDENUMMODESCALLBACK orig_cb;=0A=
+    void *orig_ctx;=0A=
+};=0A=
+=0A=
+static HRESULT WINAPI=0A=
+enum_modes_cb2(DDSURFACEDESC2 *ddsd2, void *vctx)=0A=
+{=0A=
+    struct enummodes_ctx *ctx =3D (struct enummodes_ctx *) vctx;=0A=
+    DDSURFACEDESC ddsd;=0A=
+=0A=
+    DDSD2_to_DDSD(ddsd2, &ddsd);=0A=
+    return ctx->orig_cb(&ddsd, ctx->orig_ctx);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_EnumDisplayModes(IDirectDraw3 *iface,=0A=
+                                  DWORD Flags,=0A=
+                                  DDSURFACEDESC *DDSD,=0A=
+                                  void *Context,=0A=
+                                  LPDDENUMMODESCALLBACK cb)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    DDSURFACEDESC2 ddsd2;=0A=
+    struct enummodes_ctx ctx;=0A=
+    TRACE("(%p)->(0x%08x,%p,%p,%p): Thunking to IDirectDraw4\n", This, =
Flags, DDSD, Context, cb);=0A=
+=0A=
+    DDSD_to_DDSD2(DDSD, &ddsd2);=0A=
+    ctx.orig_cb =3D cb;=0A=
+    ctx.orig_ctx =3D Context;=0A=
+    return IDirectDraw4_EnumDisplayModes(dd4_from_impl(This), Flags, =
&ddsd2, &ctx, enum_modes_cb2);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_EnumDisplayModes(IDirectDraw2 *iface,=0A=
+                                  DWORD Flags,=0A=
+                                  DDSURFACEDESC *DDSD,=0A=
+                                  void *Context,=0A=
+                                  LPDDENUMMODESCALLBACK cb)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(0x%08x,%p,%p,%p): Thunking to IDirectDraw3\n", This, =
Flags, DDSD, Context, cb);=0A=
+    return IDirectDraw3_EnumDisplayModes(dd3_from_impl(This), Flags, =
DDSD, Context, cb);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_EnumDisplayModes(IDirectDraw *iface,=0A=
+                                 DWORD Flags,=0A=
+                                 DDSURFACEDESC *DDSD,=0A=
+                                 void *Context,=0A=
+                                 LPDDENUMMODESCALLBACK cb)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(0x%08x,%p,%p,%p): Thunking to IDirectDraw3\n", This, =
Flags, DDSD, Context, cb);=0A=
+    return IDirectDraw3_EnumDisplayModes(dd3_from_impl(This), Flags, =
DDSD, Context, cb);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_EnumSurfaces(IDirectDraw4 *iface,=0A=
+                              DWORD Flags,=0A=
+                              DDSURFACEDESC2 *DDSD,=0A=
+                              void *Context,=0A=
+                              LPDDENUMSURFACESCALLBACK2 Callback)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(0x%08x,%p,%p,%p)\n", This, Flags, DDSD, Context, =
Callback);=0A=
+=0A=
+    return IDirectDraw4Impl_EnumSurfaces(This->parent, Flags, DDSD, =
Context, Callback);=0A=
+}=0A=
+=0A=
+struct enumsurfaces_ctx=0A=
+{=0A=
+    LPDDENUMSURFACESCALLBACK orig_cb;=0A=
+    void *orig_ctx;=0A=
+};=0A=
+=0A=
+static HRESULT WINAPI=0A=
+enum_surfaces_cb2(IDirectDrawSurface4 *surf4, DDSURFACEDESC2 *ddsd2, =
void *vctx)=0A=
+{=0A=
+    struct enumsurfaces_ctx *ctx =3D (struct enumsurfaces_ctx *) vctx;=0A=
+    IDirectDrawSurface *surf1;=0A=
+    DDSURFACEDESC ddsd;=0A=
+=0A=
+    /* Keep the reference, it goes to the application */=0A=
+    IDirectDrawSurface4_QueryInterface(surf4, &IID_IDirectDrawSurface, =
(void **) &surf1);=0A=
+    /* Release the reference this function got */=0A=
+    IDirectDrawSurface4_Release(surf4);=0A=
+=0A=
+    DDSD2_to_DDSD(ddsd2, &ddsd);=0A=
+    return ctx->orig_cb(surf1, &ddsd, ctx->orig_ctx);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_EnumSurfaces(IDirectDraw3 *iface,=0A=
+                              DWORD Flags,=0A=
+                              DDSURFACEDESC *DDSD,=0A=
+                              void *Context,=0A=
+                              LPDDENUMSURFACESCALLBACK Callback)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    DDSURFACEDESC2 ddsd2;=0A=
+    struct enumsurfaces_ctx ctx;=0A=
+    TRACE("(%p)->(0x%08x,%p,%p,%p): Thunking to IDirectDraw4\n", This, =
Flags, DDSD, Context, Callback);=0A=
+=0A=
+    DDSD_to_DDSD2(DDSD, &ddsd2);=0A=
+    ctx.orig_cb =3D Callback;=0A=
+    ctx.orig_ctx =3D Context;=0A=
+    return IDirectDraw4_EnumSurfaces(dd4_from_impl(This), Flags, =
&ddsd2, &ctx, enum_surfaces_cb2);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_EnumSurfaces(IDirectDraw2 *iface,=0A=
+                              DWORD Flags,=0A=
+                              DDSURFACEDESC *DDSD,=0A=
+                              void *Context,=0A=
+                              LPDDENUMSURFACESCALLBACK Callback)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(0x%08x,%p,%p,%p): Thunking to IDirectDraw3\n", This, =
Flags, DDSD, Context, Callback);=0A=
+    return IDirectDraw3_EnumSurfaces(dd3_from_impl(This), Flags, DDSD, =
Context, Callback);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_EnumSurfaces(IDirectDraw *iface,=0A=
+                             DWORD Flags,=0A=
+                             DDSURFACEDESC *DDSD,=0A=
+                             void *Context,=0A=
+                             LPDDENUMSURFACESCALLBACK Callback)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(0x%08x,%p,%p,%p): Thunking to IDirectDraw3\n", This, =
Flags, DDSD, Context, Callback);=0A=
+    return IDirectDraw3_EnumSurfaces(dd3_from_impl(This), Flags, DDSD, =
Context, Callback);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_FlipToGDISurface(IDirectDraw4 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)\n", This);=0A=
+=0A=
+    return IDirectDraw4_FlipToGDISurface(This->parent);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_FlipToGDISurface(IDirectDraw3 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("(%p). Thunking to IDirectDraw4\n", This);=0A=
+    return IDirectDraw4_FlipToGDISurface(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_FlipToGDISurface(IDirectDraw2 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p). Thunking to IDirectDraw4\n", This);=0A=
+    return IDirectDraw4_FlipToGDISurface(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_FlipToGDISurface(IDirectDraw *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p). Thunking to IDirectDraw4\n", This);=0A=
+    return IDirectDraw4_FlipToGDISurface(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_GetCaps(IDirectDraw4 *iface,=0A=
+                         DDCAPS *DriverCaps,=0A=
+                         DDCAPS *HELCaps)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%p,%p)\n", This, DriverCaps, HELCaps);=0A=
+    return IDirectDraw4_GetCaps(This->parent, DriverCaps, HELCaps);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_GetCaps(IDirectDraw3 *iface,=0A=
+                         DDCAPS *DriverCaps,=0A=
+                         DDCAPS *HELCaps)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("(%p)->(%p,%p). Thunking to IDirectDraw4\n", This, =
DriverCaps, HELCaps);=0A=
+    return IDirectDraw4_GetCaps(dd4_from_impl(This), DriverCaps, =
HELCaps);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_GetCaps(IDirectDraw2 *iface,=0A=
+                         DDCAPS *DriverCaps,=0A=
+                         DDCAPS *HELCaps)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(%p,%p). Thunking to IDirectDraw4\n", This, =
DriverCaps, HELCaps);=0A=
+    return IDirectDraw4_GetCaps(dd4_from_impl(This), DriverCaps, =
HELCaps);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_GetCaps(IDirectDraw *iface,=0A=
+                        DDCAPS *DriverCaps,=0A=
+                        DDCAPS *HELCaps)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(%p,%p). Thunking to IDirectDraw4\n", This, =
DriverCaps, HELCaps);=0A=
+    return IDirectDraw4_GetCaps(dd4_from_impl(This), DriverCaps, =
HELCaps);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_GetDisplayMode(IDirectDraw4 *iface,=0A=
+                                DDSURFACEDESC2 *DDSD)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%p)\n", This, DDSD);=0A=
+    return IDirectDraw4_GetDisplayMode(This->parent, DDSD);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_GetDisplayMode(IDirectDraw3 *iface,=0A=
+                                DDSURFACEDESC *DDSD)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    DDSURFACEDESC2 ddsd2;=0A=
+    HRESULT hr;=0A=
+=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, DDSD);=0A=
+    hr =3D IDirectDraw4_GetDisplayMode(dd4_from_impl(This), &ddsd2);=0A=
+    DDSD2_to_DDSD(&ddsd2, DDSD);=0A=
+    return hr;=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_GetDisplayMode(IDirectDraw2 *iface,=0A=
+                                DDSURFACEDESC *DDSD)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw3\n", This, DDSD);=0A=
+    return IDirectDraw3_GetDisplayMode(dd3_from_impl(This), DDSD);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_GetDisplayMode(IDirectDraw *iface,=0A=
+                               DDSURFACEDESC *DDSD)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw3\n", This, DDSD);=0A=
+    return IDirectDraw3_GetDisplayMode(dd3_from_impl(This), DDSD);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_GetFourCCCodes(IDirectDraw4 *iface,=0A=
+                                DWORD *NumCodes,=0A=
+                                DWORD *Codes)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%p, %p):\n", This, NumCodes, Codes);=0A=
+    return IDirectDraw4_GetFourCCCodes(This->parent, NumCodes, Codes);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_GetFourCCCodes(IDirectDraw3 *iface,=0A=
+                                DWORD *NumCodes,=0A=
+                                DWORD *Codes)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("(%p)->(%p, %p): Thunking to IDirectDraw4\n", This, NumCodes, =
Codes);=0A=
+    return IDirectDraw4_GetFourCCCodes(dd4_from_impl(This), NumCodes, =
Codes);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_GetFourCCCodes(IDirectDraw2 *iface,=0A=
+                                DWORD *NumCodes,=0A=
+                                DWORD *Codes)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(%p, %p): Thunking to IDirectDraw4\n", This, NumCodes, =
Codes);=0A=
+    return IDirectDraw4_GetFourCCCodes(dd4_from_impl(This), NumCodes, =
Codes);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_GetFourCCCodes(IDirectDraw *iface,=0A=
+                               DWORD *NumCodes,=0A=
+                               DWORD *Codes)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(%p, %p): Thunking to IDirectDraw4\n", This, NumCodes, =
Codes);=0A=
+    return IDirectDraw4_GetFourCCCodes(dd4_from_impl(This), NumCodes, =
Codes);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_GetGDISurface(IDirectDraw4 *iface,=0A=
+                               IDirectDrawSurface4 **GDISurface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%p)\n", This, GDISurface);=0A=
+    return IDirectDraw4_GetGDISurface(This->parent, GDISurface);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_GetGDISurface(IDirectDraw3 *iface,=0A=
+                               IDirectDrawSurface **GDISurface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    IDirectDrawSurface4 *surf4;=0A=
+    HRESULT hr;=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, GDISurface);=0A=
+=0A=
+    hr =3D IDirectDraw4_GetGDISurface(dd4_from_impl(This), &surf4);=0A=
+    if(FAILED(hr)) {=0A=
+        *GDISurface =3D NULL;=0A=
+        return hr;=0A=
+    }=0A=
+=0A=
+    /* Release the reference we got from the DDraw4 call, and pass a =
reference to the caller */=0A=
+    IDirectDrawSurface4_QueryInterface(surf4, &IID_IDirectDrawSurface, =
(void **) GDISurface);=0A=
+    IDirectDrawSurface4_Release(surf4);=0A=
+    return hr;=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_GetGDISurface(IDirectDraw2 *iface,=0A=
+                               IDirectDrawSurface **GDISurface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw3\n", This, GDISurface);=0A=
+    return IDirectDraw3_GetGDISurface(dd3_from_impl(This), GDISurface);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_GetGDISurface(IDirectDraw *iface,=0A=
+                              IDirectDrawSurface **GDISurface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw3\n", This, GDISurface);=0A=
+    return IDirectDraw3_GetGDISurface(dd3_from_impl(This), GDISurface);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_GetMonitorFrequency(IDirectDraw4 *iface,=0A=
+                                     DWORD *Freq)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%p)\n", This, Freq);=0A=
+    return IDirectDraw4_GetMonitorFrequency(This->parent, Freq);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_GetMonitorFrequency(IDirectDraw3 *iface,=0A=
+                                     DWORD *Freq)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, Freq);=0A=
+    return IDirectDraw4_GetMonitorFrequency(dd4_from_impl(This), Freq);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_GetMonitorFrequency(IDirectDraw2 *iface,=0A=
+                                     DWORD *Freq)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, Freq);=0A=
+    return IDirectDraw4_GetMonitorFrequency(dd4_from_impl(This), Freq);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_GetMonitorFrequency(IDirectDraw *iface,=0A=
+                                    DWORD *Freq)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, Freq);=0A=
+    return IDirectDraw4_GetMonitorFrequency(dd4_from_impl(This), Freq);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_GetScanLine(IDirectDraw4 *iface,=0A=
+                             DWORD *Scanline)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%p)\n", This, Scanline);=0A=
+    return IDirectDraw4_GetScanLine(This->parent, Scanline);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_GetScanLine(IDirectDraw3 *iface,=0A=
+                             DWORD *Scanline)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, Scanline);=0A=
+    return IDirectDraw4_GetScanLine(dd4_from_impl(This), Scanline);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_GetScanLine(IDirectDraw2 *iface,=0A=
+                             DWORD *Scanline)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, Scanline);=0A=
+    return IDirectDraw4_GetScanLine(dd4_from_impl(This), Scanline);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_GetScanLine(IDirectDraw *iface,=0A=
+                            DWORD *Scanline)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, Scanline);=0A=
+    return IDirectDraw4_GetScanLine(dd4_from_impl(This), Scanline);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_GetVerticalBlankStatus(IDirectDraw4 *iface,=0A=
+                                        BOOL *status)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%p)\n", This, status);=0A=
+    return IDirectDraw4_GetVerticalBlankStatus(This->parent, status);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_GetVerticalBlankStatus(IDirectDraw3 *iface,=0A=
+                                        BOOL *status)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, status);=0A=
+    return IDirectDraw4_GetVerticalBlankStatus(dd4_from_impl(This), =
status);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_GetVerticalBlankStatus(IDirectDraw2 *iface,=0A=
+                                        BOOL *status)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, status);=0A=
+    return IDirectDraw4_GetVerticalBlankStatus(dd4_from_impl(This), =
status);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_GetVerticalBlankStatus(IDirectDraw *iface,=0A=
+                                       BOOL *status)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, status);=0A=
+    return IDirectDraw4_GetVerticalBlankStatus(dd4_from_impl(This), =
status);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_Initialize(IDirectDraw4 *iface,=0A=
+                            GUID *Guid)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%s)\n", This, debugstr_guid(Guid));=0A=
+    return IDirectDraw4_Initialize(This->parent, Guid);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_Initialize(IDirectDraw3 *iface,=0A=
+                            GUID *Guid)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("(%p)->(%s): Thunking to IDirectDraw4\n", This, =
debugstr_guid(Guid));=0A=
+    return IDirectDraw4_Initialize(dd4_from_impl(This), Guid);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_Initialize(IDirectDraw2 *iface,=0A=
+                            GUID *Guid)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(%s): Thunking to IDirectDraw4\n", This, =
debugstr_guid(Guid));=0A=
+    return IDirectDraw4_Initialize(dd4_from_impl(This), Guid);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_Initialize(IDirectDraw *iface,=0A=
+                           GUID *Guid)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(%s): Thunking to IDirectDraw4\n", This, =
debugstr_guid(Guid));=0A=
+    return IDirectDraw4_Initialize(dd4_from_impl(This), Guid);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_RestoreDisplayMode(IDirectDraw4 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)\n", This);=0A=
+    return IDirectDraw4_RestoreDisplayMode(This->parent);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_RestoreDisplayMode(IDirectDraw3 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("(%p): Thunking to IDirectDraw4\n", This);=0A=
+    return IDirectDraw4_RestoreDisplayMode(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_RestoreDisplayMode(IDirectDraw2 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p): Thunking to IDirectDraw4\n", This);=0A=
+    return IDirectDraw4_RestoreDisplayMode(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_RestoreDisplayMode(IDirectDraw *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p): Thunking to IDirectDraw4\n", This);=0A=
+    return IDirectDraw4_RestoreDisplayMode(dd4_from_impl(This));=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_SetCooperativeLevel(IDirectDraw4 *iface,=0A=
+                                     HWND hwnd,=0A=
+                                     DWORD cooplevel)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%p, 0x%08x)\n", This, hwnd, cooplevel);=0A=
+    return IDirectDraw4_SetCooperativeLevel(This->parent, hwnd, =
cooplevel);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_SetCooperativeLevel(IDirectDraw3 *iface,=0A=
+                                     HWND hwnd,=0A=
+                                     DWORD cooplevel)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("(%p)->(%p, 0x%08x): Thunking to IDirectDraw4\n", This, hwnd, =
cooplevel);=0A=
+    return IDirectDraw4_SetCooperativeLevel(dd4_from_impl(This), hwnd, =
cooplevel);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_SetCooperativeLevel(IDirectDraw2 *iface,=0A=
+                                     HWND hwnd,=0A=
+                                     DWORD cooplevel)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(%p, 0x%08x): Thunking to IDirectDraw4\n", This, hwnd, =
cooplevel);=0A=
+    return IDirectDraw4_SetCooperativeLevel(dd4_from_impl(This), hwnd, =
cooplevel);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_SetCooperativeLevel(IDirectDraw *iface,=0A=
+                                    HWND hwnd,=0A=
+                                    DWORD cooplevel)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(%p, 0x%08x): Thunking to IDirectDraw4\n", This, hwnd, =
cooplevel);=0A=
+    return IDirectDraw4_SetCooperativeLevel(dd4_from_impl(This), hwnd, =
cooplevel);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_SetDisplayMode(IDirectDraw4 *iface,=0A=
+                                DWORD Width,=0A=
+                                DWORD Height,=0A=
+                                DWORD BPP,=0A=
+                                DWORD RefreshRate,=0A=
+                                DWORD Flags)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%u, %u, %u, %u, 0x%08x)\n", This, Width, Height, BPP, =
RefreshRate, Flags);=0A=
+    return IDirectDraw4_SetDisplayMode(This->parent, Width, Height, =
BPP, RefreshRate, Flags);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_SetDisplayMode(IDirectDraw3 *iface,=0A=
+                                DWORD Width,=0A=
+                                DWORD Height,=0A=
+                                DWORD BPP,=0A=
+                                DWORD RefreshRate,=0A=
+                                DWORD Flags)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("(%p)->(%u, %u, %u, %u, 0x%08x): Thunking to IDirectDraw4\n", =
This, Width, Height, BPP, RefreshRate, Flags);=0A=
+    return IDirectDraw3_SetDisplayMode(dd4_from_impl(This), Width, =
Height, BPP, RefreshRate, Flags);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_SetDisplayMode(IDirectDraw2 *iface,=0A=
+                                DWORD Width,=0A=
+                                DWORD Height,=0A=
+                                DWORD BPP,=0A=
+                                DWORD RefreshRate,=0A=
+                                DWORD Flags)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(%u, %u, %u, %u, 0x%08x): Thunking to IDirectDraw4\n", =
This, Width, Height, BPP, RefreshRate, Flags);=0A=
+    return IDirectDraw3_SetDisplayMode(dd4_from_impl(This), Width, =
Height, BPP, RefreshRate, Flags);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_SetDisplayMode(IDirectDraw *iface,=0A=
+                               DWORD Width,=0A=
+                               DWORD Height,=0A=
+                               DWORD BPP)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(%u, %u, %u): Thunking to IDirectDraw4\n", This, =
Width, Height, BPP);=0A=
+    return IDirectDraw3_SetDisplayMode(dd4_from_impl(This), Width, =
Height, BPP, 0, 0);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_WaitForVerticalBlank(IDirectDraw4 *iface,=0A=
+                                      DWORD Flags,=0A=
+                                      HANDLE h)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(0x%08x, %p)\n", This, Flags, h);=0A=
+    return IDirectDraw4_WaitForVerticalBlank(This->parent, Flags, h);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_WaitForVerticalBlank(IDirectDraw3 *iface,=0A=
+                                      DWORD Flags,=0A=
+                                      HANDLE h)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    TRACE("(%p)->(0x%08x, %p): Thunking to IDirectDraw4\n", This, =
Flags, h);=0A=
+    return IDirectDraw4_WaitForVerticalBlank(dd4_from_impl(This), =
Flags, h);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_WaitForVerticalBlank(IDirectDraw2 *iface,=0A=
+                                      DWORD Flags,=0A=
+                                      HANDLE h)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    TRACE("(%p)->(0x%08x, %p): Thunking to IDirectDraw4\n", This, =
Flags, h);=0A=
+    return IDirectDraw4_WaitForVerticalBlank(dd4_from_impl(This), =
Flags, h);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDrawImpl_WaitForVerticalBlank(IDirectDraw *iface,=0A=
+                                     DWORD Flags,=0A=
+                                     HANDLE h)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd1(iface);=0A=
+    TRACE("(%p)->(0x%08x, %p): Thunking to IDirectDraw4\n", This, =
Flags, h);=0A=
+    return IDirectDraw4_WaitForVerticalBlank(dd4_from_impl(This), =
Flags, h);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_GetAvailableVidMem(IDirectDraw4 *iface,=0A=
+                                    DDSCAPS2 *Caps,=0A=
+                                    DWORD *total,=0A=
+                                    DWORD *free)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%p, %p, %p)\n", This, Caps, total, free);=0A=
+    return IDirectDraw4_GetAvailableVidMem(This->parent, Caps, total, =
free);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_GetAvailableVidMem(IDirectDraw3 *iface,=0A=
+                                    DDSCAPS *Caps,=0A=
+                                    DWORD *total,=0A=
+                                    DWORD *free)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    DDSCAPS2 caps2;=0A=
+    TRACE("(%p)->(%p, %p, %p): Thunking to IDirectDraw4\n", This, Caps, =
total, free);=0A=
+    memset(&caps2, 0, sizeof(caps2));=0A=
+    caps2.dwCaps =3D Caps->dwCaps;=0A=
+    return IDirectDraw4_GetAvailableVidMem(dd4_from_impl(This), &caps2, =
total, free);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw2Impl_GetAvailableVidMem(IDirectDraw2 *iface,=0A=
+                                    DDSCAPS *Caps,=0A=
+                                    DWORD *total,=0A=
+                                    DWORD *free)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd2(iface);=0A=
+    DDSCAPS2 caps2;=0A=
+    TRACE("(%p)->(%p, %p, %p): Thunking to IDirectDraw4\n", This, Caps, =
total, free);=0A=
+    memset(&caps2, 0, sizeof(caps2));=0A=
+    caps2.dwCaps =3D Caps->dwCaps;=0A=
+    return IDirectDraw4_GetAvailableVidMem(dd4_from_impl(This), &caps2, =
total, free);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_GetSurfaceFromDC(IDirectDraw4 *iface,=0A=
+                                  HDC hdc,=0A=
+                                  IDirectDrawSurface4 **Surface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%p, %p)\n", This, hdc, Surface);=0A=
+    return IDirectDraw4_GetSurfaceFromDC(This->parent,hdc, Surface);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw3Impl_GetSurfaceFromDC(IDirectDraw3 *iface,=0A=
+                                  HDC hdc,=0A=
+                                  IDirectDrawSurface **Surface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd3(iface);=0A=
+    IDirectDrawSurface4 *surf4;=0A=
+    HRESULT hr;=0A=
+    TRACE("(%p)->(%p, %p): Thunking to IDirectDraw4\n", This, hdc, =
Surface);=0A=
+=0A=
+    hr =3D IDirectDraw4_GetSurfaceFromDC(dd4_from_impl(This), hdc, =
&surf4);=0A=
+    if(FAILED(hr))=0A=
+    {=0A=
+        *Surface =3D NULL;=0A=
+        return hr;=0A=
+    }=0A=
+    IDirectDrawSurface4_QueryInterface(surf4, &IID_IDirectDrawSurface, =
(void **) Surface);=0A=
+    IDirectDrawSurface4_Release(surf4);=0A=
+    return hr;=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_RestoreAllSurfaces(IDirectDraw4 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)\n", This);=0A=
+    return IDirectDraw4_RestoreAllSurfaces(This->parent);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_TestCooperativeLevel(IDirectDraw4 *iface)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)\n", This);=0A=
+    return IDirectDraw4_TestCooperativeLevel(This->parent);=0A=
+}=0A=
+=0A=
+static HRESULT WINAPI=0A=
+IDirectDraw4Impl_GetDeviceIdentifier(IDirectDraw4 *iface,=0A=
+                                     DDDEVICEIDENTIFIER *DDDI,=0A=
+                                     DWORD Flags)=0A=
+{=0A=
+    IDirectDrawImpl *This =3D impl_from_dd4(iface);=0A=
+    TRACE("(%p)->(%p,0x%08x)\n", This, DDDI, Flags);=0A=
+    return IDirectDraw4_GetDeviceIdentifier(This->parent, DDDI, Flags);=0A=
+}=0A=
+=0A=
+static const IDirectDrawVtbl IDirectDraw1_Vtbl =3D=0A=
+{=0A=
+    IDirectDrawImpl_QueryInterface,=0A=
+    IDirectDrawImpl_AddRef,=0A=
+    IDirectDrawImpl_Release,=0A=
+    IDirectDrawImpl_Compact,=0A=
+    IDirectDrawImpl_CreateClipper,=0A=
+    IDirectDrawImpl_CreatePalette,=0A=
+    IDirectDrawImpl_CreateSurface,=0A=
+    IDirectDrawImpl_DuplicateSurface,=0A=
+    IDirectDrawImpl_EnumDisplayModes,=0A=
+    IDirectDrawImpl_EnumSurfaces,=0A=
+    IDirectDrawImpl_FlipToGDISurface,=0A=
+    IDirectDrawImpl_GetCaps,=0A=
+    IDirectDrawImpl_GetDisplayMode,=0A=
+    IDirectDrawImpl_GetFourCCCodes,=0A=
+    IDirectDrawImpl_GetGDISurface,=0A=
+    IDirectDrawImpl_GetMonitorFrequency,=0A=
+    IDirectDrawImpl_GetScanLine,=0A=
+    IDirectDrawImpl_GetVerticalBlankStatus,=0A=
+    IDirectDrawImpl_Initialize,=0A=
+    IDirectDrawImpl_RestoreDisplayMode,=0A=
+    IDirectDrawImpl_SetCooperativeLevel,=0A=
+    IDirectDrawImpl_SetDisplayMode,=0A=
+    IDirectDrawImpl_WaitForVerticalBlank,=0A=
+};=0A=
+=0A=
+static const IDirectDraw2Vtbl IDirectDraw2_Vtbl =3D=0A=
+{=0A=
+    IDirectDraw2Impl_QueryInterface,=0A=
+    IDirectDraw2Impl_AddRef,=0A=
+    IDirectDraw2Impl_Release,=0A=
+    IDirectDraw2Impl_Compact,=0A=
+    IDirectDraw2Impl_CreateClipper,=0A=
+    IDirectDraw2Impl_CreatePalette,=0A=
+    IDirectDraw2Impl_CreateSurface,=0A=
+    IDirectDraw2Impl_DuplicateSurface,=0A=
+    IDirectDraw2Impl_EnumDisplayModes,=0A=
+    IDirectDraw2Impl_EnumSurfaces,=0A=
+    IDirectDraw2Impl_FlipToGDISurface,=0A=
+    IDirectDraw2Impl_GetCaps,=0A=
+    IDirectDraw2Impl_GetDisplayMode,=0A=
+    IDirectDraw2Impl_GetFourCCCodes,=0A=
+    IDirectDraw2Impl_GetGDISurface,=0A=
+    IDirectDraw2Impl_GetMonitorFrequency,=0A=
+    IDirectDraw2Impl_GetScanLine,=0A=
+    IDirectDraw2Impl_GetVerticalBlankStatus,=0A=
+    IDirectDraw2Impl_Initialize,=0A=
+    IDirectDraw2Impl_RestoreDisplayMode,=0A=
+    IDirectDraw2Impl_SetCooperativeLevel,=0A=
+    IDirectDraw2Impl_SetDisplayMode,=0A=
+    IDirectDraw2Impl_WaitForVerticalBlank,=0A=
+    IDirectDraw2Impl_GetAvailableVidMem=0A=
+};=0A=
+=0A=
+static const IDirectDraw3Vtbl IDirectDraw3_Vtbl =3D=0A=
+{=0A=
+    IDirectDraw3Impl_QueryInterface,=0A=
+    IDirectDraw3Impl_AddRef,=0A=
+    IDirectDraw3Impl_Release,=0A=
+    IDirectDraw3Impl_Compact,=0A=
+    IDirectDraw3Impl_CreateClipper,=0A=
+    IDirectDraw3Impl_CreatePalette,=0A=
+    IDirectDraw3Impl_CreateSurface,=0A=
+    IDirectDraw3Impl_DuplicateSurface,=0A=
+    IDirectDraw3Impl_EnumDisplayModes,=0A=
+    IDirectDraw3Impl_EnumSurfaces,=0A=
+    IDirectDraw3Impl_FlipToGDISurface,=0A=
+    IDirectDraw3Impl_GetCaps,=0A=
+    IDirectDraw3Impl_GetDisplayMode,=0A=
+    IDirectDraw3Impl_GetFourCCCodes,=0A=
+    IDirectDraw3Impl_GetGDISurface,=0A=
+    IDirectDraw3Impl_GetMonitorFrequency,=0A=
+    IDirectDraw3Impl_GetScanLine,=0A=
+    IDirectDraw3Impl_GetVerticalBlankStatus,=0A=
+    IDirectDraw3Impl_Initialize,=0A=
+    IDirectDraw3Impl_RestoreDisplayMode,=0A=
+    IDirectDraw3Impl_SetCooperativeLevel,=0A=
+    IDirectDraw3Impl_SetDisplayMode,=0A=
+    IDirectDraw3Impl_WaitForVerticalBlank,=0A=
+    IDirectDraw3Impl_GetAvailableVidMem,=0A=
+    IDirectDraw3Impl_GetSurfaceFromDC,=0A=
+};=0A=
+=0A=
+static const IDirectDraw4Vtbl IDirectDraw4_Vtbl =3D=0A=
+{=0A=
+    IDirectDraw4Impl_QueryInterface,=0A=
+    IDirectDraw4Impl_AddRef,=0A=
+    IDirectDraw4Impl_Release,=0A=
+    IDirectDraw4Impl_Compact,=0A=
+    IDirectDraw4Impl_CreateClipper,=0A=
+    IDirectDraw4Impl_CreatePalette,=0A=
+    IDirectDraw4Impl_CreateSurface,=0A=
+    IDirectDraw4Impl_DuplicateSurface,=0A=
+    IDirectDraw4Impl_EnumDisplayModes,=0A=
+    IDirectDraw4Impl_EnumSurfaces,=0A=
+    IDirectDraw4Impl_FlipToGDISurface,=0A=
+    IDirectDraw4Impl_GetCaps,=0A=
+    IDirectDraw4Impl_GetDisplayMode,=0A=
+    IDirectDraw4Impl_GetFourCCCodes,=0A=
+    IDirectDraw4Impl_GetGDISurface,=0A=
+    IDirectDraw4Impl_GetMonitorFrequency,=0A=
+    IDirectDraw4Impl_GetScanLine,=0A=
+    IDirectDraw4Impl_GetVerticalBlankStatus,=0A=
+    IDirectDraw4Impl_Initialize,=0A=
+    IDirectDraw4Impl_RestoreDisplayMode,=0A=
+    IDirectDraw4Impl_SetCooperativeLevel,=0A=
+    IDirectDraw4Impl_SetDisplayMode,=0A=
+    IDirectDraw4Impl_WaitForVerticalBlank,=0A=
+    IDirectDraw4Impl_GetAvailableVidMem,=0A=
+    IDirectDraw4Impl_GetSurfaceFromDC,=0A=
+    IDirectDraw4Impl_RestoreAllSurfaces,=0A=
+    IDirectDraw4Impl_TestCooperativeLevel,=0A=
+    IDirectDraw4Impl_GetDeviceIdentifier=0A=
+};=0A=
+=0A=
+/***********************************************************************=
********=0A=
+ * IDirectDrawFactoryImpl_CreateDirectDraw=0A=
+ =
*************************************************************************=
******/=0A=
+HRESULT WINAPI=0A=
+IDirectDrawFactoryImpl_CreateDirectDraw(IDirectDrawFactory* iface,=0A=
+                                        GUID * pGUID,=0A=
+                                        HWND hWnd,=0A=
+                                        DWORD dwCoopLevelFlags,=0A=
+                                        DWORD dwReserved,=0A=
+                                        IUnknown *pUnkOuter,=0A=
+                                        IDirectDraw **ppDirectDraw)=0A=
+{=0A=
+    HRESULT hr;=0A=
+    IDirectDrawImpl *object =3D NULL;=0A=
+    IDirectDraw *parent =3D NULL;=0A=
+=0A=
+    TRACE("(%p)->(%s,%p,0x%08x,0x%08x,%p,%p)", iface, =
debugstr_guid(pGUID), hWnd, dwCoopLevelFlags,=0A=
+          dwReserved, pUnkOuter, ppDirectDraw);=0A=
+=0A=
+    if(pUnkOuter)=0A=
+    {=0A=
+        FIXME("Implement aggregation in ddrawex's IDirectDraw =
interface\n");=0A=
+    }=0A=
+=0A=
+    object =3D HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, =
sizeof(*object));=0A=
+    if(!object)=0A=
+    {=0A=
+        ERR("Out of memory\n");=0A=
+        hr =3D E_OUTOFMEMORY;=0A=
+        goto err;=0A=
+    }=0A=
+    object->ref =3D 1;=0A=
+    object->IDirectDraw_Vtbl  =3D &IDirectDraw1_Vtbl;=0A=
+    object->IDirectDraw2_Vtbl =3D &IDirectDraw2_Vtbl;=0A=
+    object->IDirectDraw3_Vtbl =3D &IDirectDraw3_Vtbl;=0A=
+    object->IDirectDraw4_Vtbl =3D &IDirectDraw4_Vtbl;=0A=
+=0A=
+    hr =3D DirectDrawCreate(pGUID, &parent, NULL);=0A=
+    if (FAILED(hr)) goto err;=0A=
+=0A=
+    hr =3D IDirectDraw_QueryInterface(parent, &IID_IDirectDraw4, (void =
**) &object->parent);=0A=
+    if(FAILED(hr)) goto err;=0A=
+=0A=
+    hr =3D IDirectDraw_SetCooperativeLevel(dd1_from_impl(object), hWnd, =
dwCoopLevelFlags);=0A=
+    if (FAILED(hr)) goto err;=0A=
+=0A=
+    *ppDirectDraw =3D dd1_from_impl(object);=0A=
+    IDirectDraw_Release(parent);=0A=
+    return DD_OK;=0A=
+=0A=
+err:=0A=
+    if(object && object->parent) IDirectDraw4_Release(object->parent);=0A=
+    if(parent) IDirectDraw_Release(parent);=0A=
+    if(object) HeapFree(GetProcessHeap(), 0, object);=0A=
+    *ppDirectDraw =3D NULL;=0A=
+    return hr;=0A=
+}=0A=
diff --git a/dlls/ddrawex/ddrawex_private.h =
b/dlls/ddrawex/ddrawex_private.h=0A=
index 117ddba..e9396db 100644=0A=
--- a/dlls/ddrawex/ddrawex_private.h=0A=
+++ b/dlls/ddrawex/ddrawex_private.h=0A=
@@ -55,7 +55,7 @@ typedef struct=0A=
 =0A=
 =0A=
 =
/************************************************************************=
******=0A=
- * DirectDrawFactopry implementation=0A=
+ * DirectDrawFactory implementation=0A=
  =
*************************************************************************=
*****/=0A=
 typedef struct=0A=
 {=0A=
@@ -63,4 +63,23 @@ typedef struct=0A=
     LONG ref;=0A=
 } IDirectDrawFactoryImpl;=0A=
 =0A=
+HRESULT WINAPI =
IDirectDrawFactoryImpl_CreateDirectDraw(IDirectDrawFactory* iface,=0A=
+    GUID * pGUID, HWND hWnd, DWORD dwCoopLevelFlags, DWORD dwReserved, =
IUnknown *pUnkOuter,=0A=
+    IDirectDraw **ppDirectDraw);=0A=
+=0A=
+/***********************************************************************=
*******=0A=
+ * IDirectDraw wrapper implementation=0A=
+ =
*************************************************************************=
*****/=0A=
+typedef struct=0A=
+{=0A=
+    const IDirectDrawVtbl *IDirectDraw_Vtbl;=0A=
+    const IDirectDraw2Vtbl *IDirectDraw2_Vtbl;=0A=
+    const IDirectDraw3Vtbl *IDirectDraw3_Vtbl;=0A=
+    const IDirectDraw4Vtbl *IDirectDraw4_Vtbl;=0A=
+    LONG ref;=0A=
+=0A=
+    /* The interface we're forwarding to */=0A=
+    IDirectDraw4 *parent;=0A=
+} IDirectDrawImpl;=0A=
+=0A=
 #endif /* __WINE_DLLS_DDRAWEX_DDRAWEX_PRIVATE_H */=0A=
diff --git a/dlls/ddrawex/main.c b/dlls/ddrawex/main.c=0A=
index 6befb95..de63f23 100644=0A=
--- a/dlls/ddrawex/main.c=0A=
+++ b/dlls/ddrawex/main.c=0A=
@@ -33,7 +33,7 @@=0A=
 #include "initguid.h"=0A=
 #include "ddrawex_private.h"=0A=
 =0A=
-WINE_DEFAULT_DEBUG_CHANNEL(ddraw);=0A=
+WINE_DEFAULT_DEBUG_CHANNEL(ddrawex);=0A=
 =0A=
 =0A=
 =
/************************************************************************=
*******=0A=
@@ -194,36 +194,6 @@ IDirectDrawFactoryImpl_Release(IDirectDrawFactory =
*iface)=0A=
     return ref;=0A=
 }=0A=
 =0A=
-=0A=
-/***********************************************************************=
********=0A=
- * IDirectDrawFactoryImpl_CreateDirectDraw=0A=
- =
*************************************************************************=
******/=0A=
-static HRESULT WINAPI=0A=
-IDirectDrawFactoryImpl_CreateDirectDraw(IDirectDrawFactory* iface,=0A=
-                                        GUID * pGUID,=0A=
-                                        HWND hWnd,=0A=
-                                        DWORD dwCoopLevelFlags,=0A=
-                                        DWORD dwReserved,=0A=
-                                        IUnknown *pUnkOuter,=0A=
-                                        IDirectDraw **ppDirectDraw)=0A=
-{=0A=
-    HRESULT hr;=0A=
-=0A=
-    TRACE("\n");=0A=
-=0A=
-    hr =3D DirectDrawCreateEx(pGUID, (void**)ppDirectDraw, =
&IID_IDirectDraw3, pUnkOuter);=0A=
-=0A=
-    if (FAILED(hr))=0A=
-        return hr;=0A=
-=0A=
-    hr =3D IDirectDraw_SetCooperativeLevel(*ppDirectDraw, hWnd, =
dwCoopLevelFlags);=0A=
-    if (FAILED(hr))=0A=
-        IDirectDraw_Release(*ppDirectDraw);=0A=
-=0A=
-    return hr;=0A=
-}=0A=
-=0A=
-=0A=
 =
/************************************************************************=
*******=0A=
  * IDirectDrawFactoryImpl_DirectDrawEnumerate=0A=
  =
*************************************************************************=
******/=0A=
-- =0A=
1.6.0.6=0A=
=0A=

------=_NextPart_000_0007_01C97257.0F2935D0--




More information about the wine-patches mailing list