[PATCH 2/4] d3drm: Implement IDirect3DRMFrameX_DeleteChild.

Christian Costa titan.costa at gmail.com
Mon Apr 2 01:54:20 CDT 2012


---
 dlls/d3drm/frame.c       |   30 ++++++++++++++++++++++++++----
 dlls/d3drm/tests/d3drm.c |    4 ++--
 2 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c
index d29c450..97ba332 100644
--- a/dlls/d3drm/frame.c
+++ b/dlls/d3drm/frame.c
@@ -478,10 +478,16 @@ static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteChild(IDirect3DRMFrame2* iface
                                                         LPDIRECT3DRMFRAME frame)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    LPDIRECT3DRMFRAME3 child;
 
-    FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
+    TRACE("(%p/%p)->(%p)\n", iface, This, frame);
 
-    return E_NOTIMPL;
+    if (!frame)
+        return D3DRMERR_BADOBJECT;
+
+    child = &impl_from_IDirect3DRMFrame2((LPDIRECT3DRMFRAME2)frame)->IDirect3DRMFrame3_iface;
+
+    return IDirect3DRMFrame3_DeleteChild(&This->IDirect3DRMFrame3_iface, child);
 }
 
 static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteLight(IDirect3DRMFrame2* iface,
@@ -1341,10 +1347,26 @@ static HRESULT WINAPI IDirect3DRMFrame3Impl_DeleteChild(IDirect3DRMFrame3* iface
                                                         LPDIRECT3DRMFRAME3 frame)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
+    ULONG i;
 
-    FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
+    TRACE("(%p/%p)->(%p)\n", iface, This, frame);
 
-    return E_NOTIMPL;
+    if (!frame)
+        return D3DRMERR_BADOBJECT;
+
+    /* Check if child exists */
+    for (i = 0; i < This->nb_children; i++)
+        if (This->children[i] == frame)
+            break;
+
+    if (i == This->nb_children)
+        return D3DRMERR_BADVALUE;
+
+    memmove(This->children + i, This->children + i + 1, sizeof(IDirect3DRMFrame3*) * (This->nb_children - 1 - i));
+    IDirect3DRMFrame3_Release(frame);
+    This->nb_children--;
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI IDirect3DRMFrame3Impl_DeleteLight(IDirect3DRMFrame3* iface,
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index caa9dc5..91e1c76 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -450,7 +450,7 @@ static void test_Frame(void)
     CHECK_REFCOUNT(pFrameP1, 1);
 
     hr = IDirect3DRMFrame_DeleteChild(pFrameP1, NULL);
-    todo_wine ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
+    ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
     CHECK_REFCOUNT(pFrameP1, 1);
 
     /* Add child to first parent */
@@ -547,7 +547,7 @@ static void test_Frame(void)
 
     /* Delete child */
     hr = IDirect3DRMFrame_DeleteChild(pFrameP2, pFrameC);
-    todo_wine ok(hr == D3DRM_OK, "Cannot delete child frame (hr = %x)\n", hr);
+    ok(hr == D3DRM_OK, "Cannot delete child frame (hr = %x)\n", hr);
     todo_wine CHECK_REFCOUNT(pFrameC, 1);
 
     pArray = NULL;




More information about the wine-patches mailing list