Commit 722efadc authored by Christian Costa's avatar Christian Costa Committed by Alexandre Julliard

d3drm: Implement IDirect3DRMFrameX_GetParent and update tests.

parent 00bb726a
......@@ -30,10 +30,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
typedef struct {
typedef struct IDirect3DRMFrameImpl IDirect3DRMFrameImpl;
struct IDirect3DRMFrameImpl {
IDirect3DRMFrame2 IDirect3DRMFrame2_iface;
IDirect3DRMFrame3 IDirect3DRMFrame3_iface;
LONG ref;
IDirect3DRMFrameImpl* parent;
ULONG nb_children;
ULONG children_capacity;
IDirect3DRMFrame3** children;
......@@ -43,7 +46,7 @@ typedef struct {
ULONG nb_lights;
ULONG lights_capacity;
IDirect3DRMLight** lights;
} IDirect3DRMFrameImpl;
};
static inline IDirect3DRMFrameImpl *impl_from_IDirect3DRMFrame2(IDirect3DRMFrame2 *iface)
{
......@@ -56,6 +59,7 @@ static inline IDirect3DRMFrameImpl *impl_from_IDirect3DRMFrame3(IDirect3DRMFrame
}
static inline IDirect3DRMFrameImpl *unsafe_impl_from_IDirect3DRMFrame2(IDirect3DRMFrame2 *iface);
static inline IDirect3DRMFrameImpl *unsafe_impl_from_IDirect3DRMFrame3(IDirect3DRMFrame3 *iface);
/*** IUnknown methods ***/
static HRESULT WINAPI IDirect3DRMFrame2Impl_QueryInterface(IDirect3DRMFrame2* iface,
......@@ -333,9 +337,22 @@ static HRESULT WINAPI IDirect3DRMFrame2Impl_GetParent(IDirect3DRMFrame2* iface,
{
IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
TRACE("(%p/%p)->(%p)\n", iface, This, frame);
return E_NOTIMPL;
if (!frame)
return D3DRMERR_BADVALUE;
if (This->parent)
{
*frame = (LPDIRECT3DRMFRAME)&This->parent->IDirect3DRMFrame2_iface;
IDirect3DRMFrame_AddRef(*frame);
}
else
{
*frame = NULL;
}
return D3DRM_OK;
}
static HRESULT WINAPI IDirect3DRMFrame2Impl_GetPosition(IDirect3DRMFrame2* iface,
......@@ -1065,22 +1082,33 @@ static HRESULT WINAPI IDirect3DRMFrame3Impl_AddChild(IDirect3DRMFrame3* iface,
LPDIRECT3DRMFRAME3 child)
{
IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
ULONG i;
IDirect3DRMFrame3** children;
IDirect3DRMFrameImpl *child_obj = unsafe_impl_from_IDirect3DRMFrame3(child);
TRACE("(%p/%p)->(%p)\n", iface, This, child);
if (!child)
if (!child_obj)
return D3DRMERR_BADOBJECT;
/* Check if already existing and return gracefully without increasing ref count */
for (i = 0; i < This->nb_children; i++)
if (This->children[i] == child)
if (child_obj->parent)
{
IDirect3DRMFrame3* parent = &child_obj->parent->IDirect3DRMFrame3_iface;
if (parent == iface)
{
/* Passed frame is already a child so return success */
return D3DRM_OK;
}
else
{
/* Remove parent and continue */
IDirect3DRMFrame3_DeleteChild(parent, child);
}
}
if ((This->nb_children + 1) > This->children_capacity)
{
ULONG new_capacity;
IDirect3DRMFrame3** children;
if (!This->children_capacity)
{
......@@ -1102,6 +1130,7 @@ static HRESULT WINAPI IDirect3DRMFrame3Impl_AddChild(IDirect3DRMFrame3* iface,
This->children[This->nb_children++] = child;
IDirect3DRMFrame3_AddRef(child);
child_obj->parent = This;
return D3DRM_OK;
}
......@@ -1294,9 +1323,22 @@ static HRESULT WINAPI IDirect3DRMFrame3Impl_GetParent(IDirect3DRMFrame3* iface,
{
IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
TRACE("(%p/%p)->(%p)\n", iface, This, frame);
return E_NOTIMPL;
if (!frame)
return D3DRMERR_BADVALUE;
if (This->parent)
{
*frame = &This->parent->IDirect3DRMFrame3_iface;
IDirect3DRMFrame_AddRef(*frame);
}
else
{
*frame = NULL;
}
return D3DRM_OK;
}
static HRESULT WINAPI IDirect3DRMFrame3Impl_GetPosition(IDirect3DRMFrame3* iface,
......@@ -1440,11 +1482,12 @@ static HRESULT WINAPI IDirect3DRMFrame3Impl_DeleteChild(IDirect3DRMFrame3* iface
LPDIRECT3DRMFRAME3 frame)
{
IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
IDirect3DRMFrameImpl *frame_obj = unsafe_impl_from_IDirect3DRMFrame3(frame);
ULONG i;
TRACE("(%p/%p)->(%p)\n", iface, This, frame);
if (!frame)
if (!frame_obj)
return D3DRMERR_BADOBJECT;
/* Check if child exists */
......@@ -1457,6 +1500,7 @@ static HRESULT WINAPI IDirect3DRMFrame3Impl_DeleteChild(IDirect3DRMFrame3* iface
memmove(This->children + i, This->children + i + 1, sizeof(IDirect3DRMFrame3*) * (This->nb_children - 1 - i));
IDirect3DRMFrame3_Release(frame);
frame_obj->parent = NULL;
This->nb_children--;
return D3DRM_OK;
......@@ -2118,6 +2162,15 @@ static inline IDirect3DRMFrameImpl *unsafe_impl_from_IDirect3DRMFrame2(IDirect3D
return impl_from_IDirect3DRMFrame2(iface);
}
static inline IDirect3DRMFrameImpl *unsafe_impl_from_IDirect3DRMFrame3(IDirect3DRMFrame3 *iface)
{
if (!iface)
return NULL;
assert(iface->lpVtbl == &Direct3DRMFrame3_Vtbl);
return impl_from_IDirect3DRMFrame3(iface);
}
HRESULT Direct3DRMFrame_create(REFIID riid, IUnknown** ppObj)
{
IDirect3DRMFrameImpl* object;
......
......@@ -423,10 +423,12 @@ static void test_Frame(void)
ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
CHECK_REFCOUNT(pFrameC, 1);
hr = IDirect3DRMFrame_GetParent(pFrameC, NULL);
ok(hr == D3DRMERR_BADVALUE, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr);
pFrameTmp = (void*)0xdeadbeef;
hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
CHECK_REFCOUNT(pFrameC, 1);
pArray = NULL;
......@@ -448,7 +450,7 @@ static void test_Frame(void)
/* GetParent with NULL pointer */
hr = IDirect3DRMFrame_GetParent(pFrameP1, NULL);
todo_wine ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
CHECK_REFCOUNT(pFrameP1, 1);
/* [Add/Delete]Child with NULL pointer */
......@@ -463,8 +465,8 @@ static void test_Frame(void)
/* Add child to first parent */
pFrameTmp = (void*)0xdeadbeef;
hr = IDirect3DRMFrame_GetParent(pFrameP1, &pFrameTmp);
todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
hr = IDirect3DRMFrame_AddChild(pFrameP1, pFrameC);
ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
......@@ -487,9 +489,9 @@ static void test_Frame(void)
pFrameTmp = (void*)0xdeadbeef;
hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
todo_wine ok(pFrameTmp == pFrameP1, "pFrameTmp = %p\n", pFrameTmp);
todo_wine CHECK_REFCOUNT(pFrameP1, 2);
ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
ok(pFrameTmp == pFrameP1, "pFrameTmp = %p\n", pFrameTmp);
CHECK_REFCOUNT(pFrameP1, 2);
/* Add child to second parent */
hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameP2);
......@@ -497,7 +499,7 @@ static void test_Frame(void)
hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameC, 2);
CHECK_REFCOUNT(pFrameC, 2);
pArray = NULL;
hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
......@@ -528,15 +530,15 @@ static void test_Frame(void)
pFrameTmp = (void*)0xdeadbeef;
hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
todo_wine ok(pFrameTmp == pFrameP2, "pFrameTmp = %p\n", pFrameTmp);
todo_wine CHECK_REFCOUNT(pFrameP2, 2);
todo_wine CHECK_REFCOUNT(pFrameC, 2);
ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
ok(pFrameTmp == pFrameP2, "pFrameTmp = %p\n", pFrameTmp);
CHECK_REFCOUNT(pFrameP2, 2);
CHECK_REFCOUNT(pFrameC, 2);
/* Add child again */
hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameC, 2);
CHECK_REFCOUNT(pFrameC, 2);
pArray = NULL;
hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
......@@ -555,7 +557,7 @@ static void test_Frame(void)
/* Delete child */
hr = IDirect3DRMFrame_DeleteChild(pFrameP2, pFrameC);
ok(hr == D3DRM_OK, "Cannot delete child frame (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameC, 1);
CHECK_REFCOUNT(pFrameC, 1);
pArray = NULL;
hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
......@@ -572,17 +574,17 @@ static void test_Frame(void)
pFrameTmp = (void*)0xdeadbeef;
hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
/* Add two children */
hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameC, 2);
CHECK_REFCOUNT(pFrameC, 2);
hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameP1);
ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameP1, 3);
CHECK_REFCOUNT(pFrameP1, 3);
pArray = NULL;
hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
......@@ -605,11 +607,11 @@ static void test_Frame(void)
/* [Add/Delete]Visual with NULL pointer */
hr = IDirect3DRMFrame_AddVisual(pFrameP1, NULL);
ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameP1, 3);
CHECK_REFCOUNT(pFrameP1, 3);
hr = IDirect3DRMFrame_DeleteVisual(pFrameP1, NULL);
ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameP1, 3);
CHECK_REFCOUNT(pFrameP1, 3);
/* Create Visual */
hr = IDirect3DRM_CreateMeshBuilder(pD3DRM, &pMeshBuilder);
......@@ -619,7 +621,7 @@ static void test_Frame(void)
/* Add Visual to first parent */
hr = IDirect3DRMFrame_AddVisual(pFrameP1, pVisual1);
ok(hr == D3DRM_OK, "Cannot add visual (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameP1, 3);
CHECK_REFCOUNT(pFrameP1, 3);
CHECK_REFCOUNT(pVisual1, 2);
pVisualArray = NULL;
......@@ -639,17 +641,17 @@ static void test_Frame(void)
/* Delete Visual */
hr = IDirect3DRMFrame_DeleteVisual(pFrameP1, pVisual1);
ok(hr == D3DRM_OK, "Cannot delete visual (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameP1, 3);
CHECK_REFCOUNT(pFrameP1, 3);
IDirect3DRMMeshBuilder_Release(pMeshBuilder);
/* [Add/Delete]Light with NULL pointer */
hr = IDirect3DRMFrame_AddLight(pFrameP1, NULL);
ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameP1, 3);
CHECK_REFCOUNT(pFrameP1, 3);
hr = IDirect3DRMFrame_DeleteLight(pFrameP1, NULL);
ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameP1, 3);
CHECK_REFCOUNT(pFrameP1, 3);
/* Create Light */
hr = IDirect3DRM_CreateLightRGB(pD3DRM, D3DRMLIGHT_SPOT, 0.1, 0.2, 0.3, &pLight1);
......@@ -658,7 +660,7 @@ static void test_Frame(void)
/* Add Light to first parent */
hr = IDirect3DRMFrame_AddLight(pFrameP1, pLight1);
ok(hr == D3DRM_OK, "Cannot add light (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameP1, 3);
CHECK_REFCOUNT(pFrameP1, 3);
CHECK_REFCOUNT(pLight1, 2);
pLightArray = NULL;
......@@ -678,13 +680,13 @@ static void test_Frame(void)
/* Delete Light */
hr = IDirect3DRMFrame_DeleteLight(pFrameP1, pLight1);
ok(hr == D3DRM_OK, "Cannot delete light (hr = %x)\n", hr);
todo_wine CHECK_REFCOUNT(pFrameP1, 3);
CHECK_REFCOUNT(pFrameP1, 3);
IDirect3DRMLight_Release(pLight1);
/* Cleanup */
IDirect3DRMFrame_Release(pFrameP2);
CHECK_REFCOUNT(pFrameC, 2);
todo_wine CHECK_REFCOUNT(pFrameP1, 3);
CHECK_REFCOUNT(pFrameP1, 3);
IDirect3DRMFrame_Release(pFrameC);
IDirect3DRMFrame_Release(pFrameP1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment