[PATCH 7/7] ddrawex: COM cleanup for the IDirectDraw4 iface.

Michael Stefaniuc mstefani at redhat.de
Sun Jan 23 14:48:10 CST 2011


---
 dlls/ddrawex/ddraw.c           |  139 +++++++++++++++++++++-------------------
 dlls/ddrawex/ddrawex_private.h |    2 +-
 2 files changed, 73 insertions(+), 68 deletions(-)

diff --git a/dlls/ddrawex/ddraw.c b/dlls/ddrawex/ddraw.c
index 70448ca..ab3c731 100644
--- a/dlls/ddrawex/ddraw.c
+++ b/dlls/ddrawex/ddraw.c
@@ -52,11 +52,7 @@ static IDirectDrawImpl *impl_from_IDirectDraw3(IDirectDraw3 *iface)
 
 static IDirectDrawImpl *impl_from_IDirectDraw4(IDirectDraw4 *iface)
 {
-    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirectDraw4_Vtbl));
-}
-static IDirectDraw4 *dd4_from_impl(IDirectDrawImpl *This)
-{
-    return (IDirectDraw4 *) &This->IDirectDraw4_Vtbl;
+    return CONTAINING_RECORD(iface, IDirectDrawImpl, IDirectDraw4_iface);
 }
 
 /******************************************************************************
@@ -83,9 +79,9 @@ static HRESULT WINAPI IDirectDraw4Impl_QueryInterface(IDirectDraw4 *iface, REFII
     else if ( IsEqualGUID( &IID_IUnknown, refiid ) ||
               IsEqualGUID( &IID_IDirectDraw4, refiid ) )
     {
-        *obj = dd4_from_impl(This);
+        *obj = &This->IDirectDraw4_iface;
         TRACE("(%p) Returning IDirectDraw4 interface at %p\n", This, *obj);
-        IDirectDraw4_AddRef((IDirectDraw4 *) *obj);
+        IDirectDraw4_AddRef(&This->IDirectDraw4_iface);
     }
     else if ( IsEqualGUID( &IID_IDirectDraw3, refiid ) )
     {
@@ -128,7 +124,7 @@ static HRESULT WINAPI IDirectDraw3Impl_QueryInterface(IDirectDraw3 *iface, REFII
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_QueryInterface(dd4_from_impl(This), refiid, obj);
+    return IDirectDraw4_QueryInterface(&This->IDirectDraw4_iface, refiid, obj);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_QueryInterface(IDirectDraw2 *iface, REFIID refiid,
@@ -136,14 +132,14 @@ static HRESULT WINAPI IDirectDraw2Impl_QueryInterface(IDirectDraw2 *iface, REFII
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_QueryInterface(dd4_from_impl(This), refiid, obj);
+    return IDirectDraw4_QueryInterface(&This->IDirectDraw4_iface, refiid, obj);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_QueryInterface(IDirectDraw *iface, REFIID refiid, void **obj)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_QueryInterface(dd4_from_impl(This), refiid, obj);
+    return IDirectDraw4_QueryInterface(&This->IDirectDraw4_iface, refiid, obj);
 }
 
 static ULONG WINAPI IDirectDraw4Impl_AddRef(IDirectDraw4 *iface)
@@ -160,21 +156,21 @@ static ULONG WINAPI IDirectDraw3Impl_AddRef(IDirectDraw3 *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_AddRef(dd4_from_impl(This));
+    return IDirectDraw4_AddRef(&This->IDirectDraw4_iface);
 }
 
 static ULONG WINAPI IDirectDraw2Impl_AddRef(IDirectDraw2 *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_AddRef(dd4_from_impl(This));
+    return IDirectDraw4_AddRef(&This->IDirectDraw4_iface);
 }
 
 static ULONG WINAPI IDirectDrawImpl_AddRef(IDirectDraw *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_AddRef(dd4_from_impl(This));
+    return IDirectDraw4_AddRef(&This->IDirectDraw4_iface);
 }
 
 static ULONG WINAPI IDirectDraw4Impl_Release(IDirectDraw4 *iface)
@@ -197,21 +193,21 @@ static ULONG WINAPI IDirectDraw3Impl_Release(IDirectDraw3 *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_Release(dd4_from_impl(This));
+    return IDirectDraw4_Release(&This->IDirectDraw4_iface);
 }
 
 static ULONG WINAPI IDirectDraw2Impl_Release(IDirectDraw2 *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_Release(dd4_from_impl(This));
+    return IDirectDraw4_Release(&This->IDirectDraw4_iface);
 }
 
 static ULONG WINAPI IDirectDrawImpl_Release(IDirectDraw *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_Release(dd4_from_impl(This));
+    return IDirectDraw4_Release(&This->IDirectDraw4_iface);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_Compact(IDirectDraw4 *iface)
@@ -226,21 +222,21 @@ static HRESULT WINAPI IDirectDraw3Impl_Compact(IDirectDraw3 *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_Compact(dd4_from_impl(This));
+    return IDirectDraw4_Compact(&This->IDirectDraw4_iface);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_Compact(IDirectDraw2 *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_Compact(dd4_from_impl(This));
+    return IDirectDraw4_Compact(&This->IDirectDraw4_iface);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_Compact(IDirectDraw *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_Compact(dd4_from_impl(This));
+    return IDirectDraw4_Compact(&This->IDirectDraw4_iface);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_CreateClipper(IDirectDraw4 *iface, DWORD Flags,
@@ -263,7 +259,7 @@ static HRESULT WINAPI IDirectDraw3Impl_CreateClipper(IDirectDraw3 *iface, DWORD
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_CreateClipper(dd4_from_impl(This), Flags, clipper, UnkOuter);
+    return IDirectDraw4_CreateClipper(&This->IDirectDraw4_iface, Flags, clipper, UnkOuter);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_CreateClipper(IDirectDraw2 *iface, DWORD Flags,
@@ -271,7 +267,7 @@ static HRESULT WINAPI IDirectDraw2Impl_CreateClipper(IDirectDraw2 *iface, DWORD
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_CreateClipper(dd4_from_impl(This), Flags, clipper, UnkOuter);
+    return IDirectDraw4_CreateClipper(&This->IDirectDraw4_iface, Flags, clipper, UnkOuter);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_CreateClipper(IDirectDraw *iface, DWORD Flags,
@@ -279,7 +275,7 @@ static HRESULT WINAPI IDirectDrawImpl_CreateClipper(IDirectDraw *iface, DWORD Fl
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_CreateClipper(dd4_from_impl(This), Flags, clipper, UnkOuter);
+    return IDirectDraw4_CreateClipper(&This->IDirectDraw4_iface, Flags, clipper, UnkOuter);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_CreatePalette(IDirectDraw4 *iface, DWORD Flags,
@@ -302,7 +298,8 @@ static HRESULT WINAPI IDirectDraw3Impl_CreatePalette(IDirectDraw3 *iface, DWORD
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_CreatePalette(dd4_from_impl(This), Flags, ColorTable, Palette, UnkOuter);
+    return IDirectDraw4_CreatePalette(&This->IDirectDraw4_iface, Flags, ColorTable, Palette,
+            UnkOuter);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_CreatePalette(IDirectDraw2 *iface, DWORD Flags,
@@ -310,7 +307,8 @@ static HRESULT WINAPI IDirectDraw2Impl_CreatePalette(IDirectDraw2 *iface, DWORD
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_CreatePalette(dd4_from_impl(This), Flags, ColorTable, Palette, UnkOuter);
+    return IDirectDraw4_CreatePalette(&This->IDirectDraw4_iface, Flags, ColorTable, Palette,
+            UnkOuter);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_CreatePalette(IDirectDraw *iface, DWORD Flags,
@@ -318,7 +316,8 @@ static HRESULT WINAPI IDirectDrawImpl_CreatePalette(IDirectDraw *iface, DWORD Fl
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("Thunking to IDirectDraw4\n");
-    return IDirectDraw4_CreatePalette(dd4_from_impl(This), Flags, ColorTable, Palette, UnkOuter);
+    return IDirectDraw4_CreatePalette(&This->IDirectDraw4_iface, Flags, ColorTable, Palette,
+            UnkOuter);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_CreateSurface(IDirectDraw4 *iface, DDSURFACEDESC2 *DDSD,
@@ -427,7 +426,7 @@ static HRESULT WINAPI IDirectDraw3Impl_CreateSurface(IDirectDraw3 *iface, DDSURF
 
     DDSD_to_DDSD2(DDSD, &ddsd2);
 
-    hr = IDirectDraw4_CreateSurface(dd4_from_impl(This), &ddsd2, &surf4, UnkOuter);
+    hr = IDirectDraw4_CreateSurface(&This->IDirectDraw4_iface, &ddsd2, &surf4, UnkOuter);
     if(FAILED(hr))
     {
         *Surf = NULL;
@@ -475,7 +474,7 @@ static HRESULT WINAPI IDirectDraw3Impl_DuplicateSurface(IDirectDraw3 *iface,
 
     TRACE("Thunking to IDirectDraw4\n");
     IDirectDrawSurface_QueryInterface(src, &IID_IDirectDrawSurface4, (void **) &src_4);
-    hr = IDirectDraw4_DuplicateSurface(dd4_from_impl(This), src_4, &dst_4);
+    hr = IDirectDraw4_DuplicateSurface(&This->IDirectDraw4_iface, src_4, &dst_4);
     IDirectDrawSurface4_Release(src_4);
 
     if(FAILED(hr))
@@ -540,7 +539,8 @@ static HRESULT WINAPI IDirectDraw3Impl_EnumDisplayModes(IDirectDraw3 *iface, DWO
     DDSD_to_DDSD2(DDSD, &ddsd2);
     ctx.orig_cb = cb;
     ctx.orig_ctx = Context;
-    return IDirectDraw4_EnumDisplayModes(dd4_from_impl(This), Flags, &ddsd2, &ctx, enum_modes_cb2);
+    return IDirectDraw4_EnumDisplayModes(&This->IDirectDraw4_iface, Flags, &ddsd2, &ctx,
+            enum_modes_cb2);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_EnumDisplayModes(IDirectDraw2 *iface, DWORD Flags,
@@ -621,7 +621,8 @@ static HRESULT WINAPI IDirectDraw3Impl_EnumSurfaces(IDirectDraw3 *iface, DWORD F
     DDSD_to_DDSD2(DDSD, &ddsd2);
     ctx.orig_cb = Callback;
     ctx.orig_ctx = Context;
-    return IDirectDraw4_EnumSurfaces(dd4_from_impl(This), Flags, &ddsd2, &ctx, enum_surfaces_cb2);
+    return IDirectDraw4_EnumSurfaces(&This->IDirectDraw4_iface, Flags, &ddsd2, &ctx,
+            enum_surfaces_cb2);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_EnumSurfaces(IDirectDraw2 *iface, DWORD Flags,
@@ -652,21 +653,21 @@ static HRESULT WINAPI IDirectDraw3Impl_FlipToGDISurface(IDirectDraw3 *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("(%p). Thunking to IDirectDraw4\n", This);
-    return IDirectDraw4_FlipToGDISurface(dd4_from_impl(This));
+    return IDirectDraw4_FlipToGDISurface(&This->IDirectDraw4_iface);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_FlipToGDISurface(IDirectDraw2 *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("(%p). Thunking to IDirectDraw4\n", This);
-    return IDirectDraw4_FlipToGDISurface(dd4_from_impl(This));
+    return IDirectDraw4_FlipToGDISurface(&This->IDirectDraw4_iface);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_FlipToGDISurface(IDirectDraw *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("(%p). Thunking to IDirectDraw4\n", This);
-    return IDirectDraw4_FlipToGDISurface(dd4_from_impl(This));
+    return IDirectDraw4_FlipToGDISurface(&This->IDirectDraw4_iface);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_GetCaps(IDirectDraw4 *iface, DDCAPS *DriverCaps,
@@ -682,7 +683,7 @@ static HRESULT WINAPI IDirectDraw3Impl_GetCaps(IDirectDraw3 *iface, DDCAPS *Driv
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("(%p)->(%p,%p). Thunking to IDirectDraw4\n", This, DriverCaps, HELCaps);
-    return IDirectDraw4_GetCaps(dd4_from_impl(This), DriverCaps, HELCaps);
+    return IDirectDraw4_GetCaps(&This->IDirectDraw4_iface, DriverCaps, HELCaps);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_GetCaps(IDirectDraw2 *iface, DDCAPS *DriverCaps,
@@ -690,7 +691,7 @@ static HRESULT WINAPI IDirectDraw2Impl_GetCaps(IDirectDraw2 *iface, DDCAPS *Driv
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("(%p)->(%p,%p). Thunking to IDirectDraw4\n", This, DriverCaps, HELCaps);
-    return IDirectDraw4_GetCaps(dd4_from_impl(This), DriverCaps, HELCaps);
+    return IDirectDraw4_GetCaps(&This->IDirectDraw4_iface, DriverCaps, HELCaps);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_GetCaps(IDirectDraw *iface, DDCAPS *DriverCaps,
@@ -698,7 +699,7 @@ static HRESULT WINAPI IDirectDrawImpl_GetCaps(IDirectDraw *iface, DDCAPS *Driver
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("(%p)->(%p,%p). Thunking to IDirectDraw4\n", This, DriverCaps, HELCaps);
-    return IDirectDraw4_GetCaps(dd4_from_impl(This), DriverCaps, HELCaps);
+    return IDirectDraw4_GetCaps(&This->IDirectDraw4_iface, DriverCaps, HELCaps);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_GetDisplayMode(IDirectDraw4 *iface, DDSURFACEDESC2 *DDSD)
@@ -715,7 +716,7 @@ static HRESULT WINAPI IDirectDraw3Impl_GetDisplayMode(IDirectDraw3 *iface, DDSUR
     HRESULT hr;
 
     TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, DDSD);
-    hr = IDirectDraw4_GetDisplayMode(dd4_from_impl(This), &ddsd2);
+    hr = IDirectDraw4_GetDisplayMode(&This->IDirectDraw4_iface, &ddsd2);
     DDSD2_to_DDSD(&ddsd2, DDSD);
     return hr;
 }
@@ -747,7 +748,7 @@ static HRESULT WINAPI IDirectDraw3Impl_GetFourCCCodes(IDirectDraw3 *iface, DWORD
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("(%p)->(%p, %p): Thunking to IDirectDraw4\n", This, NumCodes, Codes);
-    return IDirectDraw4_GetFourCCCodes(dd4_from_impl(This), NumCodes, Codes);
+    return IDirectDraw4_GetFourCCCodes(&This->IDirectDraw4_iface, NumCodes, Codes);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_GetFourCCCodes(IDirectDraw2 *iface, DWORD *NumCodes,
@@ -755,7 +756,7 @@ static HRESULT WINAPI IDirectDraw2Impl_GetFourCCCodes(IDirectDraw2 *iface, DWORD
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("(%p)->(%p, %p): Thunking to IDirectDraw4\n", This, NumCodes, Codes);
-    return IDirectDraw4_GetFourCCCodes(dd4_from_impl(This), NumCodes, Codes);
+    return IDirectDraw4_GetFourCCCodes(&This->IDirectDraw4_iface, NumCodes, Codes);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_GetFourCCCodes(IDirectDraw *iface, DWORD *NumCodes,
@@ -763,7 +764,7 @@ static HRESULT WINAPI IDirectDrawImpl_GetFourCCCodes(IDirectDraw *iface, DWORD *
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("(%p)->(%p, %p): Thunking to IDirectDraw4\n", This, NumCodes, Codes);
-    return IDirectDraw4_GetFourCCCodes(dd4_from_impl(This), NumCodes, Codes);
+    return IDirectDraw4_GetFourCCCodes(&This->IDirectDraw4_iface, NumCodes, Codes);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_GetGDISurface(IDirectDraw4 *iface,
@@ -796,7 +797,7 @@ static HRESULT WINAPI IDirectDraw3Impl_GetGDISurface(IDirectDraw3 *iface,
     HRESULT hr;
     TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, GDISurface);
 
-    hr = IDirectDraw4_GetGDISurface(dd4_from_impl(This), &surf4);
+    hr = IDirectDraw4_GetGDISurface(&This->IDirectDraw4_iface, &surf4);
     if(FAILED(hr)) {
         *GDISurface = NULL;
         return hr;
@@ -835,21 +836,21 @@ static HRESULT WINAPI IDirectDraw3Impl_GetMonitorFrequency(IDirectDraw3 *iface,
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, Freq);
-    return IDirectDraw4_GetMonitorFrequency(dd4_from_impl(This), Freq);
+    return IDirectDraw4_GetMonitorFrequency(&This->IDirectDraw4_iface, Freq);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_GetMonitorFrequency(IDirectDraw2 *iface, DWORD *Freq)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, Freq);
-    return IDirectDraw4_GetMonitorFrequency(dd4_from_impl(This), Freq);
+    return IDirectDraw4_GetMonitorFrequency(&This->IDirectDraw4_iface, Freq);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_GetMonitorFrequency(IDirectDraw *iface, DWORD *Freq)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, Freq);
-    return IDirectDraw4_GetMonitorFrequency(dd4_from_impl(This), Freq);
+    return IDirectDraw4_GetMonitorFrequency(&This->IDirectDraw4_iface, Freq);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_GetScanLine(IDirectDraw4 *iface, DWORD *Scanline)
@@ -863,21 +864,21 @@ static HRESULT WINAPI IDirectDraw3Impl_GetScanLine(IDirectDraw3 *iface, DWORD *S
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, Scanline);
-    return IDirectDraw4_GetScanLine(dd4_from_impl(This), Scanline);
+    return IDirectDraw4_GetScanLine(&This->IDirectDraw4_iface, Scanline);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_GetScanLine(IDirectDraw2 *iface, DWORD *Scanline)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, Scanline);
-    return IDirectDraw4_GetScanLine(dd4_from_impl(This), Scanline);
+    return IDirectDraw4_GetScanLine(&This->IDirectDraw4_iface, Scanline);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_GetScanLine(IDirectDraw *iface, DWORD *Scanline)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, Scanline);
-    return IDirectDraw4_GetScanLine(dd4_from_impl(This), Scanline);
+    return IDirectDraw4_GetScanLine(&This->IDirectDraw4_iface, Scanline);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_GetVerticalBlankStatus(IDirectDraw4 *iface, BOOL *status)
@@ -891,21 +892,21 @@ static HRESULT WINAPI IDirectDraw3Impl_GetVerticalBlankStatus(IDirectDraw3 *ifac
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, status);
-    return IDirectDraw4_GetVerticalBlankStatus(dd4_from_impl(This), status);
+    return IDirectDraw4_GetVerticalBlankStatus(&This->IDirectDraw4_iface, status);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_GetVerticalBlankStatus(IDirectDraw2 *iface, BOOL *status)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, status);
-    return IDirectDraw4_GetVerticalBlankStatus(dd4_from_impl(This), status);
+    return IDirectDraw4_GetVerticalBlankStatus(&This->IDirectDraw4_iface, status);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_GetVerticalBlankStatus(IDirectDraw *iface, BOOL *status)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("(%p)->(%p): Thunking to IDirectDraw4\n", This, status);
-    return IDirectDraw4_GetVerticalBlankStatus(dd4_from_impl(This), status);
+    return IDirectDraw4_GetVerticalBlankStatus(&This->IDirectDraw4_iface, status);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_Initialize(IDirectDraw4 *iface, GUID *Guid)
@@ -919,21 +920,21 @@ static HRESULT WINAPI IDirectDraw3Impl_Initialize(IDirectDraw3 *iface, GUID *Gui
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("(%p)->(%s): Thunking to IDirectDraw4\n", This, debugstr_guid(Guid));
-    return IDirectDraw4_Initialize(dd4_from_impl(This), Guid);
+    return IDirectDraw4_Initialize(&This->IDirectDraw4_iface, Guid);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_Initialize(IDirectDraw2 *iface, GUID *Guid)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("(%p)->(%s): Thunking to IDirectDraw4\n", This, debugstr_guid(Guid));
-    return IDirectDraw4_Initialize(dd4_from_impl(This), Guid);
+    return IDirectDraw4_Initialize(&This->IDirectDraw4_iface, Guid);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_Initialize(IDirectDraw *iface, GUID *Guid)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("(%p)->(%s): Thunking to IDirectDraw4\n", This, debugstr_guid(Guid));
-    return IDirectDraw4_Initialize(dd4_from_impl(This), Guid);
+    return IDirectDraw4_Initialize(&This->IDirectDraw4_iface, Guid);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_RestoreDisplayMode(IDirectDraw4 *iface)
@@ -947,21 +948,21 @@ static HRESULT WINAPI IDirectDraw3Impl_RestoreDisplayMode(IDirectDraw3 *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("(%p): Thunking to IDirectDraw4\n", This);
-    return IDirectDraw4_RestoreDisplayMode(dd4_from_impl(This));
+    return IDirectDraw4_RestoreDisplayMode(&This->IDirectDraw4_iface);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_RestoreDisplayMode(IDirectDraw2 *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("(%p): Thunking to IDirectDraw4\n", This);
-    return IDirectDraw4_RestoreDisplayMode(dd4_from_impl(This));
+    return IDirectDraw4_RestoreDisplayMode(&This->IDirectDraw4_iface);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_RestoreDisplayMode(IDirectDraw *iface)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("(%p): Thunking to IDirectDraw4\n", This);
-    return IDirectDraw4_RestoreDisplayMode(dd4_from_impl(This));
+    return IDirectDraw4_RestoreDisplayMode(&This->IDirectDraw4_iface);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_SetCooperativeLevel(IDirectDraw4 *iface, HWND hwnd,
@@ -977,7 +978,7 @@ static HRESULT WINAPI IDirectDraw3Impl_SetCooperativeLevel(IDirectDraw3 *iface,
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("(%p)->(%p, 0x%08x): Thunking to IDirectDraw4\n", This, hwnd, cooplevel);
-    return IDirectDraw4_SetCooperativeLevel(dd4_from_impl(This), hwnd, cooplevel);
+    return IDirectDraw4_SetCooperativeLevel(&This->IDirectDraw4_iface, hwnd, cooplevel);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_SetCooperativeLevel(IDirectDraw2 *iface, HWND hwnd,
@@ -985,7 +986,7 @@ static HRESULT WINAPI IDirectDraw2Impl_SetCooperativeLevel(IDirectDraw2 *iface,
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("(%p)->(%p, 0x%08x): Thunking to IDirectDraw4\n", This, hwnd, cooplevel);
-    return IDirectDraw4_SetCooperativeLevel(dd4_from_impl(This), hwnd, cooplevel);
+    return IDirectDraw4_SetCooperativeLevel(&This->IDirectDraw4_iface, hwnd, cooplevel);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_SetCooperativeLevel(IDirectDraw *iface, HWND hwnd,
@@ -993,7 +994,7 @@ static HRESULT WINAPI IDirectDrawImpl_SetCooperativeLevel(IDirectDraw *iface, HW
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("(%p)->(%p, 0x%08x): Thunking to IDirectDraw4\n", This, hwnd, cooplevel);
-    return IDirectDraw4_SetCooperativeLevel(dd4_from_impl(This), hwnd, cooplevel);
+    return IDirectDraw4_SetCooperativeLevel(&This->IDirectDraw4_iface, hwnd, cooplevel);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_SetDisplayMode(IDirectDraw4 *iface, DWORD Width,
@@ -1009,7 +1010,8 @@ static HRESULT WINAPI IDirectDraw3Impl_SetDisplayMode(IDirectDraw3 *iface, DWORD
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("(%p)->(%u, %u, %u, %u, 0x%08x): Thunking to IDirectDraw4\n", This, Width, Height, BPP, RefreshRate, Flags);
-    return IDirectDraw3_SetDisplayMode(dd4_from_impl(This), Width, Height, BPP, RefreshRate, Flags);
+    return IDirectDraw3_SetDisplayMode(&This->IDirectDraw4_iface, Width, Height, BPP, RefreshRate,
+            Flags);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_SetDisplayMode(IDirectDraw2 *iface, DWORD Width,
@@ -1017,7 +1019,8 @@ static HRESULT WINAPI IDirectDraw2Impl_SetDisplayMode(IDirectDraw2 *iface, DWORD
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("(%p)->(%u, %u, %u, %u, 0x%08x): Thunking to IDirectDraw4\n", This, Width, Height, BPP, RefreshRate, Flags);
-    return IDirectDraw3_SetDisplayMode(dd4_from_impl(This), Width, Height, BPP, RefreshRate, Flags);
+    return IDirectDraw3_SetDisplayMode(&This->IDirectDraw4_iface, Width, Height, BPP, RefreshRate,
+            Flags);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_SetDisplayMode(IDirectDraw *iface, DWORD Width, DWORD Height,
@@ -1025,7 +1028,7 @@ static HRESULT WINAPI IDirectDrawImpl_SetDisplayMode(IDirectDraw *iface, DWORD W
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("(%p)->(%u, %u, %u): Thunking to IDirectDraw4\n", This, Width, Height, BPP);
-    return IDirectDraw3_SetDisplayMode(dd4_from_impl(This), Width, Height, BPP, 0, 0);
+    return IDirectDraw3_SetDisplayMode(&This->IDirectDraw4_iface, Width, Height, BPP, 0, 0);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_WaitForVerticalBlank(IDirectDraw4 *iface, DWORD Flags,
@@ -1041,7 +1044,7 @@ static HRESULT WINAPI IDirectDraw3Impl_WaitForVerticalBlank(IDirectDraw3 *iface,
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw3(iface);
     TRACE("(%p)->(0x%08x, %p): Thunking to IDirectDraw4\n", This, Flags, h);
-    return IDirectDraw4_WaitForVerticalBlank(dd4_from_impl(This), Flags, h);
+    return IDirectDraw4_WaitForVerticalBlank(&This->IDirectDraw4_iface, Flags, h);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_WaitForVerticalBlank(IDirectDraw2 *iface, DWORD Flags,
@@ -1049,7 +1052,7 @@ static HRESULT WINAPI IDirectDraw2Impl_WaitForVerticalBlank(IDirectDraw2 *iface,
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw2(iface);
     TRACE("(%p)->(0x%08x, %p): Thunking to IDirectDraw4\n", This, Flags, h);
-    return IDirectDraw4_WaitForVerticalBlank(dd4_from_impl(This), Flags, h);
+    return IDirectDraw4_WaitForVerticalBlank(&This->IDirectDraw4_iface, Flags, h);
 }
 
 static HRESULT WINAPI IDirectDrawImpl_WaitForVerticalBlank(IDirectDraw *iface, DWORD Flags,
@@ -1057,7 +1060,7 @@ static HRESULT WINAPI IDirectDrawImpl_WaitForVerticalBlank(IDirectDraw *iface, D
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw(iface);
     TRACE("(%p)->(0x%08x, %p): Thunking to IDirectDraw4\n", This, Flags, h);
-    return IDirectDraw4_WaitForVerticalBlank(dd4_from_impl(This), Flags, h);
+    return IDirectDraw4_WaitForVerticalBlank(&This->IDirectDraw4_iface, Flags, h);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_GetAvailableVidMem(IDirectDraw4 *iface, DDSCAPS2 *Caps,
@@ -1076,7 +1079,7 @@ static HRESULT WINAPI IDirectDraw3Impl_GetAvailableVidMem(IDirectDraw3 *iface, D
     TRACE("(%p)->(%p, %p, %p): Thunking to IDirectDraw4\n", This, Caps, total, free);
     memset(&caps2, 0, sizeof(caps2));
     caps2.dwCaps = Caps->dwCaps;
-    return IDirectDraw4_GetAvailableVidMem(dd4_from_impl(This), &caps2, total, free);
+    return IDirectDraw4_GetAvailableVidMem(&This->IDirectDraw4_iface, &caps2, total, free);
 }
 
 static HRESULT WINAPI IDirectDraw2Impl_GetAvailableVidMem(IDirectDraw2 *iface, DDSCAPS *Caps,
@@ -1087,7 +1090,7 @@ static HRESULT WINAPI IDirectDraw2Impl_GetAvailableVidMem(IDirectDraw2 *iface, D
     TRACE("(%p)->(%p, %p, %p): Thunking to IDirectDraw4\n", This, Caps, total, free);
     memset(&caps2, 0, sizeof(caps2));
     caps2.dwCaps = Caps->dwCaps;
-    return IDirectDraw4_GetAvailableVidMem(dd4_from_impl(This), &caps2, total, free);
+    return IDirectDraw4_GetAvailableVidMem(&This->IDirectDraw4_iface, &caps2, total, free);
 }
 
 static HRESULT WINAPI IDirectDraw4Impl_GetSurfaceFromDC(IDirectDraw4 *iface, HDC hdc,
@@ -1306,7 +1309,7 @@ IDirectDrawFactoryImpl_CreateDirectDraw(IDirectDrawFactory* iface,
     object->IDirectDraw_iface.lpVtbl = &IDirectDraw1_Vtbl;
     object->IDirectDraw2_iface.lpVtbl = &IDirectDraw2_Vtbl;
     object->IDirectDraw3_iface.lpVtbl = &IDirectDraw3_Vtbl;
-    object->IDirectDraw4_Vtbl = &IDirectDraw4_Vtbl;
+    object->IDirectDraw4_iface.lpVtbl = &IDirectDraw4_Vtbl;
 
     hr = DirectDrawCreate(pGUID, &parent, NULL);
     if (FAILED(hr)) goto err;
@@ -1332,5 +1335,7 @@ err:
 IDirectDraw4 *dd_get_inner(IDirectDraw4 *outer)
 {
     IDirectDrawImpl *This = impl_from_IDirectDraw4(outer);
+
+    if (outer->lpVtbl != &IDirectDraw4_Vtbl) return NULL;
     return This->parent;
 }
diff --git a/dlls/ddrawex/ddrawex_private.h b/dlls/ddrawex/ddrawex_private.h
index 44b0a66..2b7ed6b 100644
--- a/dlls/ddrawex/ddrawex_private.h
+++ b/dlls/ddrawex/ddrawex_private.h
@@ -59,7 +59,7 @@ typedef struct
     IDirectDraw IDirectDraw_iface;
     IDirectDraw2 IDirectDraw2_iface;
     IDirectDraw3 IDirectDraw3_iface;
-    const IDirectDraw4Vtbl *IDirectDraw4_Vtbl;
+    IDirectDraw4 IDirectDraw4_iface;
     LONG ref;
 
     /* The interface we're forwarding to */
-- 
1.7.3.4



More information about the wine-patches mailing list