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), ¤t_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