=?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: d3drm: Implement IDirect3DRMFrameX_AddLight.

Alexandre Julliard julliard at winehq.org
Wed May 2 14:30:04 CDT 2012


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

Author: André Hentschel <nerv at dawncrow.de>
Date:   Tue May  1 22:15:49 2012 +0200

d3drm: Implement IDirect3DRMFrameX_AddLight.

---

 dlls/d3drm/frame.c |   50 ++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 44 insertions(+), 6 deletions(-)

diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c
index 7f2497d..5a9ff72 100644
--- a/dlls/d3drm/frame.c
+++ b/dlls/d3drm/frame.c
@@ -40,6 +40,9 @@ typedef struct {
     ULONG nb_visuals;
     ULONG visuals_capacity;
     IDirect3DRMVisual** visuals;
+    ULONG nb_lights;
+    ULONG lights_capacity;
+    IDirect3DRMLight** lights;
 } IDirect3DRMFrameImpl;
 
 static inline IDirect3DRMFrameImpl *impl_from_IDirect3DRMFrame2(IDirect3DRMFrame2 *iface)
@@ -213,13 +216,13 @@ static HRESULT WINAPI IDirect3DRMFrame2Impl_AddChild(IDirect3DRMFrame2* iface,
 }
 
 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddLight(IDirect3DRMFrame2* iface,
-                                                     LPDIRECT3DRMLIGHT light)
+                                                       LPDIRECT3DRMLIGHT light)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
 
-    FIXME("(%p/%p)->(%p): stub\n", iface, This, light);
+    TRACE("(%p/%p)->(%p)\n", iface, This, light);
 
-    return E_NOTIMPL;
+    return IDirect3DRMFrame3_AddLight(&This->IDirect3DRMFrame3_iface, light);
 }
 
 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddMoveCallback(IDirect3DRMFrame2* iface,
@@ -1104,13 +1107,48 @@ static HRESULT WINAPI IDirect3DRMFrame3Impl_AddChild(IDirect3DRMFrame3* iface,
 }
 
 static HRESULT WINAPI IDirect3DRMFrame3Impl_AddLight(IDirect3DRMFrame3* iface,
-                                                     LPDIRECT3DRMLIGHT light)
+                                                       LPDIRECT3DRMLIGHT light)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
+    ULONG i;
+    IDirect3DRMLight** lights;
 
-    FIXME("(%p/%p)->(%p): stub\n", iface, This, light);
+    TRACE("(%p/%p)->(%p)\n", iface, This, light);
 
-    return E_NOTIMPL;
+    if (!light)
+        return D3DRMERR_BADOBJECT;
+
+    /* Check if already existing and return gracefully without increasing ref count */
+    for (i = 0; i < This->nb_lights; i++)
+        if (This->lights[i] == light)
+            return D3DRM_OK;
+
+    if ((This->nb_lights + 1) > This->lights_capacity)
+    {
+        ULONG new_capacity;
+
+        if (!This->lights_capacity)
+        {
+            new_capacity = 16;
+            lights = HeapAlloc(GetProcessHeap(), 0, new_capacity * sizeof(IDirect3DRMLight*));
+        }
+        else
+        {
+            new_capacity = This->lights_capacity * 2;
+            lights = HeapReAlloc(GetProcessHeap(), 0, This->lights, new_capacity * sizeof(IDirect3DRMLight*));
+        }
+
+        if (!lights)
+            return E_OUTOFMEMORY;
+
+        This->lights_capacity = new_capacity;
+        This->lights = lights;
+    }
+
+    This->lights[This->nb_lights++] = light;
+    IDirect3DRMLight_AddRef(light);
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI IDirect3DRMFrame3Impl_AddMoveCallback(IDirect3DRMFrame3* iface,




More information about the wine-cvs mailing list