diff --git a/dlls/ddrawex/ddrawex_private.h b/dlls/ddrawex/ddrawex_private.h index 2b7ed6b4060..f87ca3acbf1 100644 --- a/dlls/ddrawex/ddrawex_private.h +++ b/dlls/ddrawex/ddrawex_private.h @@ -74,7 +74,7 @@ IDirectDraw4 *dd_get_inner(IDirectDraw4 *outer); ******************************************************************************/ typedef struct { - const IDirectDrawSurface3Vtbl *IDirectDrawSurface3_Vtbl; + IDirectDrawSurface3 IDirectDrawSurface3_iface; const IDirectDrawSurface4Vtbl *IDirectDrawSurface4_Vtbl; LONG ref; diff --git a/dlls/ddrawex/surface.c b/dlls/ddrawex/surface.c index 67c4755bc30..8387e5d835f 100644 --- a/dlls/ddrawex/surface.c +++ b/dlls/ddrawex/surface.c @@ -35,17 +35,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddrawex); ******************************************************************************/ static IDirectDrawSurfaceImpl *impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface) { - return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirectDrawSurface3_Vtbl)); + return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirectDrawSurface3_iface); } static IDirectDrawSurfaceImpl *unsafe_impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface); -static IDirectDrawSurface3 *dds3_from_impl(IDirectDrawSurfaceImpl *This) -{ - if(!This) return NULL; - return (IDirectDrawSurface3 *) &This->IDirectDrawSurface3_Vtbl; -} - static IDirectDrawSurfaceImpl *impl_from_dds4(IDirectDrawSurface4 *iface) { if(!iface) return NULL; @@ -83,8 +77,8 @@ IDirectDrawSurface4Impl_QueryInterface(IDirectDrawSurface4 *iface, || IsEqualGUID(riid, &IID_IDirectDrawSurface2) || IsEqualGUID(riid, &IID_IDirectDrawSurface) ) { - *obj = dds3_from_impl(This); - IDirectDrawSurface3_AddRef((IDirectDrawSurface3 *) *obj); + *obj = &This->IDirectDrawSurface3_iface; + IDirectDrawSurface3_AddRef(&This->IDirectDrawSurface3_iface); TRACE("(%p) returning IDirectDrawSurface3 interface at %p\n", This, *obj); return S_OK; } @@ -335,10 +329,11 @@ enumsurfaces_thunk_cb(IDirectDrawSurface4 *surf, DDSURFACEDESC2 *desc2, void *vc DDSURFACEDESC desc; TRACE("Thunking back to IDirectDrawSurface3\n"); - IDirectDrawSurface3_AddRef(dds3_from_impl(This)); + IDirectDrawSurface3_AddRef(&This->IDirectDrawSurface3_iface); IDirectDrawSurface3_Release(surf); DDSD2_to_DDSD(desc2, &desc); - return ctx->orig_cb((IDirectDrawSurface *) dds3_from_impl(This), &desc, ctx->orig_ctx); + return ctx->orig_cb((IDirectDrawSurface *)&This->IDirectDrawSurface3_iface, &desc, + ctx->orig_ctx); } static HRESULT WINAPI IDirectDrawSurface3Impl_EnumAttachedSurfaces(IDirectDrawSurface3 *iface, @@ -1166,7 +1161,7 @@ static IDirectDrawSurfaceImpl *unsafe_impl_from_IDirectDrawSurface3(IDirectDrawS { if (!iface) return NULL; if (iface->lpVtbl != &IDirectDrawSurface3_Vtbl) return NULL; - return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirectDrawSurface3_Vtbl); + return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirectDrawSurface3_iface); } /* dds_get_outer @@ -1197,7 +1192,7 @@ IDirectDrawSurface4 *dds_get_outer(IDirectDrawSurface4 *inner) TRACE("Creating new ddrawex surface wrapper for surface %p\n", inner); impl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*impl)); impl->ref = 1; - impl->IDirectDrawSurface3_Vtbl = &IDirectDrawSurface3_Vtbl; + impl->IDirectDrawSurface3_iface.lpVtbl = &IDirectDrawSurface3_Vtbl; impl->IDirectDrawSurface4_Vtbl = &IDirectDrawSurface4_Vtbl; IDirectDrawSurface4_AddRef(inner); impl->parent = inner;