=?UTF-8?Q?Ri=C4=8Dardas=20Barkauskas=20?=: ddraw: Use unsafe_impl_from_IDirect3DViewport3 for application provided interfaces .

Alexandre Julliard julliard at winehq.org
Tue Oct 4 17:43:04 CDT 2011


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

Author: Ričardas Barkauskas <miegalius at gmail.com>
Date:   Mon Oct  3 17:14:37 2011 -0500

ddraw: Use unsafe_impl_from_IDirect3DViewport3 for application provided interfaces.

---

 dlls/ddraw/ddraw_private.h |    2 ++
 dlls/ddraw/device.c        |    8 ++++----
 dlls/ddraw/viewport.c      |    7 +++++++
 3 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index f587126..a2f0007 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -469,6 +469,8 @@ struct IDirect3DViewportImpl
     IDirect3DMaterialImpl     *background;
 };
 
+IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport3(IDirect3DViewport3 *iface) DECLSPEC_HIDDEN;
+
 /* Helper functions */
 void viewport_activate(IDirect3DViewportImpl* This, BOOL ignore_lights) DECLSPEC_HIDDEN;
 void d3d_viewport_init(IDirect3DViewportImpl *viewport, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN;
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 28e1eaf..eb43aa3 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -750,7 +750,7 @@ IDirect3DDeviceImpl_3_AddViewport(IDirect3DDevice3 *iface,
                                   IDirect3DViewport3 *Viewport)
 {
     IDirect3DDeviceImpl *This = device_from_device3(iface);
-    IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport;
+    IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport3(Viewport);
 
     TRACE("iface %p, viewport %p.\n", iface, Viewport);
 
@@ -808,7 +808,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_1_AddViewport(IDirect3DDevice *iface,
 static HRESULT WINAPI IDirect3DDeviceImpl_3_DeleteViewport(IDirect3DDevice3 *iface, IDirect3DViewport3 *viewport)
 {
     IDirect3DDeviceImpl *device = device_from_device3(iface);
-    IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)viewport;
+    IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport3(viewport);
 
     TRACE("iface %p, viewport %p.\n", iface, viewport);
 
@@ -875,7 +875,7 @@ IDirect3DDeviceImpl_3_NextViewport(IDirect3DDevice3 *iface,
                                    DWORD Flags)
 {
     IDirect3DDeviceImpl *This = device_from_device3(iface);
-    IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport3;
+    IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport3(Viewport3);
     struct list *entry;
 
     TRACE("iface %p, viewport %p, next %p, flags %#x.\n",
@@ -1703,7 +1703,7 @@ IDirect3DDeviceImpl_3_SetCurrentViewport(IDirect3DDevice3 *iface,
                                          IDirect3DViewport3 *Direct3DViewport3)
 {
     IDirect3DDeviceImpl *This = device_from_device3(iface);
-    IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport3;
+    IDirect3DViewportImpl *vp = unsafe_impl_from_IDirect3DViewport3(Direct3DViewport3);
 
     TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport3);
 
diff --git a/dlls/ddraw/viewport.c b/dlls/ddraw/viewport.c
index 7dc3dd4..741090d 100644
--- a/dlls/ddraw/viewport.c
+++ b/dlls/ddraw/viewport.c
@@ -1115,6 +1115,13 @@ static const struct IDirect3DViewport3Vtbl d3d_viewport_vtbl =
     IDirect3DViewportImpl_Clear2,
 };
 
+IDirect3DViewportImpl *unsafe_impl_from_IDirect3DViewport3(IDirect3DViewport3 *iface)
+{
+    if (!iface) return NULL;
+    assert(iface->lpVtbl == &d3d_viewport_vtbl);
+    return CONTAINING_RECORD(iface, IDirect3DViewportImpl, lpVtbl);
+}
+
 void d3d_viewport_init(IDirect3DViewportImpl *viewport, IDirectDrawImpl *ddraw)
 {
     viewport->lpVtbl = &d3d_viewport_vtbl;




More information about the wine-cvs mailing list