Module: wine Branch: master Commit: 4001e60e34ccdf214cb5757a3a8ddccb550a355d URL: http://source.winehq.org/git/wine.git/?a=commit;h=4001e60e34ccdf214cb5757a3a...
Author: Christian Costa titan.costa@gmail.com Date: Fri Apr 13 13:55:23 2012 +0200
d3drm: Implement IDirect3DRMFrameX_DeleteChild.
---
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 985fe58..55fa08b 100644 --- a/dlls/d3drm/frame.c +++ b/dlls/d3drm/frame.c @@ -482,10 +482,16 @@ static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteChild(IDirect3DRMFrame2* iface LPDIRECT3DRMFRAME frame) { IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface); + IDirect3DRMFrameImpl *child;
- FIXME("(%p/%p)->(%p): stub\n", iface, This, frame); + TRACE("(%p/%p)->(%p)\n", iface, This, frame);
- return E_NOTIMPL; + child = unsafe_impl_from_IDirect3DRMFrame2((LPDIRECT3DRMFRAME2)frame); + + if (!child) + return D3DRMERR_BADOBJECT; + + return IDirect3DRMFrame3_DeleteChild(&This->IDirect3DRMFrame3_iface, &child->IDirect3DRMFrame3_iface); }
static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteLight(IDirect3DRMFrame2* iface, @@ -1358,10 +1364,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;