Ričardas Barkauskas : ddraw: Separate conversion from IDirectDrawSurface7 iface to object and conversion to other iface .

Alexandre Julliard julliard at winehq.org
Mon Jun 6 15:19:11 CDT 2011


Module: wine
Branch: master
Commit: 705548a6ef1419a1379a026c6a80f735a2ecf5bf
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=705548a6ef1419a1379a026c6a80f735a2ecf5bf

Author: Ričardas Barkauskas <rbarkauskas at codeweavers.com>
Date:   Mon Jun  6 13:08:56 2011 +0300

ddraw: Separate conversion from IDirectDrawSurface7 iface to object and conversion to other iface.

---

 dlls/ddraw/ddraw.c   |   52 ++++++++++++++++++++++++++++++++++++++++++-------
 dlls/ddraw/device.c  |    9 +++++--
 dlls/ddraw/surface.c |   14 +++++++++---
 3 files changed, 60 insertions(+), 15 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 8b39147..393f4ce 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2047,12 +2047,19 @@ static HRESULT WINAPI ddraw3_GetGDISurface(IDirectDraw3 *iface, IDirectDrawSurfa
 {
     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 = (IDirectDrawSurfaceImpl *)surface7;
+    *surface = (IDirectDrawSurface *)&surface_impl->IDirectDrawSurface3_iface;
 
     return hr;
 }
@@ -2061,12 +2068,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 (FAILED(hr))
+    {
+        *surface = NULL;
+        return hr;
+    }
+    surface_impl = (IDirectDrawSurfaceImpl *)surface7;
+    *surface = (IDirectDrawSurface *)&surface_impl->IDirectDrawSurface3_iface;
 
     return hr;
 }
@@ -2075,12 +2089,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 (FAILED(hr))
+    {
+        *surface = NULL;
+        return hr;
+    }
+    surface_impl = (IDirectDrawSurfaceImpl *)surface7;
+    *surface = (IDirectDrawSurface *)&surface_impl->IDirectDrawSurface3_iface;
 
     return hr;
 }
@@ -2438,6 +2459,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);
@@ -2445,7 +2467,14 @@ 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 = (IDirectDrawSurfaceImpl *)surface7;
+    /* Tests say this is true */
+    *surface = (IDirectDrawSurface4 *)&surface_impl->IDirectDrawSurface3_iface;
 
     return hr;
 }
@@ -3756,9 +3785,10 @@ struct surfacescallback_context
 static HRESULT CALLBACK EnumSurfacesCallbackThunk(IDirectDrawSurface7 *surface,
         DDSURFACEDESC2 *surface_desc, void *context)
 {
+    IDirectDrawSurfaceImpl *surface_impl = (IDirectDrawSurfaceImpl *)surface;
     struct surfacescallback_context *cbcontext = context;
 
-    return cbcontext->func((IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)surface)->IDirectDrawSurface3_iface,
+    return cbcontext->func((IDirectDrawSurface *)&surface_impl->IDirectDrawSurface3_iface,
             (DDSURFACEDESC *)surface_desc, cbcontext->context);
 }
 
@@ -4199,13 +4229,15 @@ 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);
     if (FAILED(hr))
         return hr;
-    *dst = (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)dst7)->IDirectDrawSurface3_iface;
+    dst_impl = (IDirectDrawSurfaceImpl *)dst7;
+    *dst = (IDirectDrawSurface *)&dst_impl->IDirectDrawSurface3_iface;
     return hr;
 }
 
@@ -4215,13 +4247,15 @@ 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);
     if (FAILED(hr))
         return hr;
-    *dst = (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)dst7)->IDirectDrawSurface3_iface;
+    dst_impl = (IDirectDrawSurfaceImpl *)dst7;
+    *dst = (IDirectDrawSurface *)&dst_impl->IDirectDrawSurface3_iface;
     return hr;
 }
 
@@ -4231,13 +4265,15 @@ 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);
     if (FAILED(hr))
         return hr;
-    *dst = (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)dst7)->IDirectDrawSurface3_iface;
+    dst_impl = (IDirectDrawSurfaceImpl *)dst7;
+    *dst = (IDirectDrawSurface *)&dst_impl->IDirectDrawSurface3_iface;
     return hr;
 }
 
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 7b8f975..a2eefd0 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -1960,14 +1960,15 @@ static HRESULT WINAPI IDirect3DDeviceImpl_2_GetRenderTarget(IDirect3DDevice2 *if
         IDirectDrawSurface **RenderTarget)
 {
     IDirect3DDeviceImpl *This = device_from_device2(iface);
+    IDirectDrawSurfaceImpl *RenderTargetImpl;
     HRESULT hr;
 
     TRACE("iface %p, target %p.\n", iface, RenderTarget);
 
     hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 **)RenderTarget);
     if(hr != D3D_OK) return hr;
-    *RenderTarget = *RenderTarget ?
-            (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)*RenderTarget)->IDirectDrawSurface3_iface : NULL;
+    RenderTargetImpl = (IDirectDrawSurfaceImpl *)RenderTarget;
+    *RenderTarget = (IDirectDrawSurface *)&RenderTargetImpl->IDirectDrawSurface3_iface;
     return D3D_OK;
 }
 
@@ -4483,12 +4484,14 @@ static HRESULT WINAPI IDirect3DDeviceImpl_3_GetTexture(IDirect3DDevice3 *iface,
 {
     HRESULT ret;
     IDirectDrawSurface7 *ret_val;
+    IDirectDrawSurfaceImpl *ret_val_impl;
 
     TRACE("iface %p, stage %u, texture %p.\n", iface, Stage, Texture2);
 
     ret = IDirect3DDevice7_GetTexture((IDirect3DDevice7 *)device_from_device3(iface), Stage, &ret_val);
 
-    *Texture2 = ret_val ? (IDirect3DTexture2 *)&((IDirectDrawSurfaceImpl *)ret_val)->IDirect3DTexture2_vtbl : NULL;
+    ret_val_impl = unsafe_impl_from_IDirectDrawSurface7(ret_val);
+    *Texture2 = ret_val_impl ? (IDirect3DTexture2 *)&ret_val_impl->IDirect3DTexture2_vtbl : NULL;
 
     TRACE("Returning texture %p.\n", *Texture2);
 
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 5874333..8b4cfa7 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -553,6 +553,7 @@ static HRESULT WINAPI ddraw_surface3_GetAttachedSurface(IDirectDrawSurface3 *ifa
 {
     IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface);
     IDirectDrawSurface7 *attachment7;
+    IDirectDrawSurfaceImpl *attachment_impl;
     DDSCAPS2 caps2;
     HRESULT hr;
 
@@ -565,9 +566,13 @@ static HRESULT WINAPI ddraw_surface3_GetAttachedSurface(IDirectDrawSurface3 *ifa
 
     hr = ddraw_surface7_GetAttachedSurface((IDirectDrawSurface7 *)This,
             &caps2, &attachment7);
-    if (FAILED(hr)) *attachment = NULL;
-    else *attachment = attachment7 ?
-            &((IDirectDrawSurfaceImpl *)attachment7)->IDirectDrawSurface3_iface : NULL;
+    if (FAILED(hr))
+    {
+        *attachment = NULL;
+        return hr;
+    }
+    attachment_impl = (IDirectDrawSurfaceImpl *)attachment7;
+    *attachment = &attachment_impl->IDirectDrawSurface3_iface;
 
     return hr;
 }
@@ -1559,9 +1564,10 @@ struct callback_info
 
 static HRESULT CALLBACK EnumCallback(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *surface_desc, void *context)
 {
+    IDirectDrawSurfaceImpl *surface_impl = (IDirectDrawSurfaceImpl *)surface;
     const struct callback_info *info = context;
 
-    return info->callback((IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)surface)->IDirectDrawSurface3_iface,
+    return info->callback((IDirectDrawSurface *)&surface_impl->IDirectDrawSurface3_iface,
             (DDSURFACEDESC *)surface_desc, info->context);
 }
 




More information about the wine-cvs mailing list