Module: wine Branch: master Commit: acfb249af6f1bc38d8d46f13b3f7d5e113e1b92d URL: http://source.winehq.org/git/wine.git/?a=commit;h=acfb249af6f1bc38d8d46f13b3...
Author: André Hentschel nerv@dawncrow.de Date: Mon Apr 30 17:10:27 2012 +0200
d3drm: Implement IDirect3DRMFrameX_AddVisual.
---
dlls/d3drm/frame.c | 46 ++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 42 insertions(+), 4 deletions(-)
diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c index 55fa08b..2e98059 100644 --- a/dlls/d3drm/frame.c +++ b/dlls/d3drm/frame.c @@ -37,6 +37,9 @@ typedef struct { ULONG nb_children; ULONG children_capacity; IDirect3DRMFrame3** children; + ULONG nb_visuals; + ULONG visuals_capacity; + IDirect3DRMVisual** visuals; } IDirect3DRMFrameImpl;
static inline IDirect3DRMFrameImpl *impl_from_IDirect3DRMFrame2(IDirect3DRMFrame2 *iface) @@ -279,9 +282,9 @@ static HRESULT WINAPI IDirect3DRMFrame2Impl_AddVisual(IDirect3DRMFrame2* iface, { IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
- FIXME("(%p/%p)->(%p): stub\n", iface, This, vis); + TRACE("(%p/%p)->(%p)\n", iface, This, vis);
- return E_NOTIMPL; + return IDirect3DRMFrame3_AddVisual(&This->IDirect3DRMFrame3_iface, (LPUNKNOWN)vis); }
static HRESULT WINAPI IDirect3DRMFrame2Impl_GetChildren(IDirect3DRMFrame2* iface, @@ -1169,10 +1172,45 @@ static HRESULT WINAPI IDirect3DRMFrame3Impl_AddRotation(IDirect3DRMFrame3* iface static HRESULT WINAPI IDirect3DRMFrame3Impl_AddVisual(IDirect3DRMFrame3* iface, LPUNKNOWN vis) { IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface); + ULONG i; + IDirect3DRMVisual** visuals;
- FIXME("(%p/%p)->(%p): stub\n", iface, This, vis); + TRACE("(%p/%p)->(%p)\n", iface, This, vis);
- return E_NOTIMPL; + if (!vis) + return D3DRMERR_BADOBJECT; + + /* Check if already existing and return gracefully without increasing ref count */ + for (i = 0; i < This->nb_visuals; i++) + if (This->visuals[i] == (IDirect3DRMVisual*)vis) + return D3DRM_OK; + + if ((This->nb_visuals + 1) > This->visuals_capacity) + { + ULONG new_capacity; + + if (!This->visuals_capacity) + { + new_capacity = 16; + visuals = HeapAlloc(GetProcessHeap(), 0, new_capacity * sizeof(IDirect3DRMVisual*)); + } + else + { + new_capacity = This->visuals_capacity * 2; + visuals = HeapReAlloc(GetProcessHeap(), 0, This->visuals, new_capacity * sizeof(IDirect3DRMVisual*)); + } + + if (!visuals) + return E_OUTOFMEMORY; + + This->visuals_capacity = new_capacity; + This->visuals = visuals; + } + + This->visuals[This->nb_visuals++] = (IDirect3DRMVisual*)vis; + IDirect3DRMVisual_AddRef(vis); + + return D3DRM_OK; }
static HRESULT WINAPI IDirect3DRMFrame3Impl_GetChildren(IDirect3DRMFrame3* iface,