Ričardas Barkauskas : ddraw: Avoid IDirectDrawSurfaceX to IDirectDrawSurface7 casts.
Alexandre Julliard
julliard at winehq.org
Mon Jun 6 15:19:11 CDT 2011
Module: wine
Branch: master
Commit: 4074dd7615c19da2d1f2cb30c5b6a66e58309d90
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4074dd7615c19da2d1f2cb30c5b6a66e58309d90
Author: Ričardas Barkauskas <rbarkauskas at codeweavers.com>
Date: Mon Jun 6 14:03:38 2011 +0300
ddraw: Avoid IDirectDrawSurfaceX to IDirectDrawSurface7 casts.
---
dlls/ddraw/ddraw.c | 52 +++++++++++++++++++++++++++++++++++++++++++++-----
dlls/ddraw/device.c | 17 +++++++++++++--
2 files changed, 60 insertions(+), 9 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 56c22f8..0afdd4d 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2037,10 +2037,22 @@ 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)
@@ -2483,10 +2495,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;
}
/*****************************************************************************
@@ -4216,11 +4243,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,
+ (IDirectDrawSurface7 *)src_impl, &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,
@@ -5849,6 +5888,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;
@@ -5877,8 +5917,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))
{
@@ -5886,6 +5925,7 @@ 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);
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 52a5e59..8f9fb81 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -1947,12 +1947,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 +1967,18 @@ 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;
- RenderTargetImpl = (IDirectDrawSurfaceImpl *)RenderTarget;
+ RenderTargetImpl = impl_from_IDirectDrawSurface7(RenderTarget7);
*RenderTarget = (IDirectDrawSurface *)&RenderTargetImpl->IDirectDrawSurface3_iface;
return D3D_OK;
}
More information about the wine-cvs
mailing list