From 0bddb2c3a7a8888ec27241bf1465c98075dd1147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ri=C4=8Dardas=20Barkauskas?= Date: Wed, 25 May 2011 01:24:47 +0300 Subject: ddraw: COM cleanup for IDirectDrawSurface7 iface --- dlls/ddraw/ddraw.c | 185 ++++++++++++++++++++++-------- dlls/ddraw/ddraw_private.h | 11 ++- dlls/ddraw/device.c | 112 ++++++++++-------- dlls/ddraw/main.c | 2 +- dlls/ddraw/surface.c | 271 ++++++++++++++++++++++++-------------------- 5 files changed, 358 insertions(+), 223 deletions(-) diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index 78a5ca6..0083bb1 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -2008,22 +2008,41 @@ static HRESULT WINAPI ddraw7_GetGDISurface(IDirectDraw7 *iface, IDirectDrawSurfa static HRESULT WINAPI ddraw4_GetGDISurface(IDirectDraw4 *iface, IDirectDrawSurface4 **surface) { IDirectDrawImpl *This = impl_from_IDirectDraw4(iface); + IDirectDrawSurface7 *surface7; + IDirectDrawSurfaceImpl *surface_impl; + HRESULT hr; TRACE("iface %p, surface %p.\n", iface, surface); - return ddraw7_GetGDISurface(&This->IDirectDraw7_iface, (IDirectDrawSurface7 **)surface); + hr = ddraw7_GetGDISurface(&This->IDirectDraw7_iface, &surface7); + if (FAILED(hr)) + { + *surface = NULL; + return hr; + } + surface_impl = impl_from_IDirectDrawSurface7(surface7); + *surface = (IDirectDrawSurface4 *)surface_impl; + + return hr; } static HRESULT WINAPI ddraw3_GetGDISurface(IDirectDraw3 *iface, IDirectDrawSurface **surface) { IDirectDrawImpl *This = impl_from_IDirectDraw3(iface); IDirectDrawSurface7 *surface7; + IDirectDrawSurfaceImpl *surface_impl; HRESULT hr; TRACE("iface %p, surface %p.\n", iface, surface); hr = ddraw7_GetGDISurface(&This->IDirectDraw7_iface, &surface7); - *surface = surface7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)surface7)->IDirectDrawSurface3_iface : NULL; + if (FAILED(hr)) + { + *surface = NULL; + return hr; + } + surface_impl = impl_from_IDirectDrawSurface7(surface7); + *surface = (IDirectDrawSurface *)&surface_impl->IDirectDrawSurface3_iface; return hr; } @@ -2032,12 +2051,19 @@ static HRESULT WINAPI ddraw2_GetGDISurface(IDirectDraw2 *iface, IDirectDrawSurfa { IDirectDrawImpl *This = impl_from_IDirectDraw2(iface); IDirectDrawSurface7 *surface7; + IDirectDrawSurfaceImpl *surface_impl; HRESULT hr; TRACE("iface %p, surface %p.\n", iface, surface); hr = ddraw7_GetGDISurface(&This->IDirectDraw7_iface, &surface7); - *surface = surface7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)surface7)->IDirectDrawSurface3_iface : NULL; + if (SUCCEEDED(hr)) + { + *surface = NULL; + return hr; + } + surface_impl = impl_from_IDirectDrawSurface7(surface7); + *surface = (IDirectDrawSurface *)&surface_impl->IDirectDrawSurface3_iface; return hr; } @@ -2046,12 +2072,19 @@ static HRESULT WINAPI ddraw1_GetGDISurface(IDirectDraw *iface, IDirectDrawSurfac { IDirectDrawImpl *This = impl_from_IDirectDraw(iface); IDirectDrawSurface7 *surface7; + IDirectDrawSurfaceImpl *surface_impl; HRESULT hr; TRACE("iface %p, surface %p.\n", iface, surface); hr = ddraw7_GetGDISurface(&This->IDirectDraw7_iface, &surface7); - *surface = surface7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)surface7)->IDirectDrawSurface3_iface : NULL; + if (SUCCEEDED(hr)) + { + *surface = NULL; + return hr; + } + surface_impl = impl_from_IDirectDrawSurface7(surface7); + *surface = (IDirectDrawSurface *)&surface_impl->IDirectDrawSurface3_iface; return hr; } @@ -2409,6 +2442,7 @@ static HRESULT WINAPI ddraw4_GetSurfaceFromDC(IDirectDraw4 *iface, HDC dc, { IDirectDrawImpl *This = impl_from_IDirectDraw4(iface); IDirectDrawSurface7 *surface7; + IDirectDrawSurfaceImpl *surface_impl; HRESULT hr; TRACE("iface %p, dc %p, surface %p.\n", iface, dc, surface); @@ -2416,7 +2450,15 @@ static HRESULT WINAPI ddraw4_GetSurfaceFromDC(IDirectDraw4 *iface, HDC dc, if (!surface) return E_INVALIDARG; hr = ddraw7_GetSurfaceFromDC(&This->IDirectDraw7_iface, dc, &surface7); - *surface = surface7 ? (IDirectDrawSurface4 *)&((IDirectDrawSurfaceImpl *)surface7)->IDirectDrawSurface3_iface : NULL; + if (FAILED(hr)) + { + *surface = NULL; + return hr; + } + + surface_impl = impl_from_IDirectDrawSurface7(surface7); + /* Tests say this is true */ + *surface = (IDirectDrawSurface4 *)&surface_impl->IDirectDrawSurface3_iface; return hr; } @@ -2425,10 +2467,25 @@ static HRESULT WINAPI ddraw3_GetSurfaceFromDC(IDirectDraw3 *iface, HDC dc, IDirectDrawSurface **surface) { IDirectDrawImpl *This = impl_from_IDirectDraw3(iface); + IDirectDrawSurface7 *surface7; + IDirectDrawSurfaceImpl *surface_impl; + HRESULT hr; TRACE("iface %p, dc %p, surface %p.\n", iface, dc, surface); - return ddraw7_GetSurfaceFromDC(&This->IDirectDraw7_iface, dc, (IDirectDrawSurface7 **)surface); + if (!surface) return E_INVALIDARG; + + hr = ddraw7_GetSurfaceFromDC(&This->IDirectDraw7_iface, dc, &surface7); + if (FAILED(hr)) + { + *surface = NULL; + return hr; + } + + surface_impl = impl_from_IDirectDrawSurface7(surface7); + *surface = (IDirectDrawSurface *)&surface_impl->IDirectDrawSurface3_iface; + + return hr; } /***************************************************************************** @@ -2513,7 +2570,7 @@ static HRESULT WINAPI ddraw7_StartModeTest(IDirectDraw7 *iface, SIZE *Modes, DWO *****************************************************************************/ HRESULT WINAPI ddraw_recreate_surfaces_cb(IDirectDrawSurface7 *surf, DDSURFACEDESC2 *desc, void *Context) { - IDirectDrawSurfaceImpl *surfImpl = (IDirectDrawSurfaceImpl *)surf; + IDirectDrawSurfaceImpl *surfImpl = impl_from_IDirectDrawSurface7(surf); struct wined3d_resource_desc wined3d_desc; struct wined3d_resource *wined3d_resource; IDirectDrawImpl *This = surfImpl->ddraw; @@ -3016,7 +3073,7 @@ static HRESULT ddraw_create_gdi_swapchain(IDirectDrawImpl *ddraw, IDirectDrawSur * *****************************************************************************/ static HRESULT CreateSurface(IDirectDrawImpl *ddraw, DDSURFACEDESC2 *DDSD, - IDirectDrawSurface7 **Surf, IUnknown *UnkOuter) + IDirectDrawSurfaceImpl **Surf, IUnknown *UnkOuter) { IDirectDrawSurfaceImpl *object = NULL; HRESULT hr; @@ -3281,7 +3338,7 @@ static HRESULT CreateSurface(IDirectDrawImpl *ddraw, DDSURFACEDESC2 *DDSD, } object->is_complex_root = TRUE; - *Surf = (IDirectDrawSurface7 *)object; + *Surf = object; /* Create Additional surfaces if necessary * This applies to Primary surfaces which have a back buffer count @@ -3322,7 +3379,7 @@ static HRESULT CreateSurface(IDirectDrawImpl *ddraw, DDSURFACEDESC2 *DDSD, if(hr != DD_OK) { /* This destroys and possibly created surfaces too */ - IDirectDrawSurface_Release((IDirectDrawSurface7 *)object); + IDirectDrawSurface7_Release(&object->IDirectDrawSurface7_iface); LeaveCriticalSection(&ddraw_cs); return hr; } @@ -3405,6 +3462,8 @@ static HRESULT WINAPI ddraw7_CreateSurface(IDirectDraw7 *iface, DDSURFACEDESC2 * IDirectDrawSurface7 **surface, IUnknown *outer_unknown) { IDirectDrawImpl *This = impl_from_IDirectDraw7(iface); + IDirectDrawSurfaceImpl *impl; + HRESULT hr; TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n", iface, surface_desc, surface, outer_unknown); @@ -3427,7 +3486,16 @@ static HRESULT WINAPI ddraw7_CreateSurface(IDirectDraw7 *iface, DDSURFACEDESC2 * return DDERR_INVALIDCAPS; } - return CreateSurface(This, surface_desc, surface, outer_unknown); + hr = CreateSurface(This, surface_desc, &impl, outer_unknown); + if (FAILED(hr)) + { + *surface = NULL; + return hr; + } + + *surface = &impl->IDirectDrawSurface7_iface; + + return hr; } static HRESULT WINAPI ddraw4_CreateSurface(IDirectDraw4 *iface, @@ -3458,10 +3526,10 @@ static HRESULT WINAPI ddraw4_CreateSurface(IDirectDraw4 *iface, return DDERR_INVALIDCAPS; } - hr = CreateSurface(This, surface_desc, (IDirectDrawSurface7 **)surface, outer_unknown); - impl = (IDirectDrawSurfaceImpl *)*surface; + hr = CreateSurface(This, surface_desc, &impl, outer_unknown); if (SUCCEEDED(hr) && impl) { + *surface = (IDirectDrawSurface4 *)impl; ddraw_set_surface_version(impl, 4); IDirectDraw7_Release(&This->IDirectDraw7_iface); IDirectDraw4_AddRef(iface); @@ -3475,7 +3543,6 @@ static HRESULT WINAPI ddraw3_CreateSurface(IDirectDraw3 *iface, DDSURFACEDESC *s IDirectDrawSurface **surface, IUnknown *outer_unknown) { IDirectDrawImpl *This = impl_from_IDirectDraw3(iface); - IDirectDrawSurface7 *surface7; IDirectDrawSurfaceImpl *impl; HRESULT hr; @@ -3500,14 +3567,13 @@ static HRESULT WINAPI ddraw3_CreateSurface(IDirectDraw3 *iface, DDSURFACEDESC *s return DDERR_INVALIDCAPS; } - hr = CreateSurface(This, (DDSURFACEDESC2 *)surface_desc, &surface7, outer_unknown); + hr = CreateSurface(This, (DDSURFACEDESC2 *)surface_desc, &impl, outer_unknown); if (FAILED(hr)) { *surface = NULL; return hr; } - impl = (IDirectDrawSurfaceImpl *)surface7; *surface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_iface; ddraw_set_surface_version(impl, 3); IDirectDraw7_Release(&This->IDirectDraw7_iface); @@ -3521,7 +3587,6 @@ static HRESULT WINAPI ddraw2_CreateSurface(IDirectDraw2 *iface, DDSURFACEDESC *surface_desc, IDirectDrawSurface **surface, IUnknown *outer_unknown) { IDirectDrawImpl *This = impl_from_IDirectDraw2(iface); - IDirectDrawSurface7 *surface7; IDirectDrawSurfaceImpl *impl; HRESULT hr; @@ -3546,14 +3611,13 @@ static HRESULT WINAPI ddraw2_CreateSurface(IDirectDraw2 *iface, return DDERR_INVALIDCAPS; } - hr = CreateSurface(This, (DDSURFACEDESC2 *)surface_desc, &surface7, outer_unknown); + hr = CreateSurface(This, (DDSURFACEDESC2 *)surface_desc, &impl, outer_unknown); if (FAILED(hr)) { *surface = NULL; return hr; } - impl = (IDirectDrawSurfaceImpl *)surface7; *surface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_iface; ddraw_set_surface_version(impl, 2); IDirectDraw7_Release(&This->IDirectDraw7_iface); @@ -3566,7 +3630,6 @@ static HRESULT WINAPI ddraw1_CreateSurface(IDirectDraw *iface, DDSURFACEDESC *surface_desc, IDirectDrawSurface **surface, IUnknown *outer_unknown) { IDirectDrawImpl *This = impl_from_IDirectDraw(iface); - IDirectDrawSurface7 *surface7; IDirectDrawSurfaceImpl *impl; HRESULT hr; @@ -3582,14 +3645,13 @@ static HRESULT WINAPI ddraw1_CreateSurface(IDirectDraw *iface, /* Remove front buffer flag, this causes failure in v7, and its added to normal * primaries anyway. */ surface_desc->ddsCaps.dwCaps &= ~DDSCAPS_FRONTBUFFER; - hr = CreateSurface(This, (DDSURFACEDESC2 *)surface_desc, &surface7, outer_unknown); + hr = CreateSurface(This, (DDSURFACEDESC2 *)surface_desc, &impl, outer_unknown); if (FAILED(hr)) { *surface = NULL; return hr; } - impl = (IDirectDrawSurfaceImpl *)surface7; *surface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_iface; ddraw_set_surface_version(impl, 1); IDirectDraw7_Release(&This->IDirectDraw7_iface); @@ -3719,9 +3781,10 @@ struct surfacescallback_context static HRESULT CALLBACK EnumSurfacesCallbackThunk(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *surface_desc, void *context) { + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(surface); struct surfacescallback_context *cbcontext = context; - return cbcontext->func((IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)surface)->IDirectDrawSurface3_iface, + return cbcontext->func((IDirectDrawSurface *)&This->IDirectDrawSurface3_iface, (DDSURFACEDESC *)surface_desc, cbcontext->context); } @@ -3780,8 +3843,8 @@ static HRESULT WINAPI ddraw7_EnumSurfaces(IDirectDraw7 *iface, DWORD Flags, if (all || (nomatch != ddraw_match_surface_desc(DDSD, &surf->surface_desc))) { desc = surf->surface_desc; - IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)surf); - if (Callback((IDirectDrawSurface7 *)surf, &desc, Context) != DDENUMRET_OK) + IDirectDrawSurface7_AddRef(&surf->IDirectDrawSurface7_iface); + if (Callback(&surf->IDirectDrawSurface7_iface, &desc, Context) != DDENUMRET_OK) { LeaveCriticalSection(&ddraw_cs); return DD_OK; @@ -4134,7 +4197,7 @@ static HRESULT WINAPI ddraw1_CreatePalette(IDirectDraw *iface, DWORD flags, static HRESULT WINAPI ddraw7_DuplicateSurface(IDirectDraw7 *iface, IDirectDrawSurface7 *Src, IDirectDrawSurface7 **Dest) { - IDirectDrawSurfaceImpl *Surf = (IDirectDrawSurfaceImpl *)Src; + IDirectDrawSurfaceImpl *Surf = unsafe_impl_from_IDirectDrawSurface7(Src); FIXME("iface %p, src %p, dst %p partial stub!\n", iface, Src, Dest); @@ -4149,11 +4212,23 @@ static HRESULT WINAPI ddraw4_DuplicateSurface(IDirectDraw4 *iface, IDirectDrawSu IDirectDrawSurface4 **dst) { IDirectDrawImpl *This = impl_from_IDirectDraw4(iface); + IDirectDrawSurfaceImpl *src_impl = (IDirectDrawSurfaceImpl *)src; + IDirectDrawSurface7 *dst7; + IDirectDrawSurfaceImpl *dst_impl; + HRESULT hr; TRACE("iface %p, src %p, dst %p.\n", iface, src, dst); + hr = ddraw7_DuplicateSurface(&This->IDirectDraw7_iface, + src_impl ? &src_impl->IDirectDrawSurface7_iface : NULL, &dst7); + if (FAILED(hr)) + { + *dst = NULL; + return hr; + } + dst_impl = impl_from_IDirectDrawSurface7(dst7); + *dst = (IDirectDrawSurface4 *)dst_impl; - return ddraw7_DuplicateSurface(&This->IDirectDraw7_iface, (IDirectDrawSurface7 *)src, - (IDirectDrawSurface7 **)dst); + return hr; } static HRESULT WINAPI ddraw3_DuplicateSurface(IDirectDraw3 *iface, IDirectDrawSurface *src, @@ -4162,13 +4237,18 @@ static HRESULT WINAPI ddraw3_DuplicateSurface(IDirectDraw3 *iface, IDirectDrawSu IDirectDrawImpl *This = impl_from_IDirectDraw3(iface); IDirectDrawSurfaceImpl *src_impl = unsafe_impl_from_IDirectDrawSurface3((IDirectDrawSurface3 *)src); IDirectDrawSurface7 *dst7; + IDirectDrawSurfaceImpl *dst_impl; HRESULT hr; TRACE("iface %p, src %p, dst %p.\n", iface, src, dst); - hr = ddraw7_DuplicateSurface(&This->IDirectDraw7_iface, (IDirectDrawSurface7 *)src_impl, &dst7); + hr = ddraw7_DuplicateSurface(&This->IDirectDraw7_iface, + src_impl ? &src_impl->IDirectDrawSurface7_iface : NULL, &dst7); if (FAILED(hr)) return hr; - *dst = (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)dst7)->IDirectDrawSurface3_iface; + + dst_impl = impl_from_IDirectDrawSurface7(dst7); + *dst = (IDirectDrawSurface *)&dst_impl->IDirectDrawSurface3_iface; + return hr; } @@ -4178,13 +4258,18 @@ static HRESULT WINAPI ddraw2_DuplicateSurface(IDirectDraw2 *iface, IDirectDrawImpl *This = impl_from_IDirectDraw2(iface); IDirectDrawSurfaceImpl *src_impl = unsafe_impl_from_IDirectDrawSurface3((IDirectDrawSurface3 *)src); IDirectDrawSurface7 *dst7; + IDirectDrawSurfaceImpl *dst_impl; HRESULT hr; TRACE("iface %p, src %p, dst %p.\n", iface, src, dst); - hr = ddraw7_DuplicateSurface(&This->IDirectDraw7_iface, (IDirectDrawSurface7 *)src_impl, &dst7); + hr = ddraw7_DuplicateSurface(&This->IDirectDraw7_iface, + src_impl ? &src_impl->IDirectDrawSurface7_iface : NULL, &dst7); if (FAILED(hr)) return hr; - *dst = (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)dst7)->IDirectDrawSurface3_iface; + + dst_impl = impl_from_IDirectDrawSurface7(dst7); + *dst = (IDirectDrawSurface *)&dst_impl->IDirectDrawSurface3_iface; + return hr; } @@ -4194,13 +4279,18 @@ static HRESULT WINAPI ddraw1_DuplicateSurface(IDirectDraw *iface, IDirectDrawSur IDirectDrawImpl *This = impl_from_IDirectDraw(iface); IDirectDrawSurfaceImpl *src_impl = unsafe_impl_from_IDirectDrawSurface3((IDirectDrawSurface3 *)src); IDirectDrawSurface7 *dst7; + IDirectDrawSurfaceImpl *dst_impl; HRESULT hr; TRACE("iface %p, src %p, dst %p.\n", iface, src, dst); - hr = ddraw7_DuplicateSurface(&This->IDirectDraw7_iface, (IDirectDrawSurface7 *)src_impl, &dst7); + hr = ddraw7_DuplicateSurface(&This->IDirectDraw7_iface, + src_impl ? &src_impl->IDirectDrawSurface7_iface : NULL, &dst7); if (FAILED(hr)) return hr; - *dst = (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)dst7)->IDirectDrawSurface3_iface; + + dst_impl = impl_from_IDirectDrawSurface7(dst7); + *dst = (IDirectDrawSurface *)&dst_impl->IDirectDrawSurface3_iface; + return hr; } @@ -4697,7 +4787,7 @@ static HRESULT WINAPI d3d1_FindDevice(IDirect3D *iface, D3DFINDDEVICESEARCH *fds static HRESULT WINAPI d3d7_CreateDevice(IDirect3D7 *iface, REFCLSID riid, IDirectDrawSurface7 *surface, IDirect3DDevice7 **device) { - IDirectDrawSurfaceImpl *target = (IDirectDrawSurfaceImpl *)surface; + IDirectDrawSurfaceImpl *target = unsafe_impl_from_IDirectDrawSurface7(surface); IDirectDrawImpl *This = impl_from_IDirect3D7(iface); IDirect3DDeviceImpl *object; HRESULT hr; @@ -4754,6 +4844,7 @@ static HRESULT WINAPI d3d3_CreateDevice(IDirect3D3 *iface, REFCLSID riid, IDirectDrawSurface4 *surface, IDirect3DDevice3 **device, IUnknown *outer_unknown) { IDirectDrawImpl *This = impl_from_IDirect3D3(iface); + IDirectDrawSurfaceImpl *surface_impl = (IDirectDrawSurfaceImpl *)surface; HRESULT hr; TRACE("iface %p, riid %s, surface %p, device %p, outer_unknown %p.\n", @@ -4761,7 +4852,8 @@ static HRESULT WINAPI d3d3_CreateDevice(IDirect3D3 *iface, REFCLSID riid, if (outer_unknown) return CLASS_E_NOAGGREGATION; - hr = d3d7_CreateDevice(&This->IDirect3D7_iface, riid, (IDirectDrawSurface7 *)surface, + hr = d3d7_CreateDevice(&This->IDirect3D7_iface, riid, + surface_impl ? &surface_impl->IDirectDrawSurface7_iface : NULL, (IDirect3DDevice7 **)device); if (*device) *device = (IDirect3DDevice3 *)&((IDirect3DDeviceImpl *)*device)->IDirect3DDevice3_vtbl; @@ -4779,7 +4871,7 @@ static HRESULT WINAPI d3d2_CreateDevice(IDirect3D2 *iface, REFCLSID riid, iface, debugstr_guid(riid), surface, device); hr = d3d7_CreateDevice(&This->IDirect3D7_iface, riid, - surface_impl ? (IDirectDrawSurface7 *)surface_impl : NULL, + surface_impl ? &surface_impl->IDirectDrawSurface7_iface : NULL, (IDirect3DDevice7 **)device); if (*device) *device = (IDirect3DDevice2 *)&((IDirect3DDeviceImpl *)*device)->IDirect3DDevice2_vtbl; @@ -5677,8 +5769,8 @@ static HRESULT CDECL device_parent_create_surface(struct wined3d_device_parent * if (!surf) { IDirectDrawSurface7 *attached; - IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)ddraw->tex_root, &searchcaps, &attached); - surf = (IDirectDrawSurfaceImpl *)attached; + IDirectDrawSurface7_GetAttachedSurface(&ddraw->tex_root->IDirectDrawSurface7_iface, &searchcaps, &attached); + surf = unsafe_impl_from_IDirectDrawSurface7(attached); IDirectDrawSurface7_Release(attached); } if (!surf) ERR("root search surface not found\n"); @@ -5687,9 +5779,9 @@ static HRESULT CDECL device_parent_create_surface(struct wined3d_device_parent * while (i < level) { IDirectDrawSurface7 *attached; - IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)surf, &searchcaps, &attached); + IDirectDrawSurface7_GetAttachedSurface(&surf->IDirectDrawSurface7_iface, &searchcaps, &attached); if(!attached) ERR("Surface not found\n"); - surf = (IDirectDrawSurfaceImpl *)attached; + surf = impl_from_IDirectDrawSurface7(attached); IDirectDrawSurface7_Release(attached); ++i; } @@ -5705,7 +5797,7 @@ static HRESULT CDECL device_parent_create_surface(struct wined3d_device_parent * static HRESULT WINAPI findRenderTarget(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *surface_desc, void *ctx) { - IDirectDrawSurfaceImpl *s = (IDirectDrawSurfaceImpl *)surface; + IDirectDrawSurfaceImpl *s = impl_from_IDirectDrawSurface7(surface); IDirectDrawSurfaceImpl **target = ctx; if (!s->isRenderTarget) @@ -5740,7 +5832,7 @@ static HRESULT CDECL device_parent_create_rendertarget(struct wined3d_device_par if (d3d_surface->isRenderTarget) { - IDirectDrawSurface7_EnumAttachedSurfaces((IDirectDrawSurface7 *)d3d_surface, &target, findRenderTarget); + IDirectDrawSurface7_EnumAttachedSurfaces(&d3d_surface->IDirectDrawSurface7_iface, &target, findRenderTarget); } else { @@ -5769,6 +5861,7 @@ static HRESULT CDECL device_parent_create_depth_stencil(struct wined3d_device_pa DWORD multisample_quality, BOOL discard, struct wined3d_surface **surface) { struct IDirectDrawImpl *ddraw = ddraw_from_device_parent(device_parent); + IDirectDrawSurface7 *ddraw7; IDirectDrawSurfaceImpl *ddraw_surface; DDSURFACEDESC2 ddsd; HRESULT hr; @@ -5797,8 +5890,7 @@ static HRESULT CDECL device_parent_create_depth_stencil(struct wined3d_device_pa } ddraw->depthstencil = TRUE; - hr = IDirectDraw7_CreateSurface(&ddraw->IDirectDraw7_iface, &ddsd, - (IDirectDrawSurface7 **)&ddraw_surface, NULL); + hr = IDirectDraw7_CreateSurface(&ddraw->IDirectDraw7_iface, &ddsd, &ddraw7, NULL); ddraw->depthstencil = FALSE; if (FAILED(hr)) { @@ -5806,9 +5898,10 @@ static HRESULT CDECL device_parent_create_depth_stencil(struct wined3d_device_pa return hr; } + ddraw_surface = impl_from_IDirectDrawSurface7(ddraw7); *surface = ddraw_surface->wined3d_surface; wined3d_surface_incref(*surface); - IDirectDrawSurface7_Release((IDirectDrawSurface7 *)ddraw_surface); + IDirectDrawSurface7_Release(&ddraw_surface->IDirectDrawSurface7_iface); return D3D_OK; } diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 0eb26b0..a13269a 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -167,7 +167,7 @@ extern WINED3DSURFTYPE DefaultSurfaceType DECLSPEC_HIDDEN; struct IDirectDrawSurfaceImpl { /* IUnknown fields */ - const IDirectDrawSurface7Vtbl *lpVtbl; + IDirectDrawSurface7 IDirectDrawSurface7_iface; IDirectDrawSurface3 IDirectDrawSurface3_iface; const IDirectDrawGammaControlVtbl *IDirectDrawGammaControl_vtbl; const IDirect3DTexture2Vtbl *IDirect3DTexture2_vtbl; @@ -240,7 +240,14 @@ static inline IDirectDrawSurfaceImpl *impl_from_IDirectDrawSurface3(IDirectDrawS return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirectDrawSurface3_iface); } -IDirectDrawSurfaceImpl *unsafe_impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface); +IDirectDrawSurfaceImpl *unsafe_impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface) DECLSPEC_HIDDEN; + +static inline IDirectDrawSurfaceImpl *impl_from_IDirectDrawSurface7(IDirectDrawSurface7 *iface) +{ + return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirectDrawSurface7_iface); +} + +IDirectDrawSurfaceImpl *unsafe_impl_from_IDirectDrawSurface7(IDirectDrawSurface7 *iface) DECLSPEC_HIDDEN; /* Get the number of bytes per pixel for a given surface */ #define PFGET_BPP(pf) (pf.dwFlags&DDPF_PALETTEINDEXED8?1:((pf.dwRGBBitCount+7)/8)) diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index 3bbc682..bbf464d 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -359,8 +359,8 @@ IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface) /* Release the render target and the WineD3D render target * (See IDirect3D7::CreateDevice for more comments on this) */ - IDirectDrawSurface7_Release((IDirectDrawSurface7 *)This->target); - IDirectDrawSurface7_Release((IDirectDrawSurface7 *)This->ddraw->d3d_target); + IDirectDrawSurface7_Release(&This->target->IDirectDrawSurface7_iface); + IDirectDrawSurface7_Release(&This->ddraw->d3d_target->IDirectDrawSurface7_iface); TRACE("Target release done\n"); This->ddraw->d3ddevice = NULL; @@ -1832,7 +1832,7 @@ IDirect3DDeviceImpl_7_SetRenderTarget(IDirect3DDevice7 *iface, DWORD Flags) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - IDirectDrawSurfaceImpl *Target = (IDirectDrawSurfaceImpl *)NewTarget; + IDirectDrawSurfaceImpl *Target = unsafe_impl_from_IDirectDrawSurface7(NewTarget); HRESULT hr; TRACE("iface %p, target %p, flags %#x.\n", iface, NewTarget, Flags); @@ -1855,7 +1855,7 @@ IDirect3DDeviceImpl_7_SetRenderTarget(IDirect3DDevice7 *iface, return hr; } IDirectDrawSurface7_AddRef(NewTarget); - IDirectDrawSurface7_Release((IDirectDrawSurface7 *)This->target); + IDirectDrawSurface7_Release(&This->target->IDirectDrawSurface7_iface); This->target = Target; IDirect3DDeviceImpl_UpdateDepthStencil(This); LeaveCriticalSection(&ddraw_cs); @@ -1893,18 +1893,20 @@ static HRESULT WINAPI IDirect3DDeviceImpl_3_SetRenderTarget(IDirect3DDevice3 *if TRACE("iface %p, target %p, flags %#x.\n", iface, NewRenderTarget, Flags); - return IDirect3DDevice7_SetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 *)Target, Flags); + return IDirect3DDevice7_SetRenderTarget((IDirect3DDevice7 *)This, + Target ? &Target->IDirectDrawSurface7_iface : NULL, Flags); } static HRESULT WINAPI IDirect3DDeviceImpl_2_SetRenderTarget(IDirect3DDevice2 *iface, IDirectDrawSurface *NewRenderTarget, DWORD Flags) { IDirect3DDeviceImpl *This = device_from_device2(iface); - IDirectDrawSurfaceImpl *Target = (IDirectDrawSurfaceImpl *)NewRenderTarget; + IDirectDrawSurfaceImpl *Target = unsafe_impl_from_IDirectDrawSurface3((IDirectDrawSurface3 *)NewRenderTarget); TRACE("iface %p, target %p, flags %#x.\n", iface, NewRenderTarget, Flags); - return IDirect3DDevice7_SetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 *)Target, Flags); + return IDirect3DDevice7_SetRenderTarget((IDirect3DDevice7 *)This, + Target ? &Target->IDirectDrawSurface7_iface : NULL, Flags); } /***************************************************************************** @@ -1936,7 +1938,7 @@ IDirect3DDeviceImpl_7_GetRenderTarget(IDirect3DDevice7 *iface, return DDERR_INVALIDPARAMS; EnterCriticalSection(&ddraw_cs); - *RenderTarget = (IDirectDrawSurface7 *)This->target; + *RenderTarget = &This->target->IDirectDrawSurface7_iface; IDirectDrawSurface7_AddRef(*RenderTarget); LeaveCriticalSection(&ddraw_cs); @@ -1947,12 +1949,19 @@ static HRESULT WINAPI IDirect3DDeviceImpl_3_GetRenderTarget(IDirect3DDevice3 *if IDirectDrawSurface4 **RenderTarget) { IDirect3DDeviceImpl *This = device_from_device3(iface); + IDirectDrawSurface7 *RenderTarget7; + IDirectDrawSurfaceImpl *RenderTargetImpl; HRESULT hr; TRACE("iface %p, target %p.\n", iface, RenderTarget); - hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 **)RenderTarget); + if(!RenderTarget) + return DDERR_INVALIDPARAMS; + + hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, &RenderTarget7); if(hr != D3D_OK) return hr; + RenderTargetImpl = impl_from_IDirectDrawSurface7(RenderTarget7); + *RenderTarget = (IDirectDrawSurface4 *)RenderTargetImpl; return D3D_OK; } @@ -1960,14 +1969,19 @@ static HRESULT WINAPI IDirect3DDeviceImpl_2_GetRenderTarget(IDirect3DDevice2 *if IDirectDrawSurface **RenderTarget) { IDirect3DDeviceImpl *This = device_from_device2(iface); + IDirectDrawSurface7 *RenderTarget7; + IDirectDrawSurfaceImpl *RenderTargetImpl; HRESULT hr; TRACE("iface %p, target %p.\n", iface, RenderTarget); - hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 **)RenderTarget); + if(!RenderTarget) + return DDERR_INVALIDPARAMS; + + hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, &RenderTarget7); if(hr != D3D_OK) return hr; - *RenderTarget = *RenderTarget ? - (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)*RenderTarget)->IDirectDrawSurface3_iface : NULL; + RenderTargetImpl = impl_from_IDirectDrawSurface7(RenderTarget7); + *RenderTarget = (IDirectDrawSurface *)&RenderTargetImpl->IDirectDrawSurface3_iface; return D3D_OK; } @@ -4517,7 +4531,7 @@ IDirect3DDeviceImpl_7_SetTexture(IDirect3DDevice7 *iface, IDirectDrawSurface7 *Texture) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - IDirectDrawSurfaceImpl *surf = (IDirectDrawSurfaceImpl *)Texture; + IDirectDrawSurfaceImpl *surf = unsafe_impl_from_IDirectDrawSurface7(Texture); HRESULT hr; TRACE("iface %p, stage %u, texture %p.\n", iface, Stage, Texture); @@ -4570,7 +4584,7 @@ IDirect3DDeviceImpl_3_SetTexture(IDirect3DDevice3 *iface, if (This->legacyTextureBlending) IDirect3DDevice3_GetRenderState(iface, D3DRENDERSTATE_TEXTUREMAPBLEND, &texmapblend); - hr = IDirect3DDevice7_SetTexture((IDirect3DDevice7 *)This, Stage, (IDirectDrawSurface7 *)tex); + hr = IDirect3DDevice7_SetTexture((IDirect3DDevice7 *)This, Stage, &tex->IDirectDrawSurface7_iface); if (This->legacyTextureBlending && texmapblend == D3DTBLEND_MODULATE) { @@ -5526,7 +5540,7 @@ static HRESULT IDirect3DDeviceImpl_7_PreLoad(IDirect3DDevice7 *iface, IDirectDrawSurface7 *Texture) { - IDirectDrawSurfaceImpl *surf = (IDirectDrawSurfaceImpl *)Texture; + IDirectDrawSurfaceImpl *surf = unsafe_impl_from_IDirectDrawSurface7(Texture); TRACE("iface %p, texture %p.\n", iface, Texture); @@ -5862,24 +5876,24 @@ static BOOL is_mip_level_subset(IDirectDrawSurfaceImpl *dest, ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd.ddsCaps.dwCaps2 = DDSCAPS2_MIPMAPSUBLEVEL; - IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)dest_level, &ddsd.ddsCaps, &temp); + IDirectDrawSurface7_GetAttachedSurface(&dest_level->IDirectDrawSurface7_iface, &ddsd.ddsCaps, &temp); - if (dest_level != dest) IDirectDrawSurface7_Release((IDirectDrawSurface7 *)dest_level); + if (dest_level != dest) IDirectDrawSurface7_Release(&dest_level->IDirectDrawSurface7_iface); - dest_level = (IDirectDrawSurfaceImpl *)temp; + dest_level = unsafe_impl_from_IDirectDrawSurface7(temp); } ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd.ddsCaps.dwCaps2 = DDSCAPS2_MIPMAPSUBLEVEL; - IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)src_level, &ddsd.ddsCaps, &temp); + IDirectDrawSurface7_GetAttachedSurface(&src_level->IDirectDrawSurface7_iface, &ddsd.ddsCaps, &temp); - if (src_level != src) IDirectDrawSurface7_Release((IDirectDrawSurface7 *)src_level); + if (src_level != src) IDirectDrawSurface7_Release(&src_level->IDirectDrawSurface7_iface); - src_level = (IDirectDrawSurfaceImpl *)temp; + src_level = unsafe_impl_from_IDirectDrawSurface7(temp); } - if (src_level && src_level != src) IDirectDrawSurface7_Release((IDirectDrawSurface7 *)src_level); - if (dest_level && dest_level != dest) IDirectDrawSurface7_Release((IDirectDrawSurface7 *)dest_level); + if (src_level && src_level != src) IDirectDrawSurface7_Release(&src_level->IDirectDrawSurface7_iface); + if (dest_level && dest_level != dest) IDirectDrawSurface7_Release(&dest_level->IDirectDrawSurface7_iface); return !dest_level && levelFound; } @@ -5903,8 +5917,8 @@ static void copy_mipmap_chain(IDirect3DDeviceImpl *device, BOOL palette_missing = FALSE; /* Copy palette, if possible. */ - IDirectDrawSurface7_GetPalette((IDirectDrawSurface7 *)src, &pal_src); - IDirectDrawSurface7_GetPalette((IDirectDrawSurface7 *)dest, &pal); + IDirectDrawSurface7_GetPalette(&src->IDirectDrawSurface7_iface, &pal_src); + IDirectDrawSurface7_GetPalette(&dest->IDirectDrawSurface7_iface, &pal); if (pal_src != NULL && pal != NULL) { @@ -5926,11 +5940,11 @@ static void copy_mipmap_chain(IDirect3DDeviceImpl *device, /* Copy colorkeys, if present. */ for (ckeyflag = DDCKEY_DESTBLT; ckeyflag <= DDCKEY_SRCOVERLAY; ckeyflag <<= 1) { - hr = IDirectDrawSurface7_GetColorKey((IDirectDrawSurface7 *)src, ckeyflag, &ddckey); + hr = IDirectDrawSurface7_GetColorKey(&src->IDirectDrawSurface7_iface, ckeyflag, &ddckey); if (SUCCEEDED(hr)) { - IDirectDrawSurface7_SetColorKey((IDirectDrawSurface7 *)dest, ckeyflag, &ddckey); + IDirectDrawSurface7_SetColorKey(&dest->IDirectDrawSurface7_iface, ckeyflag, &ddckey); } } @@ -5963,20 +5977,20 @@ static void copy_mipmap_chain(IDirect3DDeviceImpl *device, ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd.ddsCaps.dwCaps2 = DDSCAPS2_MIPMAPSUBLEVEL; - IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)dest_level, &ddsd.ddsCaps, &temp); + IDirectDrawSurface7_GetAttachedSurface(&dest_level->IDirectDrawSurface7_iface, &ddsd.ddsCaps, &temp); - if (dest_level != dest) IDirectDrawSurface7_Release((IDirectDrawSurface7 *)dest_level); + if (dest_level != dest) IDirectDrawSurface7_Release(&dest_level->IDirectDrawSurface7_iface); - dest_level = (IDirectDrawSurfaceImpl *)temp; + dest_level = unsafe_impl_from_IDirectDrawSurface7(temp); } ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd.ddsCaps.dwCaps2 = DDSCAPS2_MIPMAPSUBLEVEL; - IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)src_level, &ddsd.ddsCaps, &temp); + IDirectDrawSurface7_GetAttachedSurface(&src_level->IDirectDrawSurface7_iface, &ddsd.ddsCaps, &temp); - if (src_level != src) IDirectDrawSurface7_Release((IDirectDrawSurface7 *)src_level); + if (src_level != src) IDirectDrawSurface7_Release(&src_level->IDirectDrawSurface7_iface); - src_level = (IDirectDrawSurfaceImpl *)temp; + src_level = unsafe_impl_from_IDirectDrawSurface7(temp); point.x /= 2; point.y /= 2; @@ -5987,8 +6001,8 @@ static void copy_mipmap_chain(IDirect3DDeviceImpl *device, rect.bottom = (rect.bottom + 1) / 2; } - if (src_level && src_level != src) IDirectDrawSurface7_Release((IDirectDrawSurface7 *)src_level); - if (dest_level && dest_level != dest) IDirectDrawSurface7_Release((IDirectDrawSurface7 *)dest_level); + if (src_level && src_level != src) IDirectDrawSurface7_Release(&src_level->IDirectDrawSurface7_iface); + if (dest_level && dest_level != dest) IDirectDrawSurface7_Release(&dest_level->IDirectDrawSurface7_iface); } /***************************************************************************** @@ -6025,8 +6039,8 @@ IDirect3DDeviceImpl_7_Load(IDirect3DDevice7 *iface, DWORD Flags) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - IDirectDrawSurfaceImpl *dest = (IDirectDrawSurfaceImpl *)DestTex; - IDirectDrawSurfaceImpl *src = (IDirectDrawSurfaceImpl *)SrcTex; + IDirectDrawSurfaceImpl *dest = unsafe_impl_from_IDirectDrawSurface7(DestTex); + IDirectDrawSurfaceImpl *src = unsafe_impl_from_IDirectDrawSurface7(SrcTex); POINT destpoint; RECT srcrect; @@ -6122,15 +6136,15 @@ IDirect3DDeviceImpl_7_Load(IDirect3DDevice7 *iface, { ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd.ddsCaps.dwCaps2 = DDSCAPS2_CUBEMAP | (src_face_flag << 1); - IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)src, &ddsd.ddsCaps, &temp); + IDirectDrawSurface7_GetAttachedSurface(&src->IDirectDrawSurface7_iface, &ddsd.ddsCaps, &temp); - if (src_face != src) IDirectDrawSurface7_Release((IDirectDrawSurface7 *)src_face); + if (src_face != src) IDirectDrawSurface7_Release(&src_face->IDirectDrawSurface7_iface); - src_face = (IDirectDrawSurfaceImpl *)temp; + src_face = unsafe_impl_from_IDirectDrawSurface7(temp); } else { - if (src_face != src) IDirectDrawSurface7_Release((IDirectDrawSurface7 *)src_face); + if (src_face != src) IDirectDrawSurface7_Release(&src_face->IDirectDrawSurface7_iface); src_face = NULL; } @@ -6140,15 +6154,15 @@ IDirect3DDeviceImpl_7_Load(IDirect3DDevice7 *iface, { ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd.ddsCaps.dwCaps2 = DDSCAPS2_CUBEMAP | (dest_face_flag << 1); - IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)dest, &ddsd.ddsCaps, &temp); + IDirectDrawSurface7_GetAttachedSurface(&dest->IDirectDrawSurface7_iface, &ddsd.ddsCaps, &temp); - if (dest_face != dest) IDirectDrawSurface7_Release((IDirectDrawSurface7 *)dest_face); + if (dest_face != dest) IDirectDrawSurface7_Release(&dest_face->IDirectDrawSurface7_iface); - dest_face = (IDirectDrawSurfaceImpl *)temp; + dest_face = unsafe_impl_from_IDirectDrawSurface7(temp); } else { - if (dest_face != dest) IDirectDrawSurface7_Release((IDirectDrawSurface7 *)dest_face); + if (dest_face != dest) IDirectDrawSurface7_Release(&dest_face->IDirectDrawSurface7_iface); dest_face = NULL; } @@ -6740,7 +6754,7 @@ IDirect3DDeviceImpl_UpdateDepthStencil(IDirect3DDeviceImpl *This) IDirectDrawSurfaceImpl *dsi; static DDSCAPS2 depthcaps = { DDSCAPS_ZBUFFER, 0, 0, 0 }; - IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)This->target, &depthcaps, &depthStencil); + IDirectDrawSurface7_GetAttachedSurface(&This->target->IDirectDrawSurface7_iface, &depthcaps, &depthStencil); if(!depthStencil) { TRACE("Setting wined3d depth stencil to NULL\n"); @@ -6748,7 +6762,7 @@ IDirect3DDeviceImpl_UpdateDepthStencil(IDirect3DDeviceImpl *This) return WINED3DZB_FALSE; } - dsi = (IDirectDrawSurfaceImpl *)depthStencil; + dsi = impl_from_IDirectDrawSurface7(depthStencil); TRACE("Setting wined3d depth stencil to %p (wined3d %p)\n", dsi, dsi->wined3d_surface); wined3d_device_set_depth_stencil(This->wined3d_device, dsi->wined3d_surface); @@ -6815,8 +6829,8 @@ HRESULT d3d_device_init(IDirect3DDeviceImpl *device, IDirectDrawImpl *ddraw, IDi * * In most cases, those surfaces are the same anyway, but this will simply * add another ref which is released when the device is destroyed. */ - IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)target); - IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)ddraw->d3d_target); + IDirectDrawSurface7_AddRef(&target->IDirectDrawSurface7_iface); + IDirectDrawSurface7_AddRef(&ddraw->d3d_target->IDirectDrawSurface7_iface); ddraw->d3ddevice = device; diff --git a/dlls/ddraw/main.c b/dlls/ddraw/main.c index 757d9c4..7a693ee 100644 --- a/dlls/ddraw/main.c +++ b/dlls/ddraw/main.c @@ -751,7 +751,7 @@ DestroyCallback(IDirectDrawSurface7 *surf, DDSURFACEDESC2 *desc, void *context) { - IDirectDrawSurfaceImpl *Impl = (IDirectDrawSurfaceImpl *)surf; + IDirectDrawSurfaceImpl *Impl = impl_from_IDirectDrawSurface7(surf); ULONG ref; ref = IDirectDrawSurface7_Release(surf); /* For the EnumSurfaces */ diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index a736298..ca54fa4 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -60,7 +60,7 @@ static inline IDirectDrawSurfaceImpl *surface_from_gamma_control(IDirectDrawGamm *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_QueryInterface(IDirectDrawSurface7 *iface, REFIID riid, void **obj) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); @@ -102,7 +102,7 @@ static HRESULT WINAPI ddraw_surface7_QueryInterface(IDirectDrawSurface7 *iface, IDirect3DDevice7 *d3d; /* Call into IDirect3D7 for creation */ - IDirect3D7_CreateDevice(&This->ddraw->IDirect3D7_iface, riid, (IDirectDrawSurface7 *)This, + IDirect3D7_CreateDevice(&This->ddraw->IDirect3D7_iface, riid, &This->IDirectDrawSurface7_iface, &d3d); if (d3d) @@ -141,28 +141,31 @@ static HRESULT WINAPI ddraw_surface3_QueryInterface(IDirectDrawSurface3 *iface, IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); - return ddraw_surface7_QueryInterface((IDirectDrawSurface7 *)This, riid, object); + return ddraw_surface7_QueryInterface(&This->IDirectDrawSurface7_iface, riid, object); } static HRESULT WINAPI ddraw_gamma_control_QueryInterface(IDirectDrawGammaControl *iface, REFIID riid, void **object) { + IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); - return ddraw_surface7_QueryInterface((IDirectDrawSurface7 *)surface_from_gamma_control(iface), riid, object); + return ddraw_surface7_QueryInterface(&This->IDirectDrawSurface7_iface, riid, object); } static HRESULT WINAPI d3d_texture2_QueryInterface(IDirect3DTexture2 *iface, REFIID riid, void **object) { + IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); - return ddraw_surface7_QueryInterface((IDirectDrawSurface7 *)surface_from_texture2(iface), riid, object); + return ddraw_surface7_QueryInterface(&This->IDirectDrawSurface7_iface, riid, object); } static HRESULT WINAPI d3d_texture1_QueryInterface(IDirect3DTexture *iface, REFIID riid, void **object) { + IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); - return ddraw_surface7_QueryInterface((IDirectDrawSurface7 *)surface_from_texture1(iface), riid, object); + return ddraw_surface7_QueryInterface(&This->IDirectDrawSurface7_iface, riid, object); } /***************************************************************************** @@ -176,7 +179,7 @@ static HRESULT WINAPI d3d_texture1_QueryInterface(IDirect3DTexture *iface, REFII *****************************************************************************/ static ULONG WINAPI ddraw_surface7_AddRef(IDirectDrawSurface7 *iface) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); ULONG refCount = InterlockedIncrement(&This->ref); TRACE("%p increasing refcount to %u.\n", This, refCount); @@ -199,28 +202,31 @@ static ULONG WINAPI ddraw_surface3_AddRef(IDirectDrawSurface3 *iface) IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p.\n", iface); - return ddraw_surface7_AddRef((IDirectDrawSurface7 *)This); + return ddraw_surface7_AddRef(&This->IDirectDrawSurface7_iface); } static ULONG WINAPI ddraw_gamma_control_AddRef(IDirectDrawGammaControl *iface) { + IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); TRACE("iface %p.\n", iface); - return ddraw_surface7_AddRef((IDirectDrawSurface7 *)surface_from_gamma_control(iface)); + return ddraw_surface7_AddRef(&This->IDirectDrawSurface7_iface); } static ULONG WINAPI d3d_texture2_AddRef(IDirect3DTexture2 *iface) { + IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); TRACE("iface %p.\n", iface); - return ddraw_surface7_AddRef((IDirectDrawSurface7 *)surface_from_texture2(iface)); + return ddraw_surface7_AddRef(&This->IDirectDrawSurface7_iface); } static ULONG WINAPI d3d_texture1_AddRef(IDirect3DTexture *iface) { + IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); TRACE("iface %p.\n", iface); - return ddraw_surface7_AddRef((IDirectDrawSurface7 *)surface_from_texture1(iface)); + return ddraw_surface7_AddRef(&This->IDirectDrawSurface7_iface); } /***************************************************************************** @@ -314,7 +320,7 @@ static void ddraw_surface_cleanup(IDirectDrawSurfaceImpl *surface) /* The refcount test shows that the palette is detached when the surface * is destroyed. */ - IDirectDrawSurface7_SetPalette((IDirectDrawSurface7 *)surface, NULL); + IDirectDrawSurface7_SetPalette(&surface->IDirectDrawSurface7_iface, NULL); /* Loop through all complex attached surfaces and destroy them. * @@ -376,7 +382,7 @@ static void ddraw_surface_cleanup(IDirectDrawSurfaceImpl *surface) *****************************************************************************/ static ULONG WINAPI ddraw_surface7_Release(IDirectDrawSurface7 *iface) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("%p decreasing refcount to %u.\n", This, ref); @@ -406,28 +412,31 @@ static ULONG WINAPI ddraw_surface3_Release(IDirectDrawSurface3 *iface) IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p.\n", iface); - return ddraw_surface7_Release((IDirectDrawSurface7 *)This); + return ddraw_surface7_Release(&This->IDirectDrawSurface7_iface); } static ULONG WINAPI ddraw_gamma_control_Release(IDirectDrawGammaControl *iface) { + IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); TRACE("iface %p.\n", iface); - return ddraw_surface7_Release((IDirectDrawSurface7 *)surface_from_gamma_control(iface)); + return ddraw_surface7_Release(&This->IDirectDrawSurface7_iface); } static ULONG WINAPI d3d_texture2_Release(IDirect3DTexture2 *iface) { + IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); TRACE("iface %p.\n", iface); - return ddraw_surface7_Release((IDirectDrawSurface7 *)surface_from_texture2(iface)); + return ddraw_surface7_Release(&This->IDirectDrawSurface7_iface); } static ULONG WINAPI d3d_texture1_Release(IDirect3DTexture *iface) { + IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); TRACE("iface %p.\n", iface); - return ddraw_surface7_Release((IDirectDrawSurface7 *)surface_from_texture1(iface)); + return ddraw_surface7_Release(&This->IDirectDrawSurface7_iface); } /***************************************************************************** @@ -460,7 +469,7 @@ static ULONG WINAPI d3d_texture1_Release(IDirect3DTexture *iface) static HRESULT WINAPI ddraw_surface7_GetAttachedSurface(IDirectDrawSurface7 *iface, DDSCAPS2 *Caps, IDirectDrawSurface7 **Surface) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); IDirectDrawSurfaceImpl *surf; DDSCAPS2 our_caps; int i; @@ -509,7 +518,7 @@ static HRESULT WINAPI ddraw_surface7_GetAttachedSurface(IDirectDrawSurface7 *ifa TRACE("(%p): Returning surface %p\n", This, surf); TRACE("(%p): mipmapcount=%d\n", This, surf->mipmap_level); - *Surface = (IDirectDrawSurface7 *)surf; + *Surface = &surf->IDirectDrawSurface7_iface; ddraw_surface7_AddRef(*Surface); LeaveCriticalSection(&ddraw_cs); return DD_OK; @@ -534,7 +543,7 @@ static HRESULT WINAPI ddraw_surface7_GetAttachedSurface(IDirectDrawSurface7 *ifa ((surf->surface_desc.ddsCaps.dwCaps2 & our_caps.dwCaps2) == our_caps.dwCaps2)) { TRACE("(%p): Returning surface %p\n", This, surf); - *Surface = (IDirectDrawSurface7 *)surf; + *Surface = &surf->IDirectDrawSurface7_iface; ddraw_surface7_AddRef(*Surface); LeaveCriticalSection(&ddraw_cs); return DD_OK; @@ -553,6 +562,7 @@ static HRESULT WINAPI ddraw_surface3_GetAttachedSurface(IDirectDrawSurface3 *ifa { IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); IDirectDrawSurface7 *attachment7; + IDirectDrawSurfaceImpl *attachment_impl; DDSCAPS2 caps2; HRESULT hr; @@ -563,11 +573,14 @@ static HRESULT WINAPI ddraw_surface3_GetAttachedSurface(IDirectDrawSurface3 *ifa caps2.dwCaps3 = 0; caps2.dwCaps4 = 0; - hr = ddraw_surface7_GetAttachedSurface((IDirectDrawSurface7 *)This, + hr = ddraw_surface7_GetAttachedSurface(&This->IDirectDrawSurface7_iface, &caps2, &attachment7); if (FAILED(hr)) *attachment = NULL; - else *attachment = attachment7 ? - &((IDirectDrawSurfaceImpl *)attachment7)->IDirectDrawSurface3_iface : NULL; + else + { + attachment_impl = impl_from_IDirectDrawSurface7(attachment7); + *attachment = &attachment_impl->IDirectDrawSurface3_iface; + } return hr; } @@ -592,7 +605,7 @@ static HRESULT WINAPI ddraw_surface3_GetAttachedSurface(IDirectDrawSurface3 *ifa static HRESULT WINAPI ddraw_surface7_Lock(IDirectDrawSurface7 *iface, RECT *Rect, DDSURFACEDESC2 *DDSD, DWORD Flags, HANDLE h) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); WINED3DLOCKED_RECT LockedRect; HRESULT hr; @@ -675,7 +688,7 @@ static HRESULT WINAPI ddraw_surface3_Lock(IDirectDrawSurface3 *iface, RECT *rect TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n", iface, wine_dbgstr_rect(rect), surface_desc, flags, h); - return ddraw_surface7_Lock((IDirectDrawSurface7 *)This, + return ddraw_surface7_Lock(&This->IDirectDrawSurface7_iface, rect, (DDSURFACEDESC2 *)surface_desc, flags, h); } @@ -694,7 +707,7 @@ static HRESULT WINAPI ddraw_surface3_Lock(IDirectDrawSurface3 *iface, RECT *rect *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_Unlock(IDirectDrawSurface7 *iface, RECT *pRect) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(pRect)); @@ -715,7 +728,7 @@ static HRESULT WINAPI ddraw_surface3_Unlock(IDirectDrawSurface3 *iface, void *da TRACE("iface %p, data %p.\n", iface, data); /* data might not be the LPRECT of later versions, so drop it. */ - return ddraw_surface7_Unlock((IDirectDrawSurface7 *)This, NULL); + return ddraw_surface7_Unlock(&This->IDirectDrawSurface7_iface, NULL); } /***************************************************************************** @@ -739,8 +752,8 @@ static HRESULT WINAPI ddraw_surface3_Unlock(IDirectDrawSurface3 *iface, void *da *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_Flip(IDirectDrawSurface7 *iface, IDirectDrawSurface7 *DestOverride, DWORD Flags) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - IDirectDrawSurfaceImpl *Override = (IDirectDrawSurfaceImpl *)DestOverride; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); + IDirectDrawSurfaceImpl *Override = unsafe_impl_from_IDirectDrawSurface7(DestOverride); IDirectDrawSurface7 *Override7; HRESULT hr; @@ -768,7 +781,7 @@ static HRESULT WINAPI ddraw_surface7_Flip(IDirectDrawSurface7 *iface, IDirectDra LeaveCriticalSection(&ddraw_cs); return DDERR_NOTFLIPPABLE; /* Unchecked */ } - Override = (IDirectDrawSurfaceImpl *)Override7; + Override = impl_from_IDirectDrawSurface7(Override7); /* For the GetAttachedSurface */ ddraw_surface7_Release(Override7); @@ -785,8 +798,8 @@ static HRESULT WINAPI ddraw_surface3_Flip(IDirectDrawSurface3 *iface, IDirectDra IDirectDrawSurfaceImpl *dst_impl = unsafe_impl_from_IDirectDrawSurface3(dst); TRACE("iface %p, dst %p, flags %#x.\n", iface, dst, flags); - return ddraw_surface7_Flip((IDirectDrawSurface7 *)This, - dst_impl ? (IDirectDrawSurface7 *)dst_impl : NULL, flags); + return ddraw_surface7_Flip(&This->IDirectDrawSurface7_iface, + dst_impl ? &dst_impl->IDirectDrawSurface7_iface : NULL, flags); } /***************************************************************************** @@ -809,8 +822,8 @@ static HRESULT WINAPI ddraw_surface3_Flip(IDirectDrawSurface3 *iface, IDirectDra static HRESULT WINAPI ddraw_surface7_Blt(IDirectDrawSurface7 *iface, RECT *DestRect, IDirectDrawSurface7 *SrcSurface, RECT *SrcRect, DWORD Flags, DDBLTFX *DDBltFx) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - IDirectDrawSurfaceImpl *Src = (IDirectDrawSurfaceImpl *)SrcSurface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); + IDirectDrawSurfaceImpl *Src = unsafe_impl_from_IDirectDrawSurface7(SrcSurface); HRESULT hr; TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p.\n", @@ -884,8 +897,8 @@ static HRESULT WINAPI ddraw_surface3_Blt(IDirectDrawSurface3 *iface, RECT *dst_r TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p.\n", iface, wine_dbgstr_rect(dst_rect), src_surface, wine_dbgstr_rect(src_rect), flags, fx); - return ddraw_surface7_Blt((IDirectDrawSurface7 *)This, dst_rect, - src ? (IDirectDrawSurface7 *)src : NULL, src_rect, flags, fx); + return ddraw_surface7_Blt(&This->IDirectDrawSurface7_iface, dst_rect, + src ? &src->IDirectDrawSurface7_iface : NULL, src_rect, flags, fx); } /***************************************************************************** @@ -965,15 +978,15 @@ static HRESULT ddraw_surface_attach_surface(IDirectDrawSurfaceImpl *This, IDirec IDirect3DDeviceImpl_UpdateDepthStencil(This->ddraw->d3ddevice); } - ddraw_surface7_AddRef((IDirectDrawSurface7 *)Surf); + ddraw_surface7_AddRef(&Surf->IDirectDrawSurface7_iface); LeaveCriticalSection(&ddraw_cs); return DD_OK; } static HRESULT WINAPI ddraw_surface7_AddAttachedSurface(IDirectDrawSurface7 *iface, IDirectDrawSurface7 *Attach) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - IDirectDrawSurfaceImpl *Surf = (IDirectDrawSurfaceImpl *)Attach; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); + IDirectDrawSurfaceImpl *Surf = unsafe_impl_from_IDirectDrawSurface7(Attach); TRACE("iface %p, attachment %p.\n", iface, Attach); @@ -1045,8 +1058,8 @@ static HRESULT WINAPI ddraw_surface3_AddAttachedSurface(IDirectDrawSurface3 *ifa static HRESULT WINAPI ddraw_surface7_DeleteAttachedSurface(IDirectDrawSurface7 *iface, DWORD Flags, IDirectDrawSurface7 *Attach) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - IDirectDrawSurfaceImpl *Surf = (IDirectDrawSurfaceImpl *)Attach; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); + IDirectDrawSurfaceImpl *Surf = unsafe_impl_from_IDirectDrawSurface7(Attach); IDirectDrawSurfaceImpl *Prev = This; TRACE("iface %p, flags %#x, attachment %p.\n", iface, Flags, Attach); @@ -1100,8 +1113,8 @@ static HRESULT WINAPI ddraw_surface3_DeleteAttachedSurface(IDirectDrawSurface3 * IDirectDrawSurfaceImpl *attachment_impl = unsafe_impl_from_IDirectDrawSurface3(attachment); TRACE("iface %p, flags %#x, attachment %p.\n", iface, flags, attachment); - return ddraw_surface7_DeleteAttachedSurface((IDirectDrawSurface7 *)This, flags, - attachment_impl ? (IDirectDrawSurface7 *)attachment_impl : NULL); + return ddraw_surface7_DeleteAttachedSurface(&This->IDirectDrawSurface7_iface, flags, + attachment_impl ? &attachment_impl->IDirectDrawSurface7_iface : NULL); } /***************************************************************************** @@ -1128,7 +1141,7 @@ static HRESULT WINAPI ddraw_surface3_AddOverlayDirtyRect(IDirectDrawSurface3 *if IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(rect)); - return ddraw_surface7_AddOverlayDirtyRect((IDirectDrawSurface7 *)This, rect); + return ddraw_surface7_AddOverlayDirtyRect(&This->IDirectDrawSurface7_iface, rect); } /***************************************************************************** @@ -1147,7 +1160,7 @@ static HRESULT WINAPI ddraw_surface3_AddOverlayDirtyRect(IDirectDrawSurface3 *if *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetDC(IDirectDrawSurface7 *iface, HDC *hdc) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p, dc %p.\n", iface, hdc); @@ -1176,7 +1189,7 @@ static HRESULT WINAPI ddraw_surface3_GetDC(IDirectDrawSurface3 *iface, HDC *dc) IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, dc %p.\n", iface, dc); - return ddraw_surface7_GetDC((IDirectDrawSurface7 *)This, dc); + return ddraw_surface7_GetDC(&This->IDirectDrawSurface7_iface, dc); } /***************************************************************************** @@ -1194,7 +1207,7 @@ static HRESULT WINAPI ddraw_surface3_GetDC(IDirectDrawSurface3 *iface, HDC *dc) *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_ReleaseDC(IDirectDrawSurface7 *iface, HDC hdc) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p, dc %p.\n", iface, hdc); @@ -1210,7 +1223,7 @@ static HRESULT WINAPI ddraw_surface3_ReleaseDC(IDirectDrawSurface3 *iface, HDC d IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, dc %p.\n", iface, dc); - return ddraw_surface7_ReleaseDC((IDirectDrawSurface7 *)This, dc); + return ddraw_surface7_ReleaseDC(&This->IDirectDrawSurface7_iface, dc); } /***************************************************************************** @@ -1228,7 +1241,7 @@ static HRESULT WINAPI ddraw_surface3_ReleaseDC(IDirectDrawSurface3 *iface, HDC d *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetCaps(IDirectDrawSurface7 *iface, DDSCAPS2 *Caps) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); TRACE("iface %p, caps %p.\n", iface, Caps); @@ -1247,7 +1260,7 @@ static HRESULT WINAPI ddraw_surface3_GetCaps(IDirectDrawSurface3 *iface, DDSCAPS TRACE("iface %p, caps %p.\n", iface, caps); - hr = ddraw_surface7_GetCaps((IDirectDrawSurface7 *)This, &caps2); + hr = ddraw_surface7_GetCaps(&This->IDirectDrawSurface7_iface, &caps2); if (FAILED(hr)) return hr; caps->dwCaps = caps2.dwCaps; @@ -1269,7 +1282,7 @@ static HRESULT WINAPI ddraw_surface3_GetCaps(IDirectDrawSurface3 *iface, DDSCAPS *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_SetPriority(IDirectDrawSurface7 *iface, DWORD Priority) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p, priority %u.\n", iface, Priority); @@ -1296,7 +1309,7 @@ static HRESULT WINAPI ddraw_surface7_SetPriority(IDirectDrawSurface7 *iface, DWO *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetPriority(IDirectDrawSurface7 *iface, DWORD *Priority) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); TRACE("iface %p, priority %p.\n", iface, Priority); @@ -1331,7 +1344,7 @@ static HRESULT WINAPI ddraw_surface7_GetPriority(IDirectDrawSurface7 *iface, DWO static HRESULT WINAPI ddraw_surface7_SetPrivateData(IDirectDrawSurface7 *iface, REFGUID tag, void *Data, DWORD Size, DWORD Flags) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p, tag %s, data %p, data_size %u, flags %#x.\n", @@ -1365,7 +1378,7 @@ static HRESULT WINAPI ddraw_surface7_SetPrivateData(IDirectDrawSurface7 *iface, *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetPrivateData(IDirectDrawSurface7 *iface, REFGUID tag, void *Data, DWORD *Size) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p, tag %s, data %p, data_size %p.\n", @@ -1395,7 +1408,7 @@ static HRESULT WINAPI ddraw_surface7_GetPrivateData(IDirectDrawSurface7 *iface, *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_FreePrivateData(IDirectDrawSurface7 *iface, REFGUID tag) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p, tag %s.\n", iface, debugstr_guid(tag)); @@ -1431,7 +1444,7 @@ static HRESULT WINAPI ddraw_surface3_PageLock(IDirectDrawSurface3 *iface, DWORD IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, flags %#x.\n", iface, flags); - return ddraw_surface7_PageLock((IDirectDrawSurface7 *)This, flags); + return ddraw_surface7_PageLock(&This->IDirectDrawSurface7_iface, flags); } /***************************************************************************** @@ -1458,7 +1471,7 @@ static HRESULT WINAPI ddraw_surface3_PageUnlock(IDirectDrawSurface3 *iface, DWOR IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, flags %#x.\n", iface, flags); - return ddraw_surface7_PageUnlock((IDirectDrawSurface7 *)This, flags); + return ddraw_surface7_PageUnlock(&This->IDirectDrawSurface7_iface, flags); } /***************************************************************************** @@ -1486,7 +1499,7 @@ static HRESULT WINAPI ddraw_surface3_BltBatch(IDirectDrawSurface3 *iface, DDBLTB IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, batch %p, count %u, flags %#x.\n", iface, batch, count, flags); - return ddraw_surface7_BltBatch((IDirectDrawSurface7 *)This, batch, count, flags); + return ddraw_surface7_BltBatch(&This->IDirectDrawSurface7_iface, batch, count, flags); } /***************************************************************************** @@ -1506,7 +1519,7 @@ static HRESULT WINAPI ddraw_surface3_BltBatch(IDirectDrawSurface3 *iface, DDBLTB static HRESULT WINAPI ddraw_surface7_EnumAttachedSurfaces(IDirectDrawSurface7 *iface, void *context, LPDDENUMSURFACESCALLBACK7 cb) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); IDirectDrawSurfaceImpl *surf; DDSURFACEDESC2 desc; int i; @@ -1523,10 +1536,10 @@ static HRESULT WINAPI ddraw_surface7_EnumAttachedSurfaces(IDirectDrawSurface7 *i surf = This->complex_array[i]; if(!surf) break; - ddraw_surface7_AddRef((IDirectDrawSurface7 *)surf); + ddraw_surface7_AddRef(&surf->IDirectDrawSurface7_iface); desc = surf->surface_desc; /* check: != DDENUMRET_OK or == DDENUMRET_CANCEL? */ - if (cb((IDirectDrawSurface7 *)surf, &desc, context) == DDENUMRET_CANCEL) + if (cb(&surf->IDirectDrawSurface7_iface, &desc, context) == DDENUMRET_CANCEL) { LeaveCriticalSection(&ddraw_cs); return DD_OK; @@ -1535,10 +1548,10 @@ static HRESULT WINAPI ddraw_surface7_EnumAttachedSurfaces(IDirectDrawSurface7 *i for (surf = This->next_attached; surf != NULL; surf = surf->next_attached) { - ddraw_surface7_AddRef((IDirectDrawSurface7 *)surf); + ddraw_surface7_AddRef(&surf->IDirectDrawSurface7_iface); desc = surf->surface_desc; /* check: != DDENUMRET_OK or == DDENUMRET_CANCEL? */ - if (cb((IDirectDrawSurface7 *)surf, &desc, context) == DDENUMRET_CANCEL) + if (cb(&surf->IDirectDrawSurface7_iface, &desc, context) == DDENUMRET_CANCEL) { LeaveCriticalSection(&ddraw_cs); return DD_OK; @@ -1559,9 +1572,10 @@ struct callback_info static HRESULT CALLBACK EnumCallback(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *surface_desc, void *context) { + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(surface); const struct callback_info *info = context; - return info->callback((IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)surface)->IDirectDrawSurface3_iface, + return info->callback((IDirectDrawSurface *)&This->IDirectDrawSurface3_iface, (DDSURFACEDESC *)surface_desc, info->context); } @@ -1576,7 +1590,7 @@ static HRESULT WINAPI ddraw_surface3_EnumAttachedSurfaces(IDirectDrawSurface3 *i info.callback = callback; info.context = context; - return ddraw_surface7_EnumAttachedSurfaces((IDirectDrawSurface7 *)This, + return ddraw_surface7_EnumAttachedSurfaces(&This->IDirectDrawSurface7_iface, &info, EnumCallback); } @@ -1613,7 +1627,7 @@ static HRESULT WINAPI ddraw_surface3_EnumOverlayZOrders(IDirectDrawSurface3 *ifa info.callback = callback; info.context = context; - return ddraw_surface7_EnumOverlayZOrders((IDirectDrawSurface7 *)This, + return ddraw_surface7_EnumOverlayZOrders(&This->IDirectDrawSurface7_iface, flags, &info, EnumCallback); } @@ -1631,7 +1645,7 @@ static HRESULT WINAPI ddraw_surface3_EnumOverlayZOrders(IDirectDrawSurface3 *ifa *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetBltStatus(IDirectDrawSurface7 *iface, DWORD Flags) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p, flags %#x.\n", iface, Flags); @@ -1651,7 +1665,7 @@ static HRESULT WINAPI ddraw_surface3_GetBltStatus(IDirectDrawSurface3 *iface, DW IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, flags %#x.\n", iface, flags); - return ddraw_surface7_GetBltStatus((IDirectDrawSurface7 *)This, flags); + return ddraw_surface7_GetBltStatus(&This->IDirectDrawSurface7_iface, flags); } /***************************************************************************** @@ -1670,7 +1684,7 @@ static HRESULT WINAPI ddraw_surface3_GetBltStatus(IDirectDrawSurface3 *iface, DW *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetColorKey(IDirectDrawSurface7 *iface, DWORD Flags, DDCOLORKEY *CKey) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); TRACE("iface %p, flags %#x, color_key %p.\n", iface, Flags, CKey); @@ -1731,7 +1745,7 @@ static HRESULT WINAPI ddraw_surface3_GetColorKey(IDirectDrawSurface3 *iface, DWO IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, flags %#x, color_key %p.\n", iface, flags, color_key); - return ddraw_surface7_GetColorKey((IDirectDrawSurface7 *)This, flags, color_key); + return ddraw_surface7_GetColorKey(&This->IDirectDrawSurface7_iface, flags, color_key); } /***************************************************************************** @@ -1748,7 +1762,7 @@ static HRESULT WINAPI ddraw_surface3_GetColorKey(IDirectDrawSurface3 *iface, DWO *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetFlipStatus(IDirectDrawSurface7 *iface, DWORD Flags) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p, flags %#x.\n", iface, Flags); @@ -1768,7 +1782,7 @@ static HRESULT WINAPI ddraw_surface3_GetFlipStatus(IDirectDrawSurface3 *iface, D IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, flags %#x.\n", iface, flags); - return ddraw_surface7_GetFlipStatus((IDirectDrawSurface7 *)This, flags); + return ddraw_surface7_GetFlipStatus(&This->IDirectDrawSurface7_iface, flags); } /***************************************************************************** @@ -1785,7 +1799,7 @@ static HRESULT WINAPI ddraw_surface3_GetFlipStatus(IDirectDrawSurface3 *iface, D *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetOverlayPosition(IDirectDrawSurface7 *iface, LONG *X, LONG *Y) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p, x %p, y %p.\n", iface, X, Y); @@ -1801,7 +1815,7 @@ static HRESULT WINAPI ddraw_surface3_GetOverlayPosition(IDirectDrawSurface3 *ifa IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, x %p, y %p.\n", iface, x, y); - return ddraw_surface7_GetOverlayPosition((IDirectDrawSurface7 *)This, x, y); + return ddraw_surface7_GetOverlayPosition(&This->IDirectDrawSurface7_iface, x, y); } /***************************************************************************** @@ -1821,7 +1835,7 @@ static HRESULT WINAPI ddraw_surface3_GetOverlayPosition(IDirectDrawSurface3 *ifa static HRESULT WINAPI ddraw_surface7_GetPixelFormat(IDirectDrawSurface7 *iface, DDPIXELFORMAT *PixelFormat) { /* What is DDERR_INVALIDSURFACETYPE for here? */ - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); TRACE("iface %p, pixel_format %p.\n", iface, PixelFormat); @@ -1840,7 +1854,7 @@ static HRESULT WINAPI ddraw_surface3_GetPixelFormat(IDirectDrawSurface3 *iface, IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, pixel_format %p.\n", iface, pixel_format); - return ddraw_surface7_GetPixelFormat((IDirectDrawSurface7 *)This, pixel_format); + return ddraw_surface7_GetPixelFormat(&This->IDirectDrawSurface7_iface, pixel_format); } /***************************************************************************** @@ -1859,7 +1873,7 @@ static HRESULT WINAPI ddraw_surface3_GetPixelFormat(IDirectDrawSurface3 *iface, *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetSurfaceDesc(IDirectDrawSurface7 *iface, DDSURFACEDESC2 *DDSD) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); TRACE("iface %p, surface_desc %p.\n", iface, DDSD); @@ -1935,7 +1949,7 @@ static HRESULT WINAPI ddraw_surface3_Initialize(IDirectDrawSurface3 *iface, IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, ddraw %p, surface_desc %p.\n", iface, ddraw, surface_desc); - return ddraw_surface7_Initialize((IDirectDrawSurface7 *)This, + return ddraw_surface7_Initialize(&This->IDirectDrawSurface7_iface, ddraw, (DDSURFACEDESC2 *)surface_desc); } @@ -1972,7 +1986,7 @@ static HRESULT WINAPI d3d_texture1_Initialize(IDirect3DTexture *iface, *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_IsLost(IDirectDrawSurface7 *iface) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p.\n", iface); @@ -2007,7 +2021,7 @@ static HRESULT WINAPI ddraw_surface3_IsLost(IDirectDrawSurface3 *iface) IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p.\n", iface); - return ddraw_surface7_IsLost((IDirectDrawSurface7 *)This); + return ddraw_surface7_IsLost(&This->IDirectDrawSurface7_iface); } /***************************************************************************** @@ -2023,7 +2037,7 @@ static HRESULT WINAPI ddraw_surface3_IsLost(IDirectDrawSurface3 *iface) *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_Restore(IDirectDrawSurface7 *iface) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p.\n", iface); @@ -2045,7 +2059,7 @@ static HRESULT WINAPI ddraw_surface3_Restore(IDirectDrawSurface3 *iface) IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p.\n", iface); - return ddraw_surface7_Restore((IDirectDrawSurface7 *)This); + return ddraw_surface7_Restore(&This->IDirectDrawSurface7_iface); } /***************************************************************************** @@ -2062,7 +2076,7 @@ static HRESULT WINAPI ddraw_surface3_Restore(IDirectDrawSurface3 *iface) *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_SetOverlayPosition(IDirectDrawSurface7 *iface, LONG X, LONG Y) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p, x %d, y %d.\n", iface, X, Y); @@ -2078,7 +2092,7 @@ static HRESULT WINAPI ddraw_surface3_SetOverlayPosition(IDirectDrawSurface3 *ifa IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, x %d, y %d.\n", iface, x, y); - return ddraw_surface7_SetOverlayPosition((IDirectDrawSurface7 *)This, x, y); + return ddraw_surface7_SetOverlayPosition(&This->IDirectDrawSurface7_iface, x, y); } /***************************************************************************** @@ -2099,8 +2113,8 @@ static HRESULT WINAPI ddraw_surface3_SetOverlayPosition(IDirectDrawSurface3 *ifa static HRESULT WINAPI ddraw_surface7_UpdateOverlay(IDirectDrawSurface7 *iface, RECT *SrcRect, IDirectDrawSurface7 *DstSurface, RECT *DstRect, DWORD Flags, DDOVERLAYFX *FX) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - IDirectDrawSurfaceImpl *Dst = (IDirectDrawSurfaceImpl *)DstSurface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); + IDirectDrawSurfaceImpl *Dst = unsafe_impl_from_IDirectDrawSurface7(DstSurface); HRESULT hr; TRACE("iface %p, src_rect %s, dst_surface %p, dst_rect %s, flags %#x, fx %p.\n", @@ -2127,8 +2141,8 @@ static HRESULT WINAPI ddraw_surface3_UpdateOverlay(IDirectDrawSurface3 *iface, R TRACE("iface %p, src_rect %s, dst_surface %p, dst_rect %s, flags %#x, fx %p.\n", iface, wine_dbgstr_rect(src_rect), dst_surface, wine_dbgstr_rect(dst_rect), flags, fx); - return ddraw_surface7_UpdateOverlay((IDirectDrawSurface7 *)This, src_rect, - dst_impl ? (IDirectDrawSurface7 *)dst_impl : NULL, dst_rect, flags, fx); + return ddraw_surface7_UpdateOverlay(&This->IDirectDrawSurface7_iface, src_rect, + dst_impl ? &dst_impl->IDirectDrawSurface7_iface : NULL, dst_rect, flags, fx); } /***************************************************************************** @@ -2154,7 +2168,7 @@ static HRESULT WINAPI ddraw_surface3_UpdateOverlayDisplay(IDirectDrawSurface3 *i IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, flags %#x.\n", iface, flags); - return ddraw_surface7_UpdateOverlayDisplay((IDirectDrawSurface7 *)This, flags); + return ddraw_surface7_UpdateOverlayDisplay(&This->IDirectDrawSurface7_iface, flags); } /***************************************************************************** @@ -2173,8 +2187,8 @@ static HRESULT WINAPI ddraw_surface3_UpdateOverlayDisplay(IDirectDrawSurface3 *i static HRESULT WINAPI ddraw_surface7_UpdateOverlayZOrder(IDirectDrawSurface7 *iface, DWORD Flags, IDirectDrawSurface7 *DDSRef) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - IDirectDrawSurfaceImpl *Ref = (IDirectDrawSurfaceImpl *)DDSRef; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); + IDirectDrawSurfaceImpl *Ref = unsafe_impl_from_IDirectDrawSurface7(DDSRef); HRESULT hr; TRACE("iface %p, flags %#x, reference %p.\n", iface, Flags, DDSRef); @@ -2193,8 +2207,8 @@ static HRESULT WINAPI ddraw_surface3_UpdateOverlayZOrder(IDirectDrawSurface3 *if IDirectDrawSurfaceImpl *reference_impl = unsafe_impl_from_IDirectDrawSurface3(reference); TRACE("iface %p, flags %#x, reference %p.\n", iface, flags, reference); - return ddraw_surface7_UpdateOverlayZOrder((IDirectDrawSurface7 *)This, flags, - reference_impl ? (IDirectDrawSurface7 *)reference_impl : NULL); + return ddraw_surface7_UpdateOverlayZOrder(&This->IDirectDrawSurface7_iface, flags, + reference_impl ? &reference_impl->IDirectDrawSurface7_iface : NULL); } /***************************************************************************** @@ -2213,7 +2227,7 @@ static HRESULT WINAPI ddraw_surface3_UpdateOverlayZOrder(IDirectDrawSurface3 *if *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetDDInterface(IDirectDrawSurface7 *iface, void **DD) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); TRACE("iface %p, ddraw %p.\n", iface, DD); @@ -2249,13 +2263,13 @@ static HRESULT WINAPI ddraw_surface3_GetDDInterface(IDirectDrawSurface3 *iface, IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, ddraw %p.\n", iface, ddraw); - return ddraw_surface7_GetDDInterface((IDirectDrawSurface7 *)This, ddraw); + return ddraw_surface7_GetDDInterface(&This->IDirectDrawSurface7_iface, ddraw); } /* This seems also windows implementation specific - I don't think WineD3D needs this */ static HRESULT WINAPI ddraw_surface7_ChangeUniquenessValue(IDirectDrawSurface7 *iface) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); volatile IDirectDrawSurfaceImpl* vThis = This; TRACE("iface %p.\n", iface); @@ -2285,7 +2299,7 @@ static HRESULT WINAPI ddraw_surface7_ChangeUniquenessValue(IDirectDrawSurface7 * static HRESULT WINAPI ddraw_surface7_GetUniquenessValue(IDirectDrawSurface7 *iface, DWORD *pValue) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); TRACE("iface %p, value %p.\n", iface, pValue); @@ -2310,7 +2324,7 @@ static HRESULT WINAPI ddraw_surface7_GetUniquenessValue(IDirectDrawSurface7 *ifa *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_SetLOD(IDirectDrawSurface7 *iface, DWORD MaxLOD) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); HRESULT hr; TRACE("iface %p, lod %u.\n", iface, MaxLOD); @@ -2350,7 +2364,7 @@ static HRESULT WINAPI ddraw_surface7_SetLOD(IDirectDrawSurface7 *iface, DWORD Ma *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetLOD(IDirectDrawSurface7 *iface, DWORD *MaxLOD) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); TRACE("iface %p, lod %p.\n", iface, MaxLOD); @@ -2389,8 +2403,8 @@ static HRESULT WINAPI ddraw_surface7_GetLOD(IDirectDrawSurface7 *iface, DWORD *M static HRESULT WINAPI ddraw_surface7_BltFast(IDirectDrawSurface7 *iface, DWORD dstx, DWORD dsty, IDirectDrawSurface7 *Source, RECT *rsrc, DWORD trans) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - IDirectDrawSurfaceImpl *src = (IDirectDrawSurfaceImpl *)Source; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); + IDirectDrawSurfaceImpl *src = unsafe_impl_from_IDirectDrawSurface7(Source); DWORD src_w, src_h, dst_w, dst_h; HRESULT hr; @@ -2449,8 +2463,8 @@ static HRESULT WINAPI ddraw_surface3_BltFast(IDirectDrawSurface3 *iface, DWORD d TRACE("iface %p, dst_x %u, dst_y %u, src_surface %p, src_rect %s, flags %#x.\n", iface, dst_x, dst_y, src_surface, wine_dbgstr_rect(src_rect), flags); - return ddraw_surface7_BltFast((IDirectDrawSurface7 *)This, dst_x, dst_y, - src_impl ? (IDirectDrawSurface7 *)src_impl : NULL, src_rect, flags); + return ddraw_surface7_BltFast(&This->IDirectDrawSurface7_iface, dst_x, dst_y, + src_impl ? &src_impl->IDirectDrawSurface7_iface : NULL, src_rect, flags); } /***************************************************************************** @@ -2470,7 +2484,7 @@ static HRESULT WINAPI ddraw_surface3_BltFast(IDirectDrawSurface3 *iface, DWORD d *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetClipper(IDirectDrawSurface7 *iface, IDirectDrawClipper **Clipper) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); TRACE("iface %p, clipper %p.\n", iface, Clipper); @@ -2498,7 +2512,7 @@ static HRESULT WINAPI ddraw_surface3_GetClipper(IDirectDrawSurface3 *iface, IDir IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, clipper %p.\n", iface, clipper); - return ddraw_surface7_GetClipper((IDirectDrawSurface7 *)This, clipper); + return ddraw_surface7_GetClipper(&This->IDirectDrawSurface7_iface, clipper); } /***************************************************************************** @@ -2515,7 +2529,7 @@ static HRESULT WINAPI ddraw_surface3_GetClipper(IDirectDrawSurface3 *iface, IDir *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_SetClipper(IDirectDrawSurface7 *iface, IDirectDrawClipper *Clipper) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); IDirectDrawClipperImpl *oldClipper = This->clipper; HWND clipWindow; HRESULT hr; @@ -2561,7 +2575,7 @@ static HRESULT WINAPI ddraw_surface3_SetClipper(IDirectDrawSurface3 *iface, IDir IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, clipper %p.\n", iface, clipper); - return ddraw_surface7_SetClipper((IDirectDrawSurface7 *)This, clipper); + return ddraw_surface7_SetClipper(&This->IDirectDrawSurface7_iface, clipper); } /***************************************************************************** @@ -2582,7 +2596,7 @@ static HRESULT WINAPI ddraw_surface3_SetClipper(IDirectDrawSurface3 *iface, IDir *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_SetSurfaceDesc(IDirectDrawSurface7 *iface, DDSURFACEDESC2 *DDSD, DWORD Flags) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); enum wined3d_format_id newFormat = WINED3DFMT_UNKNOWN; HRESULT hr; @@ -2661,7 +2675,7 @@ static HRESULT WINAPI ddraw_surface3_SetSurfaceDesc(IDirectDrawSurface3 *iface, IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, surface_desc %p, flags %#x.\n", iface, surface_desc, flags); - return ddraw_surface7_SetSurfaceDesc((IDirectDrawSurface7 *)This, + return ddraw_surface7_SetSurfaceDesc(&This->IDirectDrawSurface7_iface, (DDSURFACEDESC2 *)surface_desc, flags); } @@ -2681,7 +2695,7 @@ static HRESULT WINAPI ddraw_surface3_SetSurfaceDesc(IDirectDrawSurface3 *iface, *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_GetPalette(IDirectDrawSurface7 *iface, IDirectDrawPalette **Pal) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); struct wined3d_palette *wined3d_palette; HRESULT hr = DD_OK; @@ -2712,7 +2726,7 @@ static HRESULT WINAPI ddraw_surface3_GetPalette(IDirectDrawSurface3 *iface, IDir IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, palette %p.\n", iface, palette); - return ddraw_surface7_GetPalette((IDirectDrawSurface7 *)This, palette); + return ddraw_surface7_GetPalette(&This->IDirectDrawSurface7_iface, palette); } /***************************************************************************** @@ -2734,7 +2748,7 @@ SetColorKeyEnum(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *desc, void *context) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)surface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(surface); struct SCKContext *ctx = context; HRESULT hr; @@ -2769,7 +2783,7 @@ SetColorKeyEnum(IDirectDrawSurface7 *surface, *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_SetColorKey(IDirectDrawSurface7 *iface, DWORD Flags, DDCOLORKEY *CKey) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); DDCOLORKEY FixedCKey; struct SCKContext ctx = { DD_OK, (WINEDDCOLORKEY *) (CKey ? &FixedCKey : NULL), Flags }; @@ -2850,7 +2864,7 @@ static HRESULT WINAPI ddraw_surface3_SetColorKey(IDirectDrawSurface3 *iface, DWO IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, flags %#x, color_key %p.\n", iface, flags, color_key); - return ddraw_surface7_SetColorKey((IDirectDrawSurface7 *)This, flags, color_key); + return ddraw_surface7_SetColorKey(&This->IDirectDrawSurface7_iface, flags, color_key); } /***************************************************************************** @@ -2867,7 +2881,7 @@ static HRESULT WINAPI ddraw_surface3_SetColorKey(IDirectDrawSurface3 *iface, DWO *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_SetPalette(IDirectDrawSurface7 *iface, IDirectDrawPalette *Pal) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface); IDirectDrawPalette *oldPal; IDirectDrawSurfaceImpl *surf; IDirectDrawPaletteImpl *PalImpl = (IDirectDrawPaletteImpl *)Pal; @@ -2911,7 +2925,7 @@ static HRESULT WINAPI ddraw_surface7_SetPalette(IDirectDrawSurface7 *iface, IDir { IDirectDrawSurface7 *attach; HRESULT hr; - hr = ddraw_surface7_GetAttachedSurface((IDirectDrawSurface7 *)surf, &caps2, &attach); + hr = ddraw_surface7_GetAttachedSurface(&surf->IDirectDrawSurface7_iface, &caps2, &attach); if(hr != DD_OK) { break; @@ -2919,7 +2933,7 @@ static HRESULT WINAPI ddraw_surface7_SetPalette(IDirectDrawSurface7 *iface, IDir TRACE("Setting palette on %p\n", attach); ddraw_surface7_SetPalette(attach, Pal); - surf = (IDirectDrawSurfaceImpl *)attach; + surf = impl_from_IDirectDrawSurface7(attach); ddraw_surface7_Release(attach); } } @@ -2933,7 +2947,7 @@ static HRESULT WINAPI ddraw_surface3_SetPalette(IDirectDrawSurface3 *iface, IDir IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); TRACE("iface %p, palette %p.\n", iface, palette); - return ddraw_surface7_SetPalette((IDirectDrawSurface7 *)This, palette); + return ddraw_surface7_SetPalette(&This->IDirectDrawSurface7_iface, palette); } /********************************************************** @@ -3136,12 +3150,12 @@ static IDirectDrawSurfaceImpl *get_sub_mimaplevel(IDirectDrawSurfaceImpl *surfac IDirectDrawSurface7 *next_level; HRESULT hr; - hr = ddraw_surface7_GetAttachedSurface((IDirectDrawSurface7 *)surface, &mipmap_caps, &next_level); + hr = ddraw_surface7_GetAttachedSurface(&surface->IDirectDrawSurface7_iface, &mipmap_caps, &next_level); if (FAILED(hr)) return NULL; ddraw_surface7_Release(next_level); - return (IDirectDrawSurfaceImpl *)next_level; + return impl_from_IDirectDrawSurface7(next_level); } /***************************************************************************** @@ -3450,6 +3464,13 @@ IDirectDrawSurfaceImpl *unsafe_impl_from_IDirectDrawSurface3(IDirectDrawSurface3 return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirectDrawSurface3_iface); } +IDirectDrawSurfaceImpl *unsafe_impl_from_IDirectDrawSurface7(IDirectDrawSurface7 *iface) +{ + if (!iface) return NULL; + if (iface->lpVtbl != &ddraw_surface7_vtbl) return NULL; + return CONTAINING_RECORD(iface, IDirectDrawSurfaceImpl, IDirectDrawSurface7_iface); +} + static void STDMETHODCALLTYPE ddraw_surface_wined3d_object_destroyed(void *parent) { IDirectDrawSurfaceImpl *surface = parent; @@ -3459,8 +3480,8 @@ static void STDMETHODCALLTYPE ddraw_surface_wined3d_object_destroyed(void *paren /* Check for attached surfaces and detach them. */ if (surface->first_attached != surface) { - IDirectDrawSurface7 *root = (IDirectDrawSurface7 *)surface->first_attached; - IDirectDrawSurface7 *detach = (IDirectDrawSurface7 *)surface; + IDirectDrawSurface7 *root = &surface->first_attached->IDirectDrawSurface7_iface; + IDirectDrawSurface7 *detach = &surface->IDirectDrawSurface7_iface; /* Well, this shouldn't happen: The surface being attached is * referenced in AddAttachedSurface(), so it shouldn't be released @@ -3476,8 +3497,8 @@ static void STDMETHODCALLTYPE ddraw_surface_wined3d_object_destroyed(void *paren while (surface->next_attached) { - IDirectDrawSurface7 *root = (IDirectDrawSurface7 *)surface; - IDirectDrawSurface7 *detach = (IDirectDrawSurface7 *)surface->next_attached; + IDirectDrawSurface7 *root = &surface->IDirectDrawSurface7_iface; + IDirectDrawSurface7 *detach = &surface->next_attached->IDirectDrawSurface7_iface; if (FAILED(IDirectDrawSurface7_DeleteAttachedSurface(root, 0, detach))) ERR("DeleteAttachedSurface failed.\n"); @@ -3607,7 +3628,7 @@ HRESULT ddraw_surface_init(IDirectDrawSurfaceImpl *surface, IDirectDrawImpl *ddr return DDERR_INVALIDPIXELFORMAT; } - surface->lpVtbl = &ddraw_surface7_vtbl; + surface->IDirectDrawSurface7_iface.lpVtbl = &ddraw_surface7_vtbl; surface->IDirectDrawSurface3_iface.lpVtbl = &ddraw_surface3_vtbl; surface->IDirectDrawGammaControl_vtbl = &ddraw_gamma_control_vtbl; surface->IDirect3DTexture2_vtbl = &d3d_texture2_vtbl; -- 1.7.5.1