ddraw: Get rid of ddcomimpl.h.

Henri Verbeet hverbeet at codeweavers.com
Thu Jan 22 03:33:37 CST 2009


---
 dlls/ddraw/ddcomimpl.h      |   28 --
 dlls/ddraw/ddraw_private.h  |    7 +-
 dlls/ddraw/ddraw_thunks.c   |  598 +++++++++----------------------------------
 dlls/ddraw/device.c         |   19 +-
 dlls/ddraw/direct3d.c       |   16 +-
 dlls/ddraw/material.c       |   43 ++--
 dlls/ddraw/surface.c        |    2 +-
 dlls/ddraw/surface_thunks.c |   18 +-
 dlls/ddraw/texture.c        |   12 +-
 9 files changed, 178 insertions(+), 565 deletions(-)
 delete mode 100644 dlls/ddraw/ddcomimpl.h

diff --git a/dlls/ddraw/ddcomimpl.h b/dlls/ddraw/ddcomimpl.h
deleted file mode 100644
index 280303c..0000000
--- a/dlls/ddraw/ddcomimpl.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* A few helpful macros for implementing COM objects.
- *
- * Copyright 2000 TransGaming Technologies Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#ifndef _DDCOMIMPL_H_
-#define _DDCOMIMPL_H_
-
-#include <stddef.h>
-
-#define COM_INTERFACE_CAST(impltype, ifnamefrom, ifnameto, ifaceptr) \
-    ((ifaceptr) ? (ifnameto *)&(((impltype *)((char *)(ifaceptr) \
-    - offsetof(impltype, ifnamefrom##_vtbl)))->ifnameto##_vtbl) : NULL)
-#endif /* _DDCOMIMPL_H_ */
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 1ab4563..cc837e6 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -33,8 +33,6 @@
 #include "ddrawi.h"
 #include "d3d.h"
 
-#include "ddcomimpl.h"
-
 #include "wine/list.h"
 #ifdef DDRAW_INIT_GUID
 #include "initguid.h"
@@ -332,6 +330,11 @@ static inline IDirectDrawSurfaceImpl *surface_from_texture2(IDirect3DTexture2 *i
     return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirect3DTexture2_vtbl));
 }
 
+static inline IDirectDrawSurfaceImpl *surface_from_surface3(IDirectDrawSurface3 *iface)
+{
+    return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirectDrawSurface3_vtbl));
+}
+
 /* Get the number of bytes per pixel for a given surface */
 #define PFGET_BPP(pf) (pf.dwFlags&DDPF_PALETTEINDEXED8?1:((pf.dwRGBBitCount+7)/8))
 #define GET_BPP(desc) PFGET_BPP(desc.ddpfPixelFormat)
diff --git a/dlls/ddraw/ddraw_thunks.c b/dlls/ddraw/ddraw_thunks.c
index 49dffc0..8c79cbf 100644
--- a/dlls/ddraw/ddraw_thunks.c
+++ b/dlls/ddraw/ddraw_thunks.c
@@ -45,37 +45,25 @@ WINE_DECLARE_DEBUG_CHANNEL(ddraw);
 static HRESULT WINAPI
 IDirectDrawImpl_QueryInterface(LPDIRECTDRAW This, REFIID iid, LPVOID *ppObj)
 {
-    return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw,
-							  IDirectDraw7, This),
-				       iid, ppObj);
+    return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw1(This), iid, ppObj);
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_QueryInterface(LPDIRECTDRAW2 This, REFIID iid, LPVOID *ppObj)
 {
-    return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw2,
-							  IDirectDraw7, This),
-				       iid, ppObj);
+    return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw2(This), iid, ppObj);
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_QueryInterface(LPDIRECTDRAW3 This, REFIID iid, LPVOID *ppObj)
 {
-    return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw3,
-							  IDirectDraw7, This),
-				       iid, ppObj);
+    return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw3(This), iid, ppObj);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_QueryInterface(LPDIRECTDRAW4 This, REFIID iid, LPVOID *ppObj)
 {
-    return IDirectDraw7_QueryInterface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw4,
-							  IDirectDraw7, This),
-				       iid, ppObj);
+    return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw4(This), iid, ppObj);
 }
 
 static ULONG WINAPI
@@ -201,33 +189,25 @@ IDirectDraw4Impl_Release(LPDIRECTDRAW4 iface)
 static HRESULT WINAPI
 IDirectDrawImpl_Compact(LPDIRECTDRAW This)
 {
-    return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl,
-						   IDirectDraw, IDirectDraw7,
-						   This));
+    return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw1(This));
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_Compact(LPDIRECTDRAW2 This)
 {
-    return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl,
-						   IDirectDraw2, IDirectDraw7,
-						   This));
+    return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw2(This));
 }
 
     static HRESULT WINAPI
 IDirectDraw3Impl_Compact(LPDIRECTDRAW3 This)
 {
-    return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl,
-						   IDirectDraw3, IDirectDraw7,
-						   This));
+    return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw3(This));
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_Compact(LPDIRECTDRAW4 This)
 {
-    return IDirectDraw7_Compact(COM_INTERFACE_CAST(IDirectDrawImpl,
-						   IDirectDraw4, IDirectDraw7,
-						   This));
+    return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw4(This));
 }
 
 static HRESULT WINAPI
@@ -235,11 +215,7 @@ IDirectDrawImpl_CreateClipper(LPDIRECTDRAW This, DWORD dwFlags,
 			      LPDIRECTDRAWCLIPPER *ppClipper,
 			      IUnknown *pUnkOuter)
 {
-    return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl,
-							 IDirectDraw,
-							 IDirectDraw7,
-							 This),
-				      dwFlags, ppClipper, pUnkOuter);
+    return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, ppClipper, pUnkOuter);
 }
 
 static HRESULT WINAPI
@@ -247,11 +223,7 @@ IDirectDraw2Impl_CreateClipper(LPDIRECTDRAW2 This, DWORD dwFlags,
 			       LPDIRECTDRAWCLIPPER *ppClipper,
 			       IUnknown *pUnkOuter)
 {
-    return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl,
-							 IDirectDraw2,
-							 IDirectDraw7,
-							 This),
-				      dwFlags, ppClipper, pUnkOuter);
+    return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, ppClipper, pUnkOuter);
 }
 
 static HRESULT WINAPI
@@ -259,11 +231,7 @@ IDirectDraw3Impl_CreateClipper(LPDIRECTDRAW3 This, DWORD dwFlags,
 			       LPDIRECTDRAWCLIPPER *ppClipper,
 			       IUnknown *pUnkOuter)
 {
-    return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl,
-							 IDirectDraw3,
-							 IDirectDraw7,
-							 This),
-				      dwFlags, ppClipper, pUnkOuter);
+    return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw3(This), dwFlags, ppClipper, pUnkOuter);
 }
 
 static HRESULT WINAPI
@@ -271,11 +239,7 @@ IDirectDraw4Impl_CreateClipper(LPDIRECTDRAW4 This, DWORD dwFlags,
 			       LPDIRECTDRAWCLIPPER *ppClipper,
 			       IUnknown *pUnkOuter)
 {
-    return IDirectDraw7_CreateClipper(COM_INTERFACE_CAST(IDirectDrawImpl,
-							 IDirectDraw4,
-							 IDirectDraw7,
-							 This),
-				      dwFlags, ppClipper, pUnkOuter);
+    return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, ppClipper, pUnkOuter);
 }
 
 static HRESULT WINAPI
@@ -285,18 +249,11 @@ IDirectDrawImpl_CreatePalette(LPDIRECTDRAW This, DWORD dwFlags,
 			      IUnknown *pUnkOuter)
 {
     HRESULT hr;
-    hr = IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl,
-							 IDirectDraw,
-							 IDirectDraw7,
-							 This),
-				      dwFlags, pEntries, ppPalette, pUnkOuter);
+    hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, pEntries, ppPalette, pUnkOuter);
     if(SUCCEEDED(hr) && *ppPalette)
     {
         IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
-        IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
-                             IDirectDraw,
-                             IDirectDraw7,
-                             This));
+        IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This));
         impl->ifaceToRelease = NULL;
 
     }
@@ -310,18 +267,11 @@ IDirectDraw2Impl_CreatePalette(LPDIRECTDRAW2 This, DWORD dwFlags,
 			       IUnknown *pUnkOuter)
 {
     HRESULT hr;
-    hr = IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl,
-							 IDirectDraw2,
-							 IDirectDraw7,
-							 This),
-				      dwFlags, pEntries, ppPalette, pUnkOuter);
+    hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, pEntries, ppPalette, pUnkOuter);
     if(SUCCEEDED(hr) && *ppPalette)
     {
         IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
-        IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
-                             IDirectDraw2,
-                             IDirectDraw7,
-                             This));
+        IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This));
         impl->ifaceToRelease = NULL;
     }
     return hr;
@@ -334,18 +284,11 @@ IDirectDraw3Impl_CreatePalette(LPDIRECTDRAW3 This, DWORD dwFlags,
 			       IUnknown *pUnkOuter)
 {
     HRESULT hr;
-    hr = IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl,
-							 IDirectDraw3,
-							 IDirectDraw7,
-							 This),
-				      dwFlags, pEntries, ppPalette, pUnkOuter);
+    hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw3(This), dwFlags, pEntries, ppPalette, pUnkOuter);
     if(SUCCEEDED(hr) && *ppPalette)
     {
         IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
-        IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
-                             IDirectDraw3,
-                             IDirectDraw7,
-                             This));
+        IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw3(This));
         IDirectDraw4_AddRef(This);
         impl->ifaceToRelease = (IUnknown *) This;
     }
@@ -359,18 +302,11 @@ IDirectDraw4Impl_CreatePalette(LPDIRECTDRAW4 This, DWORD dwFlags,
 			       IUnknown *pUnkOuter)
 {
     HRESULT hr;
-    hr = IDirectDraw7_CreatePalette(COM_INTERFACE_CAST(IDirectDrawImpl,
-							 IDirectDraw4,
-							 IDirectDraw7,
-							 This),
-				      dwFlags, pEntries, ppPalette, pUnkOuter);
+    hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, pEntries, ppPalette, pUnkOuter);
     if(SUCCEEDED(hr) && *ppPalette)
     {
         IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
-        IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
-                             IDirectDraw4,
-                             IDirectDraw7,
-                             This));
+        IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw4(This));
         IDirectDraw4_AddRef(This);
         impl->ifaceToRelease = (IUnknown *) This;
     }
@@ -409,26 +345,19 @@ IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
     pSDesc->ddsCaps.dwCaps &= ~DDSCAPS_FRONTBUFFER;
     /* the LPDDSURFACEDESC -> LPDDSURFACEDESC2 conversion should be ok,
      * since the data layout is the same */
-    hr = IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-						       IDirectDraw,
-						       IDirectDraw7,
-						       This),
-				    (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
+    hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This),
+            (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
 
     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
      * IDirectDrawSurface vtable layout at the beginning  */
-    *ppSurface = (LPDIRECTDRAWSURFACE) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
-				    IDirectDrawSurface7, IDirectDrawSurface3,
-				    pSurface7);
+    *ppSurface = pSurface7 ?
+            (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurface7)->IDirectDrawSurface3_vtbl : NULL;
 
     impl = (IDirectDrawSurfaceImpl *)pSurface7;
     if(SUCCEEDED(hr) && impl)
     {
         set_surf_version(impl, 1);
-        IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
-                             IDirectDraw,
-                             IDirectDraw7,
-                             This));
+        IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This));
         impl->ifaceToRelease = NULL;
     }
 
@@ -444,26 +373,19 @@ IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc,
     IDirectDrawSurfaceImpl *impl;
     HRESULT hr;
 
-    hr = IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-						       IDirectDraw2,
-						       IDirectDraw7,
-						       This),
-				    (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
+    hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This),
+            (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
 
     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
      * IDirectDrawSurface vtable layout at the beginning  */
-    *ppSurface = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
-				    IDirectDrawSurface7, IDirectDrawSurface3,
-				    pSurface7);
+    *ppSurface = pSurface7 ?
+            (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurface7)->IDirectDrawSurface3_vtbl : NULL;
 
     impl = (IDirectDrawSurfaceImpl *)pSurface7;
     if(SUCCEEDED(hr) && impl)
     {
         set_surf_version(impl, 2);
-        IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
-                             IDirectDraw2,
-                             IDirectDraw7,
-                             This));
+        IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This));
         impl->ifaceToRelease = NULL;
     }
 
@@ -479,26 +401,19 @@ IDirectDraw3Impl_CreateSurface(LPDIRECTDRAW3 This, LPDDSURFACEDESC pSDesc,
     IDirectDrawSurfaceImpl *impl;
     HRESULT hr;
 
-    hr = IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-						       IDirectDraw3,
-						       IDirectDraw7,
-						       This),
-				    (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
+    hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw3(This),
+            (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
 
     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
      * IDirectDrawSurface vtable layout at the beginning  */
-    *ppSurface = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
-				    IDirectDrawSurface7, IDirectDrawSurface3,
-				    pSurface7);
+    *ppSurface = pSurface7 ?
+            (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurface7)->IDirectDrawSurface3_vtbl : NULL;
 
     impl = (IDirectDrawSurfaceImpl *)pSurface7;
     if(SUCCEEDED(hr) && impl)
     {
         set_surf_version(impl, 3);
-        IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
-                             IDirectDraw3,
-                             IDirectDraw7,
-                             This));
+        IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw3(This));
         IDirectDraw3_AddRef(This);
         impl->ifaceToRelease = (IUnknown *) This;
     }
@@ -514,21 +429,13 @@ IDirectDraw4Impl_CreateSurface(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pSDesc,
     HRESULT hr;
     IDirectDrawSurfaceImpl *impl;
 
-    hr = IDirectDraw7_CreateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-						       IDirectDraw4,
-						       IDirectDraw7,
-						        This),
-				    pSDesc,
-				    (LPDIRECTDRAWSURFACE7 *)ppSurface,
-				    pUnkOuter);
+    hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw4(This),
+            pSDesc, (LPDIRECTDRAWSURFACE7 *)ppSurface, pUnkOuter);
     impl = (IDirectDrawSurfaceImpl *)*ppSurface;
     if(SUCCEEDED(hr) && impl)
     {
         set_surf_version(impl, 4);
-        IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
-                             IDirectDraw4,
-                             IDirectDraw7,
-                             This));
+        IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw4(This));
         IDirectDraw4_AddRef(This);
         impl->ifaceToRelease = (IUnknown *) This;
     }
@@ -542,19 +449,12 @@ IDirectDrawImpl_DuplicateSurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE pSrc,
     LPDIRECTDRAWSURFACE7 pDst7;
     HRESULT hr;
 
-    hr = IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw,
-							  IDirectDraw7, This),
-				       COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
-							  IDirectDrawSurface3,
-							  IDirectDrawSurface7,
-							  pSrc),
-				       &pDst7);
+    hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This),
+            pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7);
 
     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
      * IDirectDrawSurface vtable layout at the beginning  */
-    *ppDst = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
-				IDirectDrawSurface3, pDst7);
+    *ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL;
 
     return hr;
 }
@@ -566,19 +466,12 @@ IDirectDraw2Impl_DuplicateSurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE pSrc,
     LPDIRECTDRAWSURFACE7 pDst7;
     HRESULT hr;
 
-    hr = IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw2,
-							  IDirectDraw7, This),
-				       COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
-							  IDirectDrawSurface3,
-							  IDirectDrawSurface7,
-							  pSrc),
-				       &pDst7);
+    hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This),
+            pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7);
 
     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
      * IDirectDrawSurface vtable layout at the beginning  */
-    *ppDst = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
-				IDirectDrawSurface3, pDst7);
+    *ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL;
 
     return hr;
 }
@@ -590,19 +483,12 @@ IDirectDraw3Impl_DuplicateSurface(LPDIRECTDRAW3 This, LPDIRECTDRAWSURFACE pSrc,
     LPDIRECTDRAWSURFACE7 pDst7;
     HRESULT hr;
 
-    hr = IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw3,
-							  IDirectDraw7, This),
-				       COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
-							  IDirectDrawSurface3,
-							  IDirectDrawSurface7,
-							  pSrc),
-				       &pDst7);
+    hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw3(This),
+            pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7);
 
     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
      * IDirectDrawSurface vtable layout at the beginning  */
-    *ppDst = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
-				IDirectDrawSurface3, pDst7);
+    *ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL;
 
     return hr;
 }
@@ -612,12 +498,8 @@ IDirectDraw4Impl_DuplicateSurface(LPDIRECTDRAW4 This,
 				  LPDIRECTDRAWSURFACE4 pSrc,
 				  LPDIRECTDRAWSURFACE4 *ppDst)
 {
-    return IDirectDraw7_DuplicateSurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							    IDirectDraw4,
-							    IDirectDraw7,
-							    This),
-					 (LPDIRECTDRAWSURFACE7)pSrc,
-					 (LPDIRECTDRAWSURFACE7 *)ppDst);
+    return IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw4(This),
+            (LPDIRECTDRAWSURFACE7)pSrc, (LPDIRECTDRAWSURFACE7 *)ppDst);
 }
 
 struct displaymodescallback_context
@@ -648,12 +530,8 @@ IDirectDrawImpl_EnumDisplayModes(LPDIRECTDRAW This, DWORD dwFlags,
     cbcontext.func    = cb;
     cbcontext.context = context;
 
-    return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl,
-							    IDirectDraw,
-							    IDirectDraw7,
-							    This),
-					 dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext,
-					 EnumDisplayModesCallbackThunk);
+    return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw1(This),
+            dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk);
 }
 
 static HRESULT WINAPI
@@ -666,12 +544,8 @@ IDirectDraw2Impl_EnumDisplayModes(LPDIRECTDRAW2 This, DWORD dwFlags,
     cbcontext.func    = cb;
     cbcontext.context = context;
 
-    return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl,
-							    IDirectDraw2,
-							    IDirectDraw7,
-							    This),
-					 dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext,
-					 EnumDisplayModesCallbackThunk);
+    return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw2(This),
+            dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk);
 }
 
 static HRESULT WINAPI
@@ -684,12 +558,8 @@ IDirectDraw3Impl_EnumDisplayModes(LPDIRECTDRAW3 This, DWORD dwFlags,
     cbcontext.func    = cb;
     cbcontext.context = context;
 
-    return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl,
-							    IDirectDraw3,
-							    IDirectDraw7,
-							    This),
-					 dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext,
-					 EnumDisplayModesCallbackThunk);
+    return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw3(This),
+            dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk);
 }
 
 static HRESULT WINAPI
@@ -697,11 +567,7 @@ IDirectDraw4Impl_EnumDisplayModes(LPDIRECTDRAW4 This, DWORD dwFlags,
 				  LPDDSURFACEDESC2 pDDSD, LPVOID context,
 				  LPDDENUMMODESCALLBACK2 cb)
 {
-    return IDirectDraw7_EnumDisplayModes(COM_INTERFACE_CAST(IDirectDrawImpl,
-							    IDirectDraw4,
-							    IDirectDraw7,
-							    This),
-					 dwFlags, pDDSD, context, cb);
+    return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, pDDSD, context, cb);
 }
 
 struct surfacescallback_context
@@ -718,11 +584,9 @@ EnumSurfacesCallbackThunk(LPDIRECTDRAWSURFACE7 pSurf, LPDDSURFACEDESC2 pDDSD,
 
     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
      * IDirectDrawSurface vtable layout at the beginning  */
-    return cbcontext->func((LPDIRECTDRAWSURFACE)
-                           COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,
-					      IDirectDrawSurface7,
-					      IDirectDrawSurface3, pSurf),
-			   (LPDDSURFACEDESC)pDDSD, cbcontext->context);
+    return cbcontext->func(
+            pSurf ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf)->IDirectDrawSurface3_vtbl : NULL,
+            (LPDDSURFACEDESC)pDDSD, cbcontext->context);
 }
 
 static HRESULT WINAPI
@@ -735,11 +599,8 @@ IDirectDrawImpl_EnumSurfaces(LPDIRECTDRAW This, DWORD dwFlags,
     cbcontext.func    = cb;
     cbcontext.context = context;
 
-    return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
-							IDirectDraw,
-							IDirectDraw7, This),
-				     dwFlags, (LPDDSURFACEDESC2)pDDSD,
-				     &cbcontext, EnumSurfacesCallbackThunk);
+    return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw1(This),
+            dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk);
 }
 
 static HRESULT WINAPI
@@ -752,11 +613,8 @@ IDirectDraw2Impl_EnumSurfaces(LPDIRECTDRAW2 This, DWORD dwFlags,
     cbcontext.func    = cb;
     cbcontext.context = context;
 
-    return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
-							IDirectDraw2,
-							IDirectDraw7, This),
-				     dwFlags, (LPDDSURFACEDESC2)pDDSD,
-				     &cbcontext, EnumSurfacesCallbackThunk);
+    return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw2(This),
+            dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk);
 }
 
 static HRESULT WINAPI
@@ -769,11 +627,8 @@ IDirectDraw3Impl_EnumSurfaces(LPDIRECTDRAW3 This, DWORD dwFlags,
     cbcontext.func    = cb;
     cbcontext.context = context;
 
-    return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
-							IDirectDraw3,
-							IDirectDraw7, This),
-				     dwFlags, (LPDDSURFACEDESC2)pDDSD,
-				     &cbcontext, EnumSurfacesCallbackThunk);
+    return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw3(This),
+            dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk);
 }
 
 static HRESULT WINAPI
@@ -781,159 +636,108 @@ IDirectDraw4Impl_EnumSurfaces(LPDIRECTDRAW4 This, DWORD dwFlags,
 			      LPDDSURFACEDESC2 pDDSD, LPVOID context,
 			      LPDDENUMSURFACESCALLBACK2 cb)
 {
-    return IDirectDraw7_EnumSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
-							IDirectDraw4,
-							IDirectDraw7, This),
-				     dwFlags, pDDSD, context,
-				     (LPDDENUMSURFACESCALLBACK7)cb);
+    return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw4(This),
+            dwFlags, pDDSD, context, (LPDDENUMSURFACESCALLBACK7)cb);
 }
 
 static HRESULT WINAPI
 IDirectDrawImpl_FlipToGDISurface(LPDIRECTDRAW This)
 {
-    return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							    IDirectDraw,
-							    IDirectDraw7,
-							    This));
+    return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw1(This));
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 This)
 {
-    return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							    IDirectDraw2,
-							    IDirectDraw7,
-							    This));
+    return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw2(This));
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_FlipToGDISurface(LPDIRECTDRAW3 This)
 {
-    return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							    IDirectDraw3,
-							    IDirectDraw7,
-							    This));
+    return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw3(This));
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_FlipToGDISurface(LPDIRECTDRAW4 This)
 {
-    return IDirectDraw7_FlipToGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							    IDirectDraw4,
-							    IDirectDraw7,
-							    This));
+    return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw4(This));
 }
 
 static HRESULT WINAPI
 IDirectDrawImpl_GetCaps(LPDIRECTDRAW This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
 {
-    return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl,
-						   IDirectDraw, IDirectDraw7,
-						   This), pDDC1, pDDC2);
+    return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw1(This), pDDC1, pDDC2);
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_GetCaps(LPDIRECTDRAW2 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
 {
-    return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl,
-						   IDirectDraw2, IDirectDraw7,
-						   This), pDDC1, pDDC2);
+    return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw2(This), pDDC1, pDDC2);
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_GetCaps(LPDIRECTDRAW3 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
 {
-    return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl,
-						   IDirectDraw3, IDirectDraw7,
-						   This), pDDC1, pDDC2);
+    return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw3(This), pDDC1, pDDC2);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_GetCaps(LPDIRECTDRAW4 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
 {
-    return IDirectDraw7_GetCaps(COM_INTERFACE_CAST(IDirectDrawImpl,
-						   IDirectDraw4, IDirectDraw7,
-						   This), pDDC1, pDDC2);
+    return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw4(This), pDDC1, pDDC2);
 }
 
 static HRESULT WINAPI
 IDirectDrawImpl_GetDisplayMode(LPDIRECTDRAW This, LPDDSURFACEDESC pDDSD)
 {
-    return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw,
-							  IDirectDraw7, This),
-				       (LPDDSURFACEDESC2)pDDSD);
+    return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This), (LPDDSURFACEDESC2)pDDSD);
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_GetDisplayMode(LPDIRECTDRAW2 This, LPDDSURFACEDESC pDDSD)
 {
-    return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw2,
-							  IDirectDraw7, This),
-				       (LPDDSURFACEDESC2)pDDSD);
+    return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This), (LPDDSURFACEDESC2)pDDSD);
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_GetDisplayMode(LPDIRECTDRAW3 This, LPDDSURFACEDESC pDDSD)
 {
-    return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw3,
-							  IDirectDraw7, This),
-				       (LPDDSURFACEDESC2)pDDSD);
+    return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw3(This), (LPDDSURFACEDESC2)pDDSD);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_GetDisplayMode(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pDDSD)
 {
-    return IDirectDraw7_GetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw4,
-							  IDirectDraw7, This),
-				       pDDSD);
+    return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This), (LPDDSURFACEDESC2)pDDSD);
 }
 
 static HRESULT WINAPI
 IDirectDrawImpl_GetFourCCCodes(LPDIRECTDRAW This, LPDWORD lpNumCodes,
 			       LPDWORD lpCodes)
 {
-    return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw,
-							  IDirectDraw7,
-							  This),
-				       lpNumCodes, lpCodes);
+    return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw1(This), lpNumCodes, lpCodes);
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_GetFourCCCodes(LPDIRECTDRAW2 This, LPDWORD lpNumCodes,
 				LPDWORD lpCodes)
 {
-    return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw2,
-							  IDirectDraw7,
-							  This),
-				       lpNumCodes, lpCodes);
+    return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw2(This), lpNumCodes, lpCodes);
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_GetFourCCCodes(LPDIRECTDRAW3 This, LPDWORD lpNumCodes,
 				LPDWORD lpCodes)
 {
-    return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw3,
-							  IDirectDraw7,
-							  This),
-				       lpNumCodes, lpCodes);
+    return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw3(This), lpNumCodes, lpCodes);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_GetFourCCCodes(LPDIRECTDRAW4 This, LPDWORD lpNumCodes,
 				LPDWORD lpCodes)
 {
-    return IDirectDraw7_GetFourCCCodes(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw4,
-							  IDirectDraw7,
-							  This),
-				       lpNumCodes, lpCodes);
+    return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw4(This), lpNumCodes, lpCodes);
 }
 
 static HRESULT WINAPI
@@ -942,15 +746,11 @@ IDirectDrawImpl_GetGDISurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE *ppSurf)
     LPDIRECTDRAWSURFACE7 pSurf7;
     HRESULT hr;
 
-    hr = IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-						       IDirectDraw,
-						       IDirectDraw7,
-						       This), &pSurf7);
+    hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw1(This), &pSurf7);
 
     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
      * IDirectDrawSurface vtable layout at the beginning  */
-    *ppSurf = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
-				 IDirectDrawSurface3, pSurf7);
+    *ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL;
 
     return hr;
 }
@@ -961,15 +761,11 @@ IDirectDraw2Impl_GetGDISurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE *ppSurf)
     LPDIRECTDRAWSURFACE7 pSurf7;
     HRESULT hr;
 
-    hr = IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-						       IDirectDraw2,
-						       IDirectDraw7,
-						       This), &pSurf7);
+    hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw2(This), &pSurf7);
 
     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
      * IDirectDrawSurface vtable layout at the beginning  */
-    *ppSurf = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
-				 IDirectDrawSurface3, pSurf7);
+    *ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL;
 
     return hr;
 }
@@ -980,15 +776,11 @@ IDirectDraw3Impl_GetGDISurface(LPDIRECTDRAW3 This, LPDIRECTDRAWSURFACE *ppSurf)
     LPDIRECTDRAWSURFACE7 pSurf7;
     HRESULT hr;
 
-    hr = IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-						       IDirectDraw3,
-						       IDirectDraw7,
-						       This), &pSurf7);
+    hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw3(This), &pSurf7);
 
     /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
      * IDirectDrawSurface vtable layout at the beginning  */
-    *ppSurf = (LPDIRECTDRAWSURFACE)COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7,
-				 IDirectDrawSurface3, pSurf7);
+    *ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL;
 
     return hr;
 }
@@ -997,127 +789,79 @@ static HRESULT WINAPI
 IDirectDraw4Impl_GetGDISurface(LPDIRECTDRAW4 This,
 			       LPDIRECTDRAWSURFACE4 *ppSurf)
 {
-    return IDirectDraw7_GetGDISurface(COM_INTERFACE_CAST(IDirectDrawImpl,
-							 IDirectDraw4,
-							 IDirectDraw7,
-							 This),
-				      (LPDIRECTDRAWSURFACE7 *)ppSurf);
+    return IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw4(This), (LPDIRECTDRAWSURFACE7 *)ppSurf);
 }
 
 static HRESULT WINAPI
 IDirectDrawImpl_GetMonitorFrequency(LPDIRECTDRAW This, LPDWORD pdwFreq)
 {
-    return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl,
-							       IDirectDraw,
-							       IDirectDraw7,
-							       This),
-					    pdwFreq);
+    return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw1(This), pdwFreq);
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_GetMonitorFrequency(LPDIRECTDRAW2 This, LPDWORD pdwFreq)
 {
-    return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl,
-							       IDirectDraw2,
-							       IDirectDraw7,
-							       This),
-					    pdwFreq);
+    return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw2(This), pdwFreq);
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_GetMonitorFrequency(LPDIRECTDRAW3 This, LPDWORD pdwFreq)
 {
-    return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl,
-							       IDirectDraw3,
-							       IDirectDraw7,
-							       This),
-					    pdwFreq);
+    return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw3(This), pdwFreq);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_GetMonitorFrequency(LPDIRECTDRAW4 This, LPDWORD pdwFreq)
 {
-    return IDirectDraw7_GetMonitorFrequency(COM_INTERFACE_CAST(IDirectDrawImpl,
-							       IDirectDraw4,
-							       IDirectDraw7,
-							       This),
-					    pdwFreq);
+    return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw4(This), pdwFreq);
 }
 
 static HRESULT WINAPI
 IDirectDrawImpl_GetScanLine(LPDIRECTDRAW This, LPDWORD pdwLine)
 {
-    return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl,
-						       IDirectDraw,
-						       IDirectDraw7,
-						       This), pdwLine);
+    return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw1(This), pdwLine);
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_GetScanLine(LPDIRECTDRAW2 This, LPDWORD pdwLine)
 {
-    return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl,
-						       IDirectDraw2,
-						       IDirectDraw7,
-						       This), pdwLine);
+    return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw2(This), pdwLine);
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_GetScanLine(LPDIRECTDRAW3 This, LPDWORD pdwLine)
 {
-    return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl,
-						       IDirectDraw3,
-						       IDirectDraw7,
-						       This), pdwLine);
+    return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw3(This), pdwLine);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_GetScanLine(LPDIRECTDRAW4 This, LPDWORD pdwLine)
 {
-    return IDirectDraw7_GetScanLine(COM_INTERFACE_CAST(IDirectDrawImpl,
-						       IDirectDraw4,
-						       IDirectDraw7,
-						       This), pdwLine);
+    return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw4(This), pdwLine);
 }
 
 static HRESULT WINAPI
 IDirectDrawImpl_GetVerticalBlankStatus(LPDIRECTDRAW This, LPBOOL lpbIsInVB)
 {
-    return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl,
-								  IDirectDraw,
-								  IDirectDraw7,
-								  This),
-					       lpbIsInVB);
+    return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw1(This), lpbIsInVB);
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_GetVerticalBlankStatus(LPDIRECTDRAW2 This, LPBOOL lpbIsInVB)
 {
-    return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl,
-								  IDirectDraw2,
-								  IDirectDraw7,
-								  This),
-					       lpbIsInVB);
+    return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw2(This), lpbIsInVB);
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_GetVerticalBlankStatus(LPDIRECTDRAW3 This, LPBOOL lpbIsInVB)
 {
-    return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl,
-								  IDirectDraw3,
-								  IDirectDraw7,
-								  This),
-					       lpbIsInVB);
+    return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw3(This), lpbIsInVB);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_GetVerticalBlankStatus(LPDIRECTDRAW4 This, LPBOOL lpbIsInVB)
 {
-    return IDirectDraw7_GetVerticalBlankStatus(COM_INTERFACE_CAST(IDirectDrawImpl,
-								  IDirectDraw4,
-								  IDirectDraw7,
-								  This),
-					       lpbIsInVB);
+    return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw4(This), lpbIsInVB);
 }
 
 static HRESULT WINAPI
@@ -1168,168 +912,108 @@ IDirectDraw4Impl_Initialize(LPDIRECTDRAW4 iface, LPGUID pGUID)
 static HRESULT WINAPI
 IDirectDrawImpl_RestoreDisplayMode(LPDIRECTDRAW This)
 {
-    return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
-							      IDirectDraw,
-							      IDirectDraw7,
-							      This));
+    return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This));
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 This)
 {
-    return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
-							      IDirectDraw2,
-							      IDirectDraw7,
-							      This));
+    return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This));
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_RestoreDisplayMode(LPDIRECTDRAW3 This)
 {
-    return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
-							      IDirectDraw3,
-							      IDirectDraw7,
-							      This));
+    return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw3(This));
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_RestoreDisplayMode(LPDIRECTDRAW4 This)
 {
-    return IDirectDraw7_RestoreDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
-							      IDirectDraw4,
-							      IDirectDraw7,
-							      This));
+    return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This));
 }
 
 static HRESULT WINAPI
 IDirectDrawImpl_SetCooperativeLevel(LPDIRECTDRAW This, HWND hWnd,
 				    DWORD dwFlags)
 {
-    return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
-							       IDirectDraw,
-							       IDirectDraw7,
-							       This),
-					    hWnd, dwFlags);
+    return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw1(This), hWnd, dwFlags);
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_SetCooperativeLevel(LPDIRECTDRAW2 This, HWND hWnd,
 				     DWORD dwFlags)
 {
-    return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
-							       IDirectDraw2,
-							       IDirectDraw7,
-							       This),
-					    hWnd, dwFlags);
+    return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw2(This), hWnd, dwFlags);
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_SetCooperativeLevel(LPDIRECTDRAW3 This, HWND hWnd,
 				     DWORD dwFlags)
 {
-    return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
-							       IDirectDraw3,
-							       IDirectDraw7,
-							       This),
-					    hWnd, dwFlags);
+    return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw3(This), hWnd, dwFlags);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_SetCooperativeLevel(LPDIRECTDRAW4 This, HWND hWnd,
 				     DWORD dwFlags)
 {
-    return IDirectDraw7_SetCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
-							       IDirectDraw4,
-							       IDirectDraw7,
-							       This),
-					    hWnd, dwFlags);
+    return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw4(This), hWnd, dwFlags);
 }
 
 static HRESULT WINAPI
 IDirectDrawImpl_SetDisplayMode(LPDIRECTDRAW This, DWORD a, DWORD b, DWORD c)
 {
-    return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw,
-							  IDirectDraw7,
-							  This),
-				       a, b, c, 0, 0);
+    return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This), a, b, c, 0, 0);
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_SetDisplayMode(LPDIRECTDRAW2 This, DWORD a, DWORD b, DWORD c,
 				DWORD d, DWORD e)
 {
-    return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw2,
-							  IDirectDraw7,
-							  This),
-				       a, b, c, d, e);
+    return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This), a, b, c, d, e);
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_SetDisplayMode(LPDIRECTDRAW3 This, DWORD a, DWORD b, DWORD c,
 				DWORD d, DWORD e)
 {
-    return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw3,
-							  IDirectDraw7,
-							  This),
-				       a, b, c, d, e);
+    return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw3(This), a, b, c, d, e);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_SetDisplayMode(LPDIRECTDRAW4 This, DWORD a, DWORD b, DWORD c,
 				DWORD d, DWORD e)
 {
-    return IDirectDraw7_SetDisplayMode(COM_INTERFACE_CAST(IDirectDrawImpl,
-							  IDirectDraw4,
-							  IDirectDraw7,
-							  This),
-				       a, b, c, d, e);
+    return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This), a, b, c, d, e);
 }
 
 static HRESULT WINAPI
 IDirectDrawImpl_WaitForVerticalBlank(LPDIRECTDRAW This, DWORD dwFlags,
 				     HANDLE hEvent)
 {
-    return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl,
-								IDirectDraw,
-								IDirectDraw7,
-								This),
-					     dwFlags, hEvent);
+    return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, hEvent);
 }
 
 static HRESULT WINAPI
 IDirectDraw2Impl_WaitForVerticalBlank(LPDIRECTDRAW2 This, DWORD dwFlags,
 				      HANDLE hEvent)
 {
-    return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl,
-								IDirectDraw2,
-								IDirectDraw7,
-								This),
-					     dwFlags, hEvent);
+    return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, hEvent);
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_WaitForVerticalBlank(LPDIRECTDRAW3 This, DWORD dwFlags,
 				      HANDLE hEvent)
 {
-    return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl,
-								IDirectDraw3,
-								IDirectDraw7,
-								This),
-					     dwFlags, hEvent);
+    return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw3(This), dwFlags, hEvent);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_WaitForVerticalBlank(LPDIRECTDRAW4 This, DWORD dwFlags,
 				      HANDLE hEvent)
 {
-    return IDirectDraw7_WaitForVerticalBlank(COM_INTERFACE_CAST(IDirectDrawImpl,
-								IDirectDraw4,
-								IDirectDraw7,
-								This),
-					     dwFlags, hEvent);
+    return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, hEvent);
 }
 
 static HRESULT WINAPI
@@ -1339,11 +1023,7 @@ IDirectDraw2Impl_GetAvailableVidMem(LPDIRECTDRAW2 This, LPDDSCAPS pCaps,
     DDSCAPS2 Caps2;
     DDRAW_Convert_DDSCAPS_1_To_2(pCaps, &Caps2);
 
-    return IDirectDraw7_GetAvailableVidMem(COM_INTERFACE_CAST(IDirectDrawImpl,
-							      IDirectDraw2,
-							      IDirectDraw7,
-							      This),
-					   &Caps2, pdwTotal, pdwFree);
+    return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw2(This), &Caps2, pdwTotal, pdwFree);
 }
 
 static HRESULT WINAPI
@@ -1353,62 +1033,40 @@ IDirectDraw3Impl_GetAvailableVidMem(LPDIRECTDRAW3 This, LPDDSCAPS pCaps,
     DDSCAPS2 Caps2;
     DDRAW_Convert_DDSCAPS_1_To_2(pCaps, &Caps2);
 
-    return IDirectDraw7_GetAvailableVidMem(COM_INTERFACE_CAST(IDirectDrawImpl,
-							      IDirectDraw3,
-							      IDirectDraw7,
-							      This),
-					   &Caps2, pdwTotal, pdwFree);
+    return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw3(This), &Caps2, pdwTotal, pdwFree);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_GetAvailableVidMem(LPDIRECTDRAW4 This, LPDDSCAPS2 pCaps,
 				    LPDWORD pdwTotal, LPDWORD pdwFree)
 {
-    return IDirectDraw7_GetAvailableVidMem(COM_INTERFACE_CAST(IDirectDrawImpl,
-							      IDirectDraw4,
-							      IDirectDraw7,
-							      This),
-					   pCaps, pdwTotal, pdwFree);
+    return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw4(This), pCaps, pdwTotal, pdwFree);
 }
 
 static HRESULT WINAPI
 IDirectDraw3Impl_GetSurfaceFromDC(LPDIRECTDRAW3 This, HDC hDC,
 				  LPDIRECTDRAWSURFACE *pSurf)
 {
-    return IDirectDraw7_GetSurfaceFromDC(COM_INTERFACE_CAST(IDirectDrawImpl,
-							    IDirectDraw3,
-							    IDirectDraw7,
-							    This),
-					 hDC, (LPDIRECTDRAWSURFACE7 *)pSurf);
+    return IDirectDraw7_GetSurfaceFromDC((IDirectDraw7 *)ddraw_from_ddraw3(This), hDC, (LPDIRECTDRAWSURFACE7 *)pSurf);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_GetSurfaceFromDC(LPDIRECTDRAW4 This, HDC hDC,
 				  LPDIRECTDRAWSURFACE4 *pSurf)
 {
-    return IDirectDraw7_GetSurfaceFromDC(COM_INTERFACE_CAST(IDirectDrawImpl,
-							    IDirectDraw4,
-							    IDirectDraw7,
-							    This),
-					 hDC, (LPDIRECTDRAWSURFACE7 *)pSurf);
+    return IDirectDraw7_GetSurfaceFromDC((IDirectDraw7 *)ddraw_from_ddraw4(This), hDC, (LPDIRECTDRAWSURFACE7 *)pSurf);
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 This)
 {
-    return IDirectDraw7_RestoreAllSurfaces(COM_INTERFACE_CAST(IDirectDrawImpl,
-							      IDirectDraw4,
-							      IDirectDraw7,
-							      This));
+    return IDirectDraw7_RestoreAllSurfaces((IDirectDraw7 *)ddraw_from_ddraw4(This));
 }
 
 static HRESULT WINAPI
 IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 This)
 {
-    return IDirectDraw7_TestCooperativeLevel(COM_INTERFACE_CAST(IDirectDrawImpl,
-								IDirectDraw4,
-								IDirectDraw7,
-								This));
+    return IDirectDraw7_TestCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw4(This));
 }
 
 static HRESULT WINAPI
@@ -1418,11 +1076,7 @@ IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 This,
     DDDEVICEIDENTIFIER2 DDDI2;
     HRESULT hr;
 
-    hr = IDirectDraw7_GetDeviceIdentifier(COM_INTERFACE_CAST(IDirectDrawImpl,
-							     IDirectDraw4,
-							     IDirectDraw7,
-							     This),
-					  &DDDI2, dwFlags);
+    hr = IDirectDraw7_GetDeviceIdentifier((IDirectDraw7 *)ddraw_from_ddraw4(This), &DDDI2, dwFlags);
 
     DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(&DDDI2, pDDDI);
 
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 3972a07..cdcc719 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -282,7 +282,7 @@ static ULONG WINAPI
 Thunk_IDirect3DDeviceImpl_1_AddRef(IDirect3DDevice *iface)
 {
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
-    return IDirect3DDevice7_AddRef(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface));
+    return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)device_from_device1(iface));
 }
 
 /*****************************************************************************
@@ -1032,7 +1032,7 @@ Thunk_IDirect3DDeviceImpl_2_NextViewport(IDirect3DDevice2 *iface,
     TRACE_(ddraw_thunk)("(%p)->(%p,%p,%08x) thunking to IDirect3DDevice3 interface.\n", This, vp, lplpDirect3DViewport2, Flags);
     hr = IDirect3DDevice3_NextViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl,
             (IDirect3DViewport3 *)vp, &res, Flags);
-    *lplpDirect3DViewport2 = (IDirect3DViewport2 *) COM_INTERFACE_CAST(IDirect3DViewportImpl, IDirect3DViewport3, IDirect3DViewport3, res);
+    *lplpDirect3DViewport2 = (IDirect3DViewport2 *)res;
     return hr;
 }
 
@@ -1049,7 +1049,7 @@ Thunk_IDirect3DDeviceImpl_1_NextViewport(IDirect3DDevice *iface,
     TRACE_(ddraw_thunk)("(%p)->(%p,%p,%08x) thunking to IDirect3DDevice3 interface.\n", This, vp, lplpDirect3DViewport, Flags);
     hr = IDirect3DDevice3_NextViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl,
             (IDirect3DViewport3 *)vp, &res, Flags);
-    *lplpDirect3DViewport = (IDirect3DViewport *) COM_INTERFACE_CAST(IDirect3DViewportImpl, IDirect3DViewport3, IDirect3DViewport3, res);
+    *lplpDirect3DViewport = (IDirect3DViewport *)res;
     return hr;
 }
 
@@ -1790,7 +1790,7 @@ Thunk_IDirect3DDeviceImpl_3_GetDirect3D(IDirect3DDevice3 *iface,
     ret = IDirect3DDevice7_GetDirect3D((IDirect3DDevice7 *)This, &ret_ptr);
     if(ret != D3D_OK)
         return ret;
-    *Direct3D3 = COM_INTERFACE_CAST(IDirectDrawImpl, IDirect3D7, IDirect3D3, ret_ptr);
+    *Direct3D3 = ret_ptr ? (IDirect3D3 *)&((IDirectDrawImpl *)ret_ptr)->IDirect3D3_vtbl : NULL;
     TRACE(" returning interface %p\n", *Direct3D3);
     return D3D_OK;
 }
@@ -1807,7 +1807,7 @@ Thunk_IDirect3DDeviceImpl_2_GetDirect3D(IDirect3DDevice2 *iface,
     ret = IDirect3DDevice7_GetDirect3D((IDirect3DDevice7 *)This, &ret_ptr);
     if(ret != D3D_OK)
         return ret;
-    *Direct3D2 = COM_INTERFACE_CAST(IDirectDrawImpl, IDirect3D7, IDirect3D2, ret_ptr);
+    *Direct3D2 = ret_ptr ? (IDirect3D2 *)&((IDirectDrawImpl *)ret_ptr)->IDirect3D2_vtbl : NULL;
     TRACE(" returning interface %p\n", *Direct3D2);
     return D3D_OK;
 }
@@ -1824,7 +1824,7 @@ Thunk_IDirect3DDeviceImpl_1_GetDirect3D(IDirect3DDevice *iface,
     ret = IDirect3DDevice7_GetDirect3D((IDirect3DDevice7 *)This, &ret_ptr);
     if(ret != D3D_OK)
         return ret;
-    *Direct3D = COM_INTERFACE_CAST(IDirectDrawImpl, IDirect3D7, IDirect3D, ret_ptr);
+    *Direct3D = ret_ptr ? (IDirect3D *)&((IDirectDrawImpl *)ret_ptr)->IDirect3D_vtbl : NULL;
     TRACE(" returning interface %p\n", *Direct3D);
     return D3D_OK;
 }
@@ -1941,7 +1941,6 @@ Thunk_IDirect3DDeviceImpl_2_GetCurrentViewport(IDirect3DDevice2 *iface,
     hr = IDirect3DDevice3_GetCurrentViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl,
             (IDirect3DViewport3 **)Direct3DViewport2);
     if(hr != D3D_OK) return hr;
-    *Direct3DViewport2 = (IDirect3DViewport2 *) COM_INTERFACE_CAST(IDirect3DViewportImpl, IDirect3DViewport3, IDirect3DViewport3, *Direct3DViewport2);
     return D3D_OK;
 }
 
@@ -2088,7 +2087,6 @@ Thunk_IDirect3DDeviceImpl_3_GetRenderTarget(IDirect3DDevice3 *iface,
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, RenderTarget);
     hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 **)RenderTarget);
     if(hr != D3D_OK) return hr;
-    *RenderTarget = (IDirectDrawSurface4 *) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7, IDirectDrawSurface7, *RenderTarget);
     return D3D_OK;
 }
 
@@ -2101,7 +2099,8 @@ Thunk_IDirect3DDeviceImpl_2_GetRenderTarget(IDirect3DDevice2 *iface,
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, RenderTarget);
     hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 **)RenderTarget);
     if(hr != D3D_OK) return hr;
-    *RenderTarget = (IDirectDrawSurface *) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7, IDirectDrawSurface3, *RenderTarget);
+    *RenderTarget = *RenderTarget ?
+            (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)*RenderTarget)->IDirectDrawSurface3_vtbl : NULL;
     return D3D_OK;
 }
 
@@ -4743,7 +4742,7 @@ Thunk_IDirect3DDeviceImpl_3_GetTexture(IDirect3DDevice3 *iface,
     TRACE_(ddraw_thunk)("(%p)->(%d,%p) thunking to IDirect3DDevice7 interface.\n", This, Stage, Texture2);
     ret = IDirect3DDevice7_GetTexture((IDirect3DDevice7 *)This, Stage, &ret_val);
 
-    *Texture2 = COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7, IDirect3DTexture2, ret_val);
+    *Texture2 = ret_val ? (IDirect3DTexture2 *)&((IDirectDrawSurfaceImpl *)ret_val)->IDirect3DTexture2_vtbl : NULL;
 
     TRACE_(ddraw_thunk)(" returning interface %p.\n", *Texture2);
 
diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c
index 98f8d1d..573405b 100644
--- a/dlls/ddraw/direct3d.c
+++ b/dlls/ddraw/direct3d.c
@@ -532,7 +532,8 @@ Thunk_IDirect3DImpl_2_CreateMaterial(IDirect3D2 *iface,
     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Direct3DMaterial, UnkOuter);
     ret = IDirect3D3_CreateMaterial((IDirect3D3 *)&This->IDirect3D3_vtbl, &ret_val, UnkOuter);
 
-    *Direct3DMaterial = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial2, ret_val);
+    *Direct3DMaterial = ret_val ?
+            (IDirect3DMaterial2 *)&((IDirect3DMaterialImpl *)ret_val)->IDirect3DMaterial2_vtbl : NULL;
 
     TRACE(" returning interface %p.\n", *Direct3DMaterial);
 
@@ -551,7 +552,8 @@ Thunk_IDirect3DImpl_1_CreateMaterial(IDirect3D *iface,
     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Direct3DMaterial, UnkOuter);
     ret = IDirect3D3_CreateMaterial((IDirect3D3 *)&This->IDirect3D3_vtbl, &ret_val, UnkOuter);
 
-    *Direct3DMaterial = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial, ret_val);
+    *Direct3DMaterial = ret_val ?
+            (IDirect3DMaterial *)&((IDirect3DMaterialImpl *)ret_val)->IDirect3DMaterial_vtbl : NULL;
 
     TRACE(" returning interface %p.\n", *Direct3DMaterial);
 
@@ -932,7 +934,7 @@ Thunk_IDirect3DImpl_3_CreateDevice(IDirect3D3 *iface,
     hr =  IDirect3D7_CreateDevice((IDirect3D7 *)&This->IDirect3D7_vtbl, refiid,
             (IDirectDrawSurface7 *)Surface /* Same VTables */, (IDirect3DDevice7 **)Device);
 
-    *Device = COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice7, IDirect3DDevice3, *Device);
+    *Device = *Device ? (IDirect3DDevice3 *)&((IDirect3DDeviceImpl *)*Device)->IDirect3DDevice3_vtbl : NULL;
     return hr;
 }
 
@@ -947,10 +949,10 @@ Thunk_IDirect3DImpl_2_CreateDevice(IDirect3D2 *iface,
     TRACE("(%p)->(%s,%p,%p): Thunking to IDirect3D7\n", This, debugstr_guid(refiid), Surface, Device);
 
     hr =  IDirect3D7_CreateDevice((IDirect3D7 *)&This->IDirect3D7_vtbl, refiid,
-            COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface3, IDirectDrawSurface7, Surface),
+            Surface ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)Surface) : NULL,
             (IDirect3DDevice7 **)Device);
 
-    *Device = COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice7, IDirect3DDevice2, *Device);
+    *Device = *Device ? (IDirect3DDevice2 *)&((IDirect3DDeviceImpl *)*Device)->IDirect3DDevice2_vtbl : NULL;
     return hr;
 }
 
@@ -1077,7 +1079,9 @@ Thunk_IDirect3DImpl_3_CreateVertexBuffer(IDirect3D3 *iface,
     hr = IDirect3D7_CreateVertexBuffer((IDirect3D7 *)&This->IDirect3D7_vtbl,
             Desc, (IDirect3DVertexBuffer7 **)VertexBuffer, Flags);
 
-    *VertexBuffer = COM_INTERFACE_CAST(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, IDirect3DVertexBuffer, *VertexBuffer);
+    *VertexBuffer = *VertexBuffer ?
+            (IDirect3DVertexBuffer *)&((IDirect3DVertexBufferImpl *)*VertexBuffer)->IDirect3DVertexBuffer_vtbl : NULL;
+
     return hr;
 }
 
diff --git a/dlls/ddraw/material.c b/dlls/ddraw/material.c
index df08983..45fca9e 100644
--- a/dlls/ddraw/material.c
+++ b/dlls/ddraw/material.c
@@ -55,6 +55,11 @@ static inline IDirect3DMaterialImpl *material_from_material1(IDirect3DMaterial *
     return (IDirect3DMaterialImpl *)((char*)iface - FIELD_OFFSET(IDirect3DMaterialImpl, IDirect3DMaterial_vtbl));
 }
 
+static inline IDirect3DMaterialImpl *material_from_material2(IDirect3DMaterial2 *iface)
+{
+    return (IDirect3DMaterialImpl *)((char*)iface - FIELD_OFFSET(IDirect3DMaterialImpl, IDirect3DMaterial2_vtbl));
+}
+
 /*****************************************************************************
  * IUnknown Methods.
  *****************************************************************************/
@@ -347,9 +352,8 @@ Thunk_IDirect3DMaterialImpl_2_GetHandle(LPDIRECT3DMATERIAL2 iface,
 					LPD3DMATERIALHANDLE lpHandle)
 {
     TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpDirect3DDevice2, lpHandle);
-    return IDirect3DMaterial3_GetHandle(COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial2, IDirect3DMaterial3, iface),
-					COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, lpDirect3DDevice2),
-					lpHandle);
+    return IDirect3DMaterial3_GetHandle((IDirect3DMaterial3 *)material_from_material2(iface), lpDirect3DDevice2 ?
+            (IDirect3DDevice3 *)&device_from_device2(lpDirect3DDevice2)->IDirect3DDevice3_vtbl : NULL, lpHandle);
 }
 
 static HRESULT WINAPI
@@ -358,9 +362,8 @@ Thunk_IDirect3DMaterialImpl_1_GetHandle(LPDIRECT3DMATERIAL iface,
 					LPD3DMATERIALHANDLE lpHandle)
 {
     TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpDirect3DDevice, lpHandle);
-    return IDirect3DMaterial3_GetHandle(COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial, IDirect3DMaterial3, iface),
-					COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice3, lpDirect3DDevice),
-					lpHandle);
+    return IDirect3DMaterial3_GetHandle((IDirect3DMaterial3 *)material_from_material1(iface), lpDirect3DDevice ?
+            (IDirect3DDevice3 *)&device_from_device1(lpDirect3DDevice)->IDirect3DDevice3_vtbl : NULL, lpHandle);
 }
 
 static HRESULT WINAPI
@@ -369,9 +372,7 @@ Thunk_IDirect3DMaterialImpl_2_QueryInterface(LPDIRECT3DMATERIAL2 iface,
                                              LPVOID* obp)
 {
     TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DMaterial3 interface.\n", iface, debugstr_guid(riid), obp);
-    return IDirect3DMaterial3_QueryInterface(COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial2, IDirect3DMaterial3, iface),
-                                             riid,
-                                             obp);
+    return IDirect3DMaterial3_QueryInterface((IDirect3DMaterial3 *)material_from_material2(iface), riid, obp);
 }
 
 static HRESULT WINAPI
@@ -380,37 +381,35 @@ Thunk_IDirect3DMaterialImpl_1_QueryInterface(LPDIRECT3DMATERIAL iface,
                                              LPVOID* obp)
 {
     TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DMaterial3 interface.\n", iface, debugstr_guid(riid), obp);
-    return IDirect3DMaterial3_QueryInterface(COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial, IDirect3DMaterial3, iface),
-                                             riid,
-                                             obp);
+    return IDirect3DMaterial3_QueryInterface((IDirect3DMaterial3 *)material_from_material1(iface), riid, obp);
 }
 
 static ULONG WINAPI
 Thunk_IDirect3DMaterialImpl_2_AddRef(LPDIRECT3DMATERIAL2 iface)
 {
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DMaterial3 interface.\n", iface);
-    return IDirect3DMaterial3_AddRef(COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial2, IDirect3DMaterial3, iface));
+    return IDirect3DMaterial3_AddRef((IDirect3DMaterial3 *)material_from_material2(iface));
 }
 
 static ULONG WINAPI
 Thunk_IDirect3DMaterialImpl_1_AddRef(LPDIRECT3DMATERIAL iface)
 {
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DMaterial3 interface.\n", iface);
-    return IDirect3DMaterial3_AddRef(COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial, IDirect3DMaterial3, iface));
+    return IDirect3DMaterial3_AddRef((IDirect3DMaterial3 *)material_from_material1(iface));
 }
 
 static ULONG WINAPI
 Thunk_IDirect3DMaterialImpl_2_Release(LPDIRECT3DMATERIAL2 iface)
 {
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DMaterial3 interface.\n", iface);
-    return IDirect3DMaterial3_Release(COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial2, IDirect3DMaterial3, iface));
+    return IDirect3DMaterial3_Release((IDirect3DMaterial3 *)material_from_material2(iface));
 }
 
 static ULONG WINAPI
 Thunk_IDirect3DMaterialImpl_1_Release(LPDIRECT3DMATERIAL iface)
 {
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DMaterial3 interface.\n", iface);
-    return IDirect3DMaterial3_Release(COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial, IDirect3DMaterial3, iface));
+    return IDirect3DMaterial3_Release((IDirect3DMaterial3 *)material_from_material1(iface));
 }
 
 static HRESULT WINAPI
@@ -418,8 +417,7 @@ Thunk_IDirect3DMaterialImpl_2_SetMaterial(LPDIRECT3DMATERIAL2 iface,
                                           LPD3DMATERIAL lpMat)
 {
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpMat);
-    return IDirect3DMaterial3_SetMaterial(COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial2, IDirect3DMaterial3, iface),
-                                          lpMat);
+    return IDirect3DMaterial3_SetMaterial((IDirect3DMaterial3 *)material_from_material2(iface), lpMat);
 }
 
 static HRESULT WINAPI
@@ -427,8 +425,7 @@ Thunk_IDirect3DMaterialImpl_1_SetMaterial(LPDIRECT3DMATERIAL iface,
                                           LPD3DMATERIAL lpMat)
 {
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpMat);
-    return IDirect3DMaterial3_SetMaterial(COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial, IDirect3DMaterial3, iface),
-                                          lpMat);
+    return IDirect3DMaterial3_SetMaterial((IDirect3DMaterial3 *)material_from_material1(iface), lpMat);
 }
 
 static HRESULT WINAPI
@@ -436,8 +433,7 @@ Thunk_IDirect3DMaterialImpl_2_GetMaterial(LPDIRECT3DMATERIAL2 iface,
                                           LPD3DMATERIAL lpMat)
 {
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpMat);
-    return IDirect3DMaterial3_GetMaterial(COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial2, IDirect3DMaterial3, iface),
-                                          lpMat);
+    return IDirect3DMaterial3_GetMaterial((IDirect3DMaterial3 *)material_from_material2(iface), lpMat);
 }
 
 static HRESULT WINAPI
@@ -445,8 +441,7 @@ Thunk_IDirect3DMaterialImpl_1_GetMaterial(LPDIRECT3DMATERIAL iface,
                                           LPD3DMATERIAL lpMat)
 {
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpMat);
-    return IDirect3DMaterial3_GetMaterial(COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial, IDirect3DMaterial3, iface),
-                                          lpMat);
+    return IDirect3DMaterial3_GetMaterial((IDirect3DMaterial3 *)material_from_material1(iface), lpMat);
 }
 
 
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 13f1ba1..1312c22 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -118,7 +118,7 @@ IDirectDrawSurfaceImpl_QueryInterface(IDirectDrawSurface7 *iface,
         /* Call into IDirect3D7 for creation */
         IDirect3D7_CreateDevice((IDirect3D7 *)&This->ddraw->IDirect3D7_vtbl, riid, (IDirectDrawSurface7 *)This, &d3d);
 
-        *obj = COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice7, IDirect3DDevice, d3d);
+        *obj = d3d ? (IDirect3DDevice *)&((IDirect3DDeviceImpl *)d3d)->IDirect3DDevice_vtbl : NULL;
         TRACE("(%p) Returning IDirect3DDevice interface at %p\n", This, *obj);
 
         return S_OK;
diff --git a/dlls/ddraw/surface_thunks.c b/dlls/ddraw/surface_thunks.c
index b3d2edb..87a4b60 100644
--- a/dlls/ddraw/surface_thunks.c
+++ b/dlls/ddraw/surface_thunks.c
@@ -29,26 +29,14 @@
 #include "winerror.h"
 
 #include "ddraw_private.h"
-#include "ddcomimpl.h"
 
-#define CONVERT(pdds) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,	\
-					 IDirectDrawSurface3,		\
-					 IDirectDrawSurface7,		\
-					 (pdds))
-
-#define CONVERT_REV(pdds) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,	\
-					     IDirectDrawSurface7,	\
-					     IDirectDrawSurface3,	\
-					     (pdds))
+#define CONVERT(pdds) ((pdds) ? (IDirectDrawSurface7 *)surface_from_surface3(pdds) : NULL)
+#define CONVERT_REV(pdds) \
+        ((pdds) ? (IDirectDrawSurface3 *)&((IDirectDrawSurfaceImpl *)(pdds))->IDirectDrawSurface3_vtbl : NULL)
 
 WINE_DEFAULT_DEBUG_CHANNEL(ddraw_thunk);
 WINE_DECLARE_DEBUG_CHANNEL(ddraw);
 
-static inline IDirectDrawSurfaceImpl *surface_from_surface3(IDirectDrawSurface3 *iface)
-{
-    return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirectDrawSurface3_vtbl));
-}
-
 static HRESULT WINAPI
 IDirectDrawSurface3Impl_QueryInterface(LPDIRECTDRAWSURFACE3 This, REFIID iid,
 				       LPVOID *ppObj)
diff --git a/dlls/ddraw/texture.c b/dlls/ddraw/texture.c
index a91e136..5579a6a 100644
--- a/dlls/ddraw/texture.c
+++ b/dlls/ddraw/texture.c
@@ -84,7 +84,7 @@ Thunk_IDirect3DTextureImpl_1_AddRef(IDirect3DTexture *iface)
     IDirectDrawSurfaceImpl *This = surface_from_texture1(iface);
     TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This);
 
-    return IDirectDrawSurface7_AddRef(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirectDrawSurface7, iface));
+    return IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)This);
 }
 
 static ULONG WINAPI
@@ -103,7 +103,7 @@ Thunk_IDirect3DTextureImpl_1_Release(IDirect3DTexture *iface)
     IDirectDrawSurfaceImpl *This = surface_from_texture1(iface);
     TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This);
 
-    return IDirectDrawSurface7_Release(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirectDrawSurface7, iface));
+    return IDirectDrawSurface7_Release((IDirectDrawSurface7 *)This);
 }
 
 /*****************************************************************************
@@ -162,9 +162,7 @@ Thunk_IDirect3DTextureImpl_1_PaletteChanged(IDirect3DTexture *iface,
     IDirectDrawSurfaceImpl *This = surface_from_texture1(iface);
     TRACE("(%p)->(%08x,%08x) thunking to IDirect3DTexture2 interface.\n", This, Start, Count);
 
-    return IDirect3DTexture2_PaletteChanged(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirect3DTexture2, iface),
-                                            Start,
-                                            Count);
+    return IDirect3DTexture2_PaletteChanged((IDirect3DTexture2 *)&This->IDirect3DTexture2_vtbl, Start, Count);
 }
 
 
@@ -469,8 +467,8 @@ Thunk_IDirect3DTextureImpl_1_Load(IDirect3DTexture *iface,
     IDirectDrawSurfaceImpl *Texture = surface_from_texture1(D3DTexture);
     TRACE("(%p)->(%p) thunking to IDirect3DTexture2 interface.\n", This, Texture);
 
-    return IDirect3DTexture2_Load(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirect3DTexture2, iface),
-                                  COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirect3DTexture2, D3DTexture));
+    return IDirect3DTexture2_Load((IDirect3DTexture2 *)&This->IDirect3DTexture2_vtbl,
+            D3DTexture ? (IDirect3DTexture2 *)&surface_from_texture1(D3DTexture)->IDirect3DTexture2_vtbl : NULL);
 }
 
 /*****************************************************************************
-- 
1.6.0.6



--------------050103080008070908000206--



More information about the wine-patches mailing list