Stefan Dösinger : ddraw: Fix some material related bugs.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jun 30 14:15:01 CDT 2006


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

Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date:   Thu Jun 29 14:20:39 2006 +0200

ddraw: Fix some material related bugs.

---

 dlls/ddraw/device.c   |   20 ++++++++++++++++++--
 dlls/ddraw/material.c |    1 +
 dlls/ddraw/viewport.c |    2 +-
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 8417340..63f272b 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -1639,7 +1639,7 @@ IDirect3DDeviceImpl_3_GetCurrentViewport
     *Direct3DViewport3 = ICOM_INTERFACE(This->current_viewport, IDirect3DViewport3);
 
     /* AddRef the returned viewport */
-    IDirect3DViewport3_AddRef(*Direct3DViewport3);
+    if(*Direct3DViewport3) IDirect3DViewport3_AddRef(*Direct3DViewport3);
 
     TRACE(" returning interface %p\n", *Direct3DViewport3);
 
@@ -2279,7 +2279,23 @@ IDirect3DDeviceImpl_3_SetLightState(IDir
 
     if (LightStateType == D3DLIGHTSTATE_MATERIAL /* 1 */)
     {
-        IDirect3DMaterialImpl *mat = (IDirect3DMaterialImpl *) Value;
+        IDirect3DMaterialImpl *mat;
+
+        if(Value == 0) mat = NULL;
+        else if(Value > This->numHandles)
+        {
+            ERR("Material handle out of range(%ld)\n", Value);
+            return DDERR_INVALIDPARAMS;
+        }
+        else if(This->Handles[Value - 1].type != DDrawHandle_Material)
+        {
+            ERR("Invalid handle %ld\n", Value);
+            return DDERR_INVALIDPARAMS;
+        }
+        else
+        {
+            mat = (IDirect3DMaterialImpl *) This->Handles[Value - 1].ptr;
+        }
 
         if (mat != NULL)
         {
diff --git a/dlls/ddraw/material.c b/dlls/ddraw/material.c
index c2acce1..3483c72 100644
--- a/dlls/ddraw/material.c
+++ b/dlls/ddraw/material.c
@@ -311,6 +311,7 @@ IDirect3DMaterialImpl_GetHandle(IDirect3
     IDirect3DDeviceImpl *device = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice3, lpDirect3DDevice3);
     TRACE("(%p/%p)->(%p,%p)\n", This, iface, device, lpHandle);
 
+    This->active_device = device;
     if(!This->Handle)
     {
         This->Handle = IDirect3DDeviceImpl_CreateHandle(device);
diff --git a/dlls/ddraw/viewport.c b/dlls/ddraw/viewport.c
index 29acebf..71c426b 100644
--- a/dlls/ddraw/viewport.c
+++ b/dlls/ddraw/viewport.c
@@ -310,7 +310,7 @@ IDirect3DViewportImpl_SetViewport(IDirec
       IDirect3DDevice3_GetCurrentViewport(ICOM_INTERFACE(This->active_device, IDirect3DDevice3), &current_viewport);
       if (ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, current_viewport) == This)
           This->activate(This);
-      IDirect3DViewport3_Release(current_viewport);
+      if(current_viewport) IDirect3DViewport3_Release(current_viewport);
     }
 
     return DD_OK;




More information about the wine-cvs mailing list