[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