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