[1/2] d3drm: Move up the IDirect3DRM{Frame,Light,Visual}Array implementations to avoid forward declarations.

Francois Gouget fgouget at free.fr
Tue Jun 12 03:23:23 CDT 2012


---
 dlls/d3drm/frame.c | 1116 ++++++++++++++++++++++++++--------------------------
 1 file changed, 556 insertions(+), 560 deletions(-)

diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c
index f0e1cd0..dbbc1dd 100644
--- a/dlls/d3drm/frame.c
+++ b/dlls/d3drm/frame.c
@@ -78,10 +78,6 @@ typedef struct {
     LPDIRECT3DRMLIGHT* lights;
 } IDirect3DRMLightArrayImpl;
 
-HRESULT Direct3DRMFrameArray_create(IDirect3DRMFrameArray** obj);
-HRESULT Direct3DRMVisualArray_create(IDirect3DRMVisualArray** ret_iface);
-HRESULT Direct3DRMLightArray_create(IDirect3DRMLightArray** ret_iface);
-
 static inline IDirect3DRMFrameImpl *impl_from_IDirect3DRMFrame2(IDirect3DRMFrame2 *iface)
 {
     return CONTAINING_RECORD(iface, IDirect3DRMFrameImpl, IDirect3DRMFrame2_iface);
@@ -101,24 +97,19 @@ static inline IDirect3DRMLightArrayImpl *impl_from_IDirect3DRMLightArray(IDirect
 }
 
 /*** IUnknown methods ***/
-static HRESULT WINAPI IDirect3DRMFrame2Impl_QueryInterface(IDirect3DRMFrame2* iface,
-                                                           REFIID riid, void** object)
+static HRESULT WINAPI IDirect3DRMFrameArrayImpl_QueryInterface(IDirect3DRMFrameArray* iface,
+                                                               REFIID riid, void** object)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMFrameArrayImpl *This = (IDirect3DRMFrameArrayImpl*)iface;
 
     TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), object);
 
     *object = NULL;
 
-    if(IsEqualGUID(riid, &IID_IUnknown) ||
-       IsEqualGUID(riid, &IID_IDirect3DRMFrame) ||
-       IsEqualGUID(riid, &IID_IDirect3DRMFrame2))
-    {
-        *object = &This->IDirect3DRMFrame2_iface;
-    }
-    else if(IsEqualGUID(riid, &IID_IDirect3DRMFrame3))
+    if (IsEqualGUID(riid, &IID_IUnknown) ||
+        IsEqualGUID(riid, &IID_IDirect3DRMFrameArray))
     {
-        *object = &This->IDirect3DRMFrame3_iface;
+        *object = &This->IDirect3DRMFrameArray_iface;
     }
     else
     {
@@ -126,380 +117,741 @@ static HRESULT WINAPI IDirect3DRMFrame2Impl_QueryInterface(IDirect3DRMFrame2* if
         return E_NOINTERFACE;
     }
 
-    IDirect3DRMFrame2_AddRef(iface);
+    IDirect3DRMFrameArray_AddRef(iface);
     return S_OK;
 }
 
-static ULONG WINAPI IDirect3DRMFrame2Impl_AddRef(IDirect3DRMFrame2* iface)
+static ULONG WINAPI IDirect3DRMFrameArrayImpl_AddRef(IDirect3DRMFrameArray* iface)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMFrameArrayImpl *This = (IDirect3DRMFrameArrayImpl*)iface;
     ULONG ref = InterlockedIncrement(&This->ref);
 
-    TRACE("(%p)->(): new ref = %d\n", This, ref);
+    TRACE("(%p)->(): new ref = %u\n", This, ref);
 
     return ref;
 }
 
-static ULONG WINAPI IDirect3DRMFrame2Impl_Release(IDirect3DRMFrame2* iface)
+static ULONG WINAPI IDirect3DRMFrameArrayImpl_Release(IDirect3DRMFrameArray* iface)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMFrameArrayImpl *This = (IDirect3DRMFrameArrayImpl*)iface;
     ULONG ref = InterlockedDecrement(&This->ref);
     ULONG i;
 
-    TRACE("(%p)->(): new ref = %d\n", This, ref);
+    TRACE("(%p)->(): new ref = %u\n", This, ref);
 
     if (!ref)
     {
-        for (i = 0; i < This->nb_children; i++)
-            IDirect3DRMFrame3_Release(This->children[i]);
-        HeapFree(GetProcessHeap(), 0, This->children);
-        for (i = 0; i < This->nb_visuals; i++)
-            IDirect3DRMVisual_Release(This->visuals[i]);
-        HeapFree(GetProcessHeap(), 0, This->visuals);
-        for (i = 0; i < This->nb_lights; i++)
-            IDirect3DRMLight_Release(This->lights[i]);
-        HeapFree(GetProcessHeap(), 0, This->lights);
+        for (i = 0; i < This->size; i++)
+            IDirect3DRMFrame_Release(This->frames[i]);
+        HeapFree(GetProcessHeap(), 0, This->frames);
         HeapFree(GetProcessHeap(), 0, This);
     }
 
     return ref;
 }
 
-/*** IDirect3DRMObject methods ***/
-static HRESULT WINAPI IDirect3DRMFrame2Impl_Clone(IDirect3DRMFrame2* iface,
-                                                  LPUNKNOWN unkwn, REFIID riid,
-                                                  LPVOID* object)
+/*** IDirect3DRMArray methods ***/
+static DWORD WINAPI IDirect3DRMFrameArrayImpl_GetSize(IDirect3DRMFrameArray* iface)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMFrameArrayImpl *This = (IDirect3DRMFrameArrayImpl*)iface;
 
-    FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object);
+    TRACE("(%p)->() = %d\n", This,  This->size);
 
-    return E_NOTIMPL;
+    return This->size;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_AddDestroyCallback(IDirect3DRMFrame2* iface,
-                                                               D3DRMOBJECTCALLBACK cb,
-                                                               LPVOID argument)
+/*** IDirect3DRMFrameArray methods ***/
+static HRESULT WINAPI IDirect3DRMFrameArrayImpl_GetElement(IDirect3DRMFrameArray* iface, DWORD index, LPDIRECT3DRMFRAME* frame)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMFrameArrayImpl *This = (IDirect3DRMFrameArrayImpl*)iface;
 
-    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
+    TRACE("(%p)->(%u, %p)\n", This, index, frame);
 
-    return E_NOTIMPL;
-}
+    if (!frame)
+        return D3DRMERR_BADVALUE;
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteDestroyCallback(IDirect3DRMFrame2* iface,
-                                                                  D3DRMOBJECTCALLBACK cb,
-                                                                  LPVOID argument)
-{
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    *frame = NULL;
 
-    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
+    if (index >= This->size)
+        return D3DRMERR_BADVALUE;
 
-    return E_NOTIMPL;
+    IDirect3DRMFrame_AddRef(This->frames[index]);
+    *frame = This->frames[index];
+
+    return D3DRM_OK;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_SetAppData(IDirect3DRMFrame2* iface,
-                                                       DWORD data)
+static const struct IDirect3DRMFrameArrayVtbl Direct3DRMFrameArray_Vtbl =
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
-
-    FIXME("(%p/%p)->(%u): stub\n", iface, This, data);
-
-    return E_NOTIMPL;
-}
+    /*** IUnknown methods ***/
+    IDirect3DRMFrameArrayImpl_QueryInterface,
+    IDirect3DRMFrameArrayImpl_AddRef,
+    IDirect3DRMFrameArrayImpl_Release,
+    /*** IDirect3DRMArray methods ***/
+    IDirect3DRMFrameArrayImpl_GetSize,
+    /*** IDirect3DRMFrameArray methods ***/
+    IDirect3DRMFrameArrayImpl_GetElement
+};
 
-static DWORD WINAPI IDirect3DRMFrame2Impl_GetAppData(IDirect3DRMFrame2* iface)
+HRESULT Direct3DRMFrameArray_create(IDirect3DRMFrameArray** obj)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMFrameArrayImpl* object;
 
-    FIXME("(%p/%p)->(): stub\n", iface, This);
+    TRACE("(%p)\n", obj);
 
-    return 0;
-}
+    *obj = NULL;
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_SetName(IDirect3DRMFrame2* iface, LPCSTR name)
-{
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMFrameArrayImpl));
+    if (!object)
+    {
+        ERR("Out of memory\n");
+        return E_OUTOFMEMORY;
+    }
 
-    FIXME("(%p/%p)->(%s): stub\n", iface, This, name);
+    object->IDirect3DRMFrameArray_iface.lpVtbl = &Direct3DRMFrameArray_Vtbl;
+    object->ref = 1;
 
-    return E_NOTIMPL;
+    *obj = &object->IDirect3DRMFrameArray_iface;
+
+    return S_OK;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetName(IDirect3DRMFrame2* iface,
-                                                    LPDWORD size, LPSTR name)
+/*** IUnknown methods ***/
+static HRESULT WINAPI IDirect3DRMVisualArrayImpl_QueryInterface(IDirect3DRMVisualArray* iface,
+                                                                REFIID riid, void** ret_iface)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ret_iface);
 
-    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
+    if (IsEqualGUID(riid, &IID_IUnknown) ||
+        IsEqualGUID(riid, &IID_IDirect3DRMFrameArray))
+    {
+        *ret_iface = iface;
+        IDirect3DRMVisualArray_AddRef(iface);
+        return S_OK;
+    }
 
-    return E_NOTIMPL;
+    *ret_iface = NULL;
+
+    WARN("Interface %s not implemented\n", debugstr_guid(riid));
+
+    return E_NOINTERFACE;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetClassName(IDirect3DRMFrame2* iface,
-                                                         LPDWORD size, LPSTR name)
+static ULONG WINAPI IDirect3DRMVisualArrayImpl_AddRef(IDirect3DRMVisualArray* iface)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMVisualArrayImpl *This = (IDirect3DRMVisualArrayImpl*)iface;
+    ULONG ref = InterlockedIncrement(&This->ref);
 
-    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
+    TRACE("(%p)->(): new ref = %u\n", iface, ref);
 
-    return E_NOTIMPL;
+    return ref;
 }
 
-/*** IDirect3DRMFrame methods ***/
-static HRESULT WINAPI IDirect3DRMFrame2Impl_AddChild(IDirect3DRMFrame2* iface,
-                                                     LPDIRECT3DRMFRAME child)
+static ULONG WINAPI IDirect3DRMVisualArrayImpl_Release(IDirect3DRMVisualArray* iface)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
-    IDirect3DRMFrameImpl *frame = unsafe_impl_from_IDirect3DRMFrame2((LPDIRECT3DRMFRAME2)child);
+    IDirect3DRMVisualArrayImpl *This = (IDirect3DRMVisualArrayImpl*)iface;
+    ULONG ref = InterlockedDecrement(&This->ref);
+    ULONG i;
 
-    TRACE("(%p/%p)->(%p)\n", iface, This, child);
+    TRACE("(%p)->(): new ref = %u\n", iface, ref);
 
-    if (!frame)
-        return D3DRMERR_BADOBJECT;
+    if (!ref)
+    {
+        for (i = 0; i < This->size; i++)
+            IDirect3DRMVisual_Release(This->visuals[i]);
+        HeapFree(GetProcessHeap(), 0, This->visuals);
+        HeapFree(GetProcessHeap(), 0, This);
+    }
 
-    return IDirect3DRMFrame3_AddChild(&This->IDirect3DRMFrame3_iface, &frame->IDirect3DRMFrame3_iface);
+    return ref;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_AddLight(IDirect3DRMFrame2* iface,
-                                                       LPDIRECT3DRMLIGHT light)
+/*** IDirect3DRMArray methods ***/
+static DWORD WINAPI IDirect3DRMVisualArrayImpl_GetSize(IDirect3DRMVisualArray* iface)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMVisualArrayImpl *This = (IDirect3DRMVisualArrayImpl*)iface;
 
-    TRACE("(%p/%p)->(%p)\n", iface, This, light);
+    TRACE("(%p)->() = %d\n", iface,  This->size);
 
-    return IDirect3DRMFrame3_AddLight(&This->IDirect3DRMFrame3_iface, light);
+    return This->size;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_AddMoveCallback(IDirect3DRMFrame2* iface,
-                                                            D3DRMFRAMEMOVECALLBACK cb, VOID *arg)
+/*** IDirect3DRMVisualArray methods ***/
+static HRESULT WINAPI IDirect3DRMVisualArrayImpl_GetElement(IDirect3DRMVisualArray* iface, DWORD index, LPDIRECT3DRMVISUAL* visual)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMVisualArrayImpl *This = (IDirect3DRMVisualArrayImpl*)iface;
 
-    FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, cb, arg);
+    TRACE("(%p)->(%u, %p)\n", iface, index, visual);
 
-    return E_NOTIMPL;
-}
+    if (!visual)
+        return D3DRMERR_BADVALUE;
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_AddTransform(IDirect3DRMFrame2* iface,
-                                                         D3DRMCOMBINETYPE type,
-                                                         D3DRMMATRIX4D matrix)
-{
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    *visual = NULL;
 
-    TRACE("(%p/%p)->(%u,%p)\n", iface, This, type, matrix);
+    if (index >= This->size)
+        return D3DRMERR_BADVALUE;
 
-    return IDirect3DRMFrame3_AddTransform(&This->IDirect3DRMFrame3_iface, type, matrix);
+    IDirect3DRMVisual_AddRef(This->visuals[index]);
+    *visual = This->visuals[index];
+
+    return D3DRM_OK;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_AddTranslation(IDirect3DRMFrame2* iface,
-                                                           D3DRMCOMBINETYPE type,
-                                                           D3DVALUE x, D3DVALUE y, D3DVALUE z)
+static const struct IDirect3DRMVisualArrayVtbl Direct3DRMVisualArray_Vtbl =
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    /*** IUnknown methods ***/
+    IDirect3DRMVisualArrayImpl_QueryInterface,
+    IDirect3DRMVisualArrayImpl_AddRef,
+    IDirect3DRMVisualArrayImpl_Release,
+    /*** IDirect3DRMArray methods ***/
+    IDirect3DRMVisualArrayImpl_GetSize,
+    /*** IDirect3DRMVisualArray methods ***/
+    IDirect3DRMVisualArrayImpl_GetElement
+};
 
-    FIXME("(%p/%p)->(%u,%f,%f,%f): stub\n", iface, This, type, x, y, z);
+HRESULT Direct3DRMVisualArray_create(IDirect3DRMVisualArray** ret_iface)
+{
+    IDirect3DRMVisualArrayImpl* object;
 
-    return E_NOTIMPL;
-}
+    TRACE("(%p)\n", ret_iface);
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_AddScale(IDirect3DRMFrame2* iface,
-                                                     D3DRMCOMBINETYPE type,
-                                                     D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
-{
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    *ret_iface = NULL;
 
-    FIXME("(%p/%p)->(%u,%f,%f,%f): stub\n", iface, This, type, sx, sy, sz);
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMVisualArrayImpl));
+    if (!object)
+    {
+        ERR("Out of memory\n");
+        return E_OUTOFMEMORY;
+    }
 
-    return E_NOTIMPL;
+    object->IDirect3DRMVisualArray_iface.lpVtbl = &Direct3DRMVisualArray_Vtbl;
+    object->ref = 1;
+
+    *ret_iface = &object->IDirect3DRMVisualArray_iface;
+
+    return S_OK;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_AddRotation(IDirect3DRMFrame2* iface,
-                                                        D3DRMCOMBINETYPE type,
-                                                        D3DVALUE x, D3DVALUE y, D3DVALUE z,
-                                                        D3DVALUE theta)
+/*** IUnknown methods ***/
+static HRESULT WINAPI IDirect3DRMLightArrayImpl_QueryInterface(IDirect3DRMLightArray* iface,
+                                                               REFIID riid, void** object)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMLightArrayImpl *This = impl_from_IDirect3DRMLightArray(iface);
 
-    FIXME("(%p/%p)->(%u,%f,%f,%f,%f): stub\n", iface, This, type, x, y, z, theta);
+    TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), object);
 
-    return E_NOTIMPL;
+    *object = NULL;
+
+    if (IsEqualGUID(riid, &IID_IUnknown) ||
+        IsEqualGUID(riid, &IID_IDirect3DRMLightArray))
+    {
+        *object = &This->IDirect3DRMLightArray_iface;
+    }
+    else
+    {
+        FIXME("interface %s not implemented\n", debugstr_guid(riid));
+        return E_NOINTERFACE;
+    }
+
+    IDirect3DRMLightArray_AddRef(iface);
+    return S_OK;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_AddVisual(IDirect3DRMFrame2* iface,
-                                                      LPDIRECT3DRMVISUAL vis)
+static ULONG WINAPI IDirect3DRMLightArrayImpl_AddRef(IDirect3DRMLightArray* iface)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMLightArrayImpl *This = impl_from_IDirect3DRMLightArray(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
 
-    TRACE("(%p/%p)->(%p)\n", iface, This, vis);
+    TRACE("(%p)->(): new ref = %u\n", This, ref);
 
-    return IDirect3DRMFrame3_AddVisual(&This->IDirect3DRMFrame3_iface, (LPUNKNOWN)vis);
+    return ref;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetChildren(IDirect3DRMFrame2* iface,
-                                                        LPDIRECT3DRMFRAMEARRAY *children)
+static ULONG WINAPI IDirect3DRMLightArrayImpl_Release(IDirect3DRMLightArray* iface)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMLightArrayImpl *This = impl_from_IDirect3DRMLightArray(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+    ULONG i;
 
-    TRACE("(%p/%p)->(%p)\n", iface, This, children);
+    TRACE("(%p)->(): new ref = %u\n", This, ref);
 
-    return IDirect3DRMFrame3_GetChildren(&This->IDirect3DRMFrame3_iface, children);
+    if (!ref)
+    {
+        for (i = 0; i < This->size; i++)
+            IDirect3DRMLight_Release(This->lights[i]);
+        HeapFree(GetProcessHeap(), 0, This->lights);
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+
+    return ref;
 }
 
-static D3DCOLOR WINAPI IDirect3DRMFrame2Impl_GetColor(IDirect3DRMFrame2* iface)
+/*** IDirect3DRMArray methods ***/
+static DWORD WINAPI IDirect3DRMLightArrayImpl_GetSize(IDirect3DRMLightArray* iface)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMLightArrayImpl *This = impl_from_IDirect3DRMLightArray(iface);
 
-    FIXME("(%p/%p)->(): stub\n", iface, This);
+    TRACE("(%p)->() = %d\n", This,  This->size);
 
-    return 0;
+    return This->size;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetLights(IDirect3DRMFrame2* iface,
-                                                      LPDIRECT3DRMLIGHTARRAY *lights)
+/*** IDirect3DRMLightArray methods ***/
+static HRESULT WINAPI IDirect3DRMLightArrayImpl_GetElement(IDirect3DRMLightArray* iface, DWORD index, LPDIRECT3DRMLIGHT* light)
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMLightArrayImpl *This = impl_from_IDirect3DRMLightArray(iface);
 
-    TRACE("(%p/%p)->(%p)\n", iface, This, lights);
+    TRACE("(%p)->(%u, %p)\n", This, index, light);
 
-    return IDirect3DRMFrame3_GetLights(&This->IDirect3DRMFrame3_iface, lights);
+    if (!light)
+        return D3DRMERR_BADVALUE;
+
+    *light = NULL;
+
+    if (index >= This->size)
+        return D3DRMERR_BADVALUE;
+
+    IDirect3DRMLight_AddRef(This->lights[index]);
+    *light = This->lights[index];
+
+    return D3DRM_OK;
 }
 
-static D3DRMMATERIALMODE WINAPI IDirect3DRMFrame2Impl_GetMaterialMode(IDirect3DRMFrame2* iface)
+static const struct IDirect3DRMLightArrayVtbl Direct3DRMLightArray_Vtbl =
 {
-    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    /*** IUnknown methods ***/
+    IDirect3DRMLightArrayImpl_QueryInterface,
+    IDirect3DRMLightArrayImpl_AddRef,
+    IDirect3DRMLightArrayImpl_Release,
+    /*** IDirect3DRMArray methods ***/
+    IDirect3DRMLightArrayImpl_GetSize,
+    /*** IDirect3DRMLightArray methods ***/
+    IDirect3DRMLightArrayImpl_GetElement
+};
 
-    FIXME("(%p/%p)->(): stub\n", iface, This);
+HRESULT Direct3DRMLightArray_create(IDirect3DRMLightArray** obj)
+{
+    IDirect3DRMLightArrayImpl* object;
 
-    return D3DRMMATERIAL_FROMPARENT;
+    TRACE("(%p)\n", obj);
+
+    *obj = NULL;
+
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMLightArrayImpl));
+    if (!object)
+    {
+        ERR("Out of memory\n");
+        return E_OUTOFMEMORY;
+    }
+
+    object->IDirect3DRMLightArray_iface.lpVtbl = &Direct3DRMLightArray_Vtbl;
+    object->ref = 1;
+
+    *obj = &object->IDirect3DRMLightArray_iface;
+
+    return S_OK;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetParent(IDirect3DRMFrame2* iface,
-                                                      LPDIRECT3DRMFRAME * frame)
+/*** IUnknown methods ***/
+static HRESULT WINAPI IDirect3DRMFrame2Impl_QueryInterface(IDirect3DRMFrame2* iface,
+                                                           REFIID riid, void** object)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
 
-    TRACE("(%p/%p)->(%p)\n", iface, This, frame);
+    TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), object);
 
-    if (!frame)
-        return D3DRMERR_BADVALUE;
+    *object = NULL;
 
-    if (This->parent)
+    if(IsEqualGUID(riid, &IID_IUnknown) ||
+       IsEqualGUID(riid, &IID_IDirect3DRMFrame) ||
+       IsEqualGUID(riid, &IID_IDirect3DRMFrame2))
     {
-        *frame = (LPDIRECT3DRMFRAME)&This->parent->IDirect3DRMFrame2_iface;
-        IDirect3DRMFrame_AddRef(*frame);
+        *object = &This->IDirect3DRMFrame2_iface;
+    }
+    else if(IsEqualGUID(riid, &IID_IDirect3DRMFrame3))
+    {
+        *object = &This->IDirect3DRMFrame3_iface;
     }
     else
     {
-        *frame = NULL;
+        FIXME("interface %s not implemented\n", debugstr_guid(riid));
+        return E_NOINTERFACE;
     }
 
-    return D3DRM_OK;
+    IDirect3DRMFrame2_AddRef(iface);
+    return S_OK;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetPosition(IDirect3DRMFrame2* iface,
-                                                        LPDIRECT3DRMFRAME reference,
-                                                        LPD3DVECTOR return_position)
+static ULONG WINAPI IDirect3DRMFrame2Impl_AddRef(IDirect3DRMFrame2* iface)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
 
-    FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, reference, return_position);
+    TRACE("(%p)->(): new ref = %d\n", This, ref);
 
-    return E_NOTIMPL;
+    return ref;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetRotation(IDirect3DRMFrame2* iface,
-                                                        LPDIRECT3DRMFRAME reference,
-                                                        LPD3DVECTOR axis, LPD3DVALUE return_theta)
+static ULONG WINAPI IDirect3DRMFrame2Impl_Release(IDirect3DRMFrame2* iface)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+    ULONG i;
 
-    FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, reference, axis, return_theta);
+    TRACE("(%p)->(): new ref = %d\n", This, ref);
 
-    return E_NOTIMPL;
+    if (!ref)
+    {
+        for (i = 0; i < This->nb_children; i++)
+            IDirect3DRMFrame3_Release(This->children[i]);
+        HeapFree(GetProcessHeap(), 0, This->children);
+        for (i = 0; i < This->nb_visuals; i++)
+            IDirect3DRMVisual_Release(This->visuals[i]);
+        HeapFree(GetProcessHeap(), 0, This->visuals);
+        for (i = 0; i < This->nb_lights; i++)
+            IDirect3DRMLight_Release(This->lights[i]);
+        HeapFree(GetProcessHeap(), 0, This->lights);
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+
+    return ref;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetScene(IDirect3DRMFrame2* iface,
-                                                     LPDIRECT3DRMFRAME * frame)
+/*** IDirect3DRMObject methods ***/
+static HRESULT WINAPI IDirect3DRMFrame2Impl_Clone(IDirect3DRMFrame2* iface,
+                                                  LPUNKNOWN unkwn, REFIID riid,
+                                                  LPVOID* object)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
 
-    FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
+    FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object);
 
     return E_NOTIMPL;
 }
 
-static D3DRMSORTMODE WINAPI IDirect3DRMFrame2Impl_GetSortMode(IDirect3DRMFrame2* iface)
+static HRESULT WINAPI IDirect3DRMFrame2Impl_AddDestroyCallback(IDirect3DRMFrame2* iface,
+                                                               D3DRMOBJECTCALLBACK cb,
+                                                               LPVOID argument)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
 
-    FIXME("(%p/%p)->(): stub\n", iface, This);
+    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
 
-    return D3DRMSORT_FROMPARENT;
+    return E_NOTIMPL;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetTexture(IDirect3DRMFrame2* iface,
-                                                       LPDIRECT3DRMTEXTURE * tex)
+static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteDestroyCallback(IDirect3DRMFrame2* iface,
+                                                                  D3DRMOBJECTCALLBACK cb,
+                                                                  LPVOID argument)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
 
-    FIXME("(%p/%p)->(%p): stub\n", iface, This, tex);
+    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
 
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetTransform(IDirect3DRMFrame2* iface,
-                                                         D3DRMMATRIX4D return_matrix)
+static HRESULT WINAPI IDirect3DRMFrame2Impl_SetAppData(IDirect3DRMFrame2* iface,
+                                                       DWORD data)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
 
-    TRACE("(%p/%p)->(%p)\n", iface, This, return_matrix);
+    FIXME("(%p/%p)->(%u): stub\n", iface, This, data);
 
-    memcpy(&return_matrix[0][0], &This->transform[0][0], sizeof(D3DRMMATRIX4D));
+    return E_NOTIMPL;
+}
 
-    return D3DRM_OK;
+static DWORD WINAPI IDirect3DRMFrame2Impl_GetAppData(IDirect3DRMFrame2* iface)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(): stub\n", iface, This);
+
+    return 0;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetVelocity(IDirect3DRMFrame2* iface,
-                                                        LPDIRECT3DRMFRAME reference,
-                                                        LPD3DVECTOR return_velocity,
-                                                        BOOL with_rotation)
+static HRESULT WINAPI IDirect3DRMFrame2Impl_SetName(IDirect3DRMFrame2* iface, LPCSTR name)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
 
-    FIXME("(%p/%p)->(%p,%p,%d): stub\n", iface, This, reference, return_velocity, with_rotation);
+    FIXME("(%p/%p)->(%s): stub\n", iface, This, name);
 
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetOrientation(IDirect3DRMFrame2* iface,
-                                                           LPDIRECT3DRMFRAME reference,
-                                                           LPD3DVECTOR dir, LPD3DVECTOR up)
+static HRESULT WINAPI IDirect3DRMFrame2Impl_GetName(IDirect3DRMFrame2* iface,
+                                                    LPDWORD size, LPSTR name)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
 
-    FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, reference, dir, up);
+    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
 
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI IDirect3DRMFrame2Impl_GetVisuals(IDirect3DRMFrame2* iface,
-                                                       LPDIRECT3DRMVISUALARRAY *visuals)
+static HRESULT WINAPI IDirect3DRMFrame2Impl_GetClassName(IDirect3DRMFrame2* iface,
+                                                         LPDWORD size, LPSTR name)
 {
     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
-    IDirect3DRMVisualArrayImpl* obj;
-    HRESULT hr;
 
-    TRACE("(%p/%p)->(%p)\n", iface, This, visuals);
+    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
 
-    if (!visuals)
-        return D3DRMERR_BADVALUE;
+    return E_NOTIMPL;
+}
 
-    hr = Direct3DRMVisualArray_create(visuals);
+/*** IDirect3DRMFrame methods ***/
+static HRESULT WINAPI IDirect3DRMFrame2Impl_AddChild(IDirect3DRMFrame2* iface,
+                                                     LPDIRECT3DRMFRAME child)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMFrameImpl *frame = unsafe_impl_from_IDirect3DRMFrame2((LPDIRECT3DRMFRAME2)child);
 
-    if (hr != D3DRM_OK)
-        return hr;
+    TRACE("(%p/%p)->(%p)\n", iface, This, child);
+
+    if (!frame)
+        return D3DRMERR_BADOBJECT;
+
+    return IDirect3DRMFrame3_AddChild(&This->IDirect3DRMFrame3_iface, &frame->IDirect3DRMFrame3_iface);
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_AddLight(IDirect3DRMFrame2* iface,
+                                                       LPDIRECT3DRMLIGHT light)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    TRACE("(%p/%p)->(%p)\n", iface, This, light);
+
+    return IDirect3DRMFrame3_AddLight(&This->IDirect3DRMFrame3_iface, light);
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_AddMoveCallback(IDirect3DRMFrame2* iface,
+                                                            D3DRMFRAMEMOVECALLBACK cb, VOID *arg)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, cb, arg);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_AddTransform(IDirect3DRMFrame2* iface,
+                                                         D3DRMCOMBINETYPE type,
+                                                         D3DRMMATRIX4D matrix)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    TRACE("(%p/%p)->(%u,%p)\n", iface, This, type, matrix);
+
+    return IDirect3DRMFrame3_AddTransform(&This->IDirect3DRMFrame3_iface, type, matrix);
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_AddTranslation(IDirect3DRMFrame2* iface,
+                                                           D3DRMCOMBINETYPE type,
+                                                           D3DVALUE x, D3DVALUE y, D3DVALUE z)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(%u,%f,%f,%f): stub\n", iface, This, type, x, y, z);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_AddScale(IDirect3DRMFrame2* iface,
+                                                     D3DRMCOMBINETYPE type,
+                                                     D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(%u,%f,%f,%f): stub\n", iface, This, type, sx, sy, sz);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_AddRotation(IDirect3DRMFrame2* iface,
+                                                        D3DRMCOMBINETYPE type,
+                                                        D3DVALUE x, D3DVALUE y, D3DVALUE z,
+                                                        D3DVALUE theta)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(%u,%f,%f,%f,%f): stub\n", iface, This, type, x, y, z, theta);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_AddVisual(IDirect3DRMFrame2* iface,
+                                                      LPDIRECT3DRMVISUAL vis)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    TRACE("(%p/%p)->(%p)\n", iface, This, vis);
+
+    return IDirect3DRMFrame3_AddVisual(&This->IDirect3DRMFrame3_iface, (LPUNKNOWN)vis);
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_GetChildren(IDirect3DRMFrame2* iface,
+                                                        LPDIRECT3DRMFRAMEARRAY *children)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    TRACE("(%p/%p)->(%p)\n", iface, This, children);
+
+    return IDirect3DRMFrame3_GetChildren(&This->IDirect3DRMFrame3_iface, children);
+}
+
+static D3DCOLOR WINAPI IDirect3DRMFrame2Impl_GetColor(IDirect3DRMFrame2* iface)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(): stub\n", iface, This);
+
+    return 0;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_GetLights(IDirect3DRMFrame2* iface,
+                                                      LPDIRECT3DRMLIGHTARRAY *lights)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    TRACE("(%p/%p)->(%p)\n", iface, This, lights);
+
+    return IDirect3DRMFrame3_GetLights(&This->IDirect3DRMFrame3_iface, lights);
+}
+
+static D3DRMMATERIALMODE WINAPI IDirect3DRMFrame2Impl_GetMaterialMode(IDirect3DRMFrame2* iface)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(): stub\n", iface, This);
+
+    return D3DRMMATERIAL_FROMPARENT;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_GetParent(IDirect3DRMFrame2* iface,
+                                                      LPDIRECT3DRMFRAME * frame)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    TRACE("(%p/%p)->(%p)\n", iface, This, frame);
+
+    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,
+                                                        LPDIRECT3DRMFRAME reference,
+                                                        LPD3DVECTOR return_position)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, reference, return_position);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_GetRotation(IDirect3DRMFrame2* iface,
+                                                        LPDIRECT3DRMFRAME reference,
+                                                        LPD3DVECTOR axis, LPD3DVALUE return_theta)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, reference, axis, return_theta);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_GetScene(IDirect3DRMFrame2* iface,
+                                                     LPDIRECT3DRMFRAME * frame)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
+
+    return E_NOTIMPL;
+}
+
+static D3DRMSORTMODE WINAPI IDirect3DRMFrame2Impl_GetSortMode(IDirect3DRMFrame2* iface)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(): stub\n", iface, This);
+
+    return D3DRMSORT_FROMPARENT;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_GetTexture(IDirect3DRMFrame2* iface,
+                                                       LPDIRECT3DRMTEXTURE * tex)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(%p): stub\n", iface, This, tex);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_GetTransform(IDirect3DRMFrame2* iface,
+                                                         D3DRMMATRIX4D return_matrix)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    TRACE("(%p/%p)->(%p)\n", iface, This, return_matrix);
+
+    memcpy(&return_matrix[0][0], &This->transform[0][0], sizeof(D3DRMMATRIX4D));
+
+    return D3DRM_OK;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_GetVelocity(IDirect3DRMFrame2* iface,
+                                                        LPDIRECT3DRMFRAME reference,
+                                                        LPD3DVECTOR return_velocity,
+                                                        BOOL with_rotation)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(%p,%p,%d): stub\n", iface, This, reference, return_velocity, with_rotation);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_GetOrientation(IDirect3DRMFrame2* iface,
+                                                           LPDIRECT3DRMFRAME reference,
+                                                           LPD3DVECTOR dir, LPD3DVECTOR up)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+
+    FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, reference, dir, up);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IDirect3DRMFrame2Impl_GetVisuals(IDirect3DRMFrame2* iface,
+                                                       LPDIRECT3DRMVISUALARRAY *visuals)
+{
+    IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
+    IDirect3DRMVisualArrayImpl* obj;
+    HRESULT hr;
+
+    TRACE("(%p/%p)->(%p)\n", iface, This, visuals);
+
+    if (!visuals)
+        return D3DRMERR_BADVALUE;
+
+    hr = Direct3DRMVisualArray_create(visuals);
+
+    if (hr != D3DRM_OK)
+        return hr;
 
     obj = (IDirect3DRMVisualArrayImpl*)*visuals;
 
@@ -2344,359 +2696,3 @@ HRESULT Direct3DRMFrame_create(REFIID riid, IUnknown* parent, IUnknown** ret_ifa
 
     return S_OK;
 }
-
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirect3DRMFrameArrayImpl_QueryInterface(IDirect3DRMFrameArray* iface,
-                                                               REFIID riid, void** object)
-{
-    IDirect3DRMFrameArrayImpl *This = (IDirect3DRMFrameArrayImpl*)iface;
-
-    TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), object);
-
-    *object = NULL;
-
-    if (IsEqualGUID(riid, &IID_IUnknown) ||
-        IsEqualGUID(riid, &IID_IDirect3DRMFrameArray))
-    {
-        *object = &This->IDirect3DRMFrameArray_iface;
-    }
-    else
-    {
-        FIXME("interface %s not implemented\n", debugstr_guid(riid));
-        return E_NOINTERFACE;
-    }
-
-    IDirect3DRMFrameArray_AddRef(iface);
-    return S_OK;
-}
-
-static ULONG WINAPI IDirect3DRMFrameArrayImpl_AddRef(IDirect3DRMFrameArray* iface)
-{
-    IDirect3DRMFrameArrayImpl *This = (IDirect3DRMFrameArrayImpl*)iface;
-    ULONG ref = InterlockedIncrement(&This->ref);
-
-    TRACE("(%p)->(): new ref = %u\n", This, ref);
-
-    return ref;
-}
-
-static ULONG WINAPI IDirect3DRMFrameArrayImpl_Release(IDirect3DRMFrameArray* iface)
-{
-    IDirect3DRMFrameArrayImpl *This = (IDirect3DRMFrameArrayImpl*)iface;
-    ULONG ref = InterlockedDecrement(&This->ref);
-    ULONG i;
-
-    TRACE("(%p)->(): new ref = %u\n", This, ref);
-
-    if (!ref)
-    {
-        for (i = 0; i < This->size; i++)
-            IDirect3DRMFrame_Release(This->frames[i]);
-        HeapFree(GetProcessHeap(), 0, This->frames);
-        HeapFree(GetProcessHeap(), 0, This);
-    }
-
-    return ref;
-}
-
-/*** IDirect3DRMArray methods ***/
-static DWORD WINAPI IDirect3DRMFrameArrayImpl_GetSize(IDirect3DRMFrameArray* iface)
-{
-    IDirect3DRMFrameArrayImpl *This = (IDirect3DRMFrameArrayImpl*)iface;
-
-    TRACE("(%p)->() = %d\n", This,  This->size);
-
-    return This->size;
-}
-
-/*** IDirect3DRMFrameArray methods ***/
-static HRESULT WINAPI IDirect3DRMFrameArrayImpl_GetElement(IDirect3DRMFrameArray* iface, DWORD index, LPDIRECT3DRMFRAME* frame)
-{
-    IDirect3DRMFrameArrayImpl *This = (IDirect3DRMFrameArrayImpl*)iface;
-
-    TRACE("(%p)->(%u, %p)\n", This, index, frame);
-
-    if (!frame)
-        return D3DRMERR_BADVALUE;
-
-    *frame = NULL;
-
-    if (index >= This->size)
-        return D3DRMERR_BADVALUE;
-
-    IDirect3DRMFrame_AddRef(This->frames[index]);
-    *frame = This->frames[index];
-
-    return D3DRM_OK;
-}
-
-static const struct IDirect3DRMFrameArrayVtbl Direct3DRMFrameArray_Vtbl =
-{
-    /*** IUnknown methods ***/
-    IDirect3DRMFrameArrayImpl_QueryInterface,
-    IDirect3DRMFrameArrayImpl_AddRef,
-    IDirect3DRMFrameArrayImpl_Release,
-    /*** IDirect3DRMArray methods ***/
-    IDirect3DRMFrameArrayImpl_GetSize,
-    /*** IDirect3DRMFrameArray methods ***/
-    IDirect3DRMFrameArrayImpl_GetElement
-};
-
-HRESULT Direct3DRMFrameArray_create(IDirect3DRMFrameArray** obj)
-{
-    IDirect3DRMFrameArrayImpl* object;
-
-    TRACE("(%p)\n", obj);
-
-    *obj = NULL;
-
-    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMFrameArrayImpl));
-    if (!object)
-    {
-        ERR("Out of memory\n");
-        return E_OUTOFMEMORY;
-    }
-
-    object->IDirect3DRMFrameArray_iface.lpVtbl = &Direct3DRMFrameArray_Vtbl;
-    object->ref = 1;
-
-    *obj = &object->IDirect3DRMFrameArray_iface;
-
-    return S_OK;
-}
-
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirect3DRMVisualArrayImpl_QueryInterface(IDirect3DRMVisualArray* iface,
-                                                                REFIID riid, void** ret_iface)
-{
-    TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ret_iface);
-
-    if (IsEqualGUID(riid, &IID_IUnknown) ||
-        IsEqualGUID(riid, &IID_IDirect3DRMFrameArray))
-    {
-        *ret_iface = iface;
-        IDirect3DRMVisualArray_AddRef(iface);
-        return S_OK;
-    }
-
-    *ret_iface = NULL;
-
-    WARN("Interface %s not implemented\n", debugstr_guid(riid));
-
-    return E_NOINTERFACE;
-}
-
-static ULONG WINAPI IDirect3DRMVisualArrayImpl_AddRef(IDirect3DRMVisualArray* iface)
-{
-    IDirect3DRMVisualArrayImpl *This = (IDirect3DRMVisualArrayImpl*)iface;
-    ULONG ref = InterlockedIncrement(&This->ref);
-
-    TRACE("(%p)->(): new ref = %u\n", iface, ref);
-
-    return ref;
-}
-
-static ULONG WINAPI IDirect3DRMVisualArrayImpl_Release(IDirect3DRMVisualArray* iface)
-{
-    IDirect3DRMVisualArrayImpl *This = (IDirect3DRMVisualArrayImpl*)iface;
-    ULONG ref = InterlockedDecrement(&This->ref);
-    ULONG i;
-
-    TRACE("(%p)->(): new ref = %u\n", iface, ref);
-
-    if (!ref)
-    {
-        for (i = 0; i < This->size; i++)
-            IDirect3DRMVisual_Release(This->visuals[i]);
-        HeapFree(GetProcessHeap(), 0, This->visuals);
-        HeapFree(GetProcessHeap(), 0, This);
-    }
-
-    return ref;
-}
-
-/*** IDirect3DRMArray methods ***/
-static DWORD WINAPI IDirect3DRMVisualArrayImpl_GetSize(IDirect3DRMVisualArray* iface)
-{
-    IDirect3DRMVisualArrayImpl *This = (IDirect3DRMVisualArrayImpl*)iface;
-
-    TRACE("(%p)->() = %d\n", iface,  This->size);
-
-    return This->size;
-}
-
-/*** IDirect3DRMVisualArray methods ***/
-static HRESULT WINAPI IDirect3DRMVisualArrayImpl_GetElement(IDirect3DRMVisualArray* iface, DWORD index, LPDIRECT3DRMVISUAL* visual)
-{
-    IDirect3DRMVisualArrayImpl *This = (IDirect3DRMVisualArrayImpl*)iface;
-
-    TRACE("(%p)->(%u, %p)\n", iface, index, visual);
-
-    if (!visual)
-        return D3DRMERR_BADVALUE;
-
-    *visual = NULL;
-
-    if (index >= This->size)
-        return D3DRMERR_BADVALUE;
-
-    IDirect3DRMVisual_AddRef(This->visuals[index]);
-    *visual = This->visuals[index];
-
-    return D3DRM_OK;
-}
-
-static const struct IDirect3DRMVisualArrayVtbl Direct3DRMVisualArray_Vtbl =
-{
-    /*** IUnknown methods ***/
-    IDirect3DRMVisualArrayImpl_QueryInterface,
-    IDirect3DRMVisualArrayImpl_AddRef,
-    IDirect3DRMVisualArrayImpl_Release,
-    /*** IDirect3DRMArray methods ***/
-    IDirect3DRMVisualArrayImpl_GetSize,
-    /*** IDirect3DRMVisualArray methods ***/
-    IDirect3DRMVisualArrayImpl_GetElement
-};
-
-HRESULT Direct3DRMVisualArray_create(IDirect3DRMVisualArray** ret_iface)
-{
-    IDirect3DRMVisualArrayImpl* object;
-
-    TRACE("(%p)\n", ret_iface);
-
-    *ret_iface = NULL;
-
-    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMVisualArrayImpl));
-    if (!object)
-    {
-        ERR("Out of memory\n");
-        return E_OUTOFMEMORY;
-    }
-
-    object->IDirect3DRMVisualArray_iface.lpVtbl = &Direct3DRMVisualArray_Vtbl;
-    object->ref = 1;
-
-    *ret_iface = &object->IDirect3DRMVisualArray_iface;
-
-    return S_OK;
-}
-
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirect3DRMLightArrayImpl_QueryInterface(IDirect3DRMLightArray* iface,
-                                                               REFIID riid, void** object)
-{
-    IDirect3DRMLightArrayImpl *This = impl_from_IDirect3DRMLightArray(iface);
-
-    TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), object);
-
-    *object = NULL;
-
-    if (IsEqualGUID(riid, &IID_IUnknown) ||
-        IsEqualGUID(riid, &IID_IDirect3DRMLightArray))
-    {
-        *object = &This->IDirect3DRMLightArray_iface;
-    }
-    else
-    {
-        FIXME("interface %s not implemented\n", debugstr_guid(riid));
-        return E_NOINTERFACE;
-    }
-
-    IDirect3DRMLightArray_AddRef(iface);
-    return S_OK;
-}
-
-static ULONG WINAPI IDirect3DRMLightArrayImpl_AddRef(IDirect3DRMLightArray* iface)
-{
-    IDirect3DRMLightArrayImpl *This = impl_from_IDirect3DRMLightArray(iface);
-    ULONG ref = InterlockedIncrement(&This->ref);
-
-    TRACE("(%p)->(): new ref = %u\n", This, ref);
-
-    return ref;
-}
-
-static ULONG WINAPI IDirect3DRMLightArrayImpl_Release(IDirect3DRMLightArray* iface)
-{
-    IDirect3DRMLightArrayImpl *This = impl_from_IDirect3DRMLightArray(iface);
-    ULONG ref = InterlockedDecrement(&This->ref);
-    ULONG i;
-
-    TRACE("(%p)->(): new ref = %u\n", This, ref);
-
-    if (!ref)
-    {
-        for (i = 0; i < This->size; i++)
-            IDirect3DRMLight_Release(This->lights[i]);
-        HeapFree(GetProcessHeap(), 0, This->lights);
-        HeapFree(GetProcessHeap(), 0, This);
-    }
-
-    return ref;
-}
-
-/*** IDirect3DRMArray methods ***/
-static DWORD WINAPI IDirect3DRMLightArrayImpl_GetSize(IDirect3DRMLightArray* iface)
-{
-    IDirect3DRMLightArrayImpl *This = impl_from_IDirect3DRMLightArray(iface);
-
-    TRACE("(%p)->() = %d\n", This,  This->size);
-
-    return This->size;
-}
-
-/*** IDirect3DRMLightArray methods ***/
-static HRESULT WINAPI IDirect3DRMLightArrayImpl_GetElement(IDirect3DRMLightArray* iface, DWORD index, LPDIRECT3DRMLIGHT* light)
-{
-    IDirect3DRMLightArrayImpl *This = impl_from_IDirect3DRMLightArray(iface);
-
-    TRACE("(%p)->(%u, %p)\n", This, index, light);
-
-    if (!light)
-        return D3DRMERR_BADVALUE;
-
-    *light = NULL;
-
-    if (index >= This->size)
-        return D3DRMERR_BADVALUE;
-
-    IDirect3DRMLight_AddRef(This->lights[index]);
-    *light = This->lights[index];
-
-    return D3DRM_OK;
-}
-
-static const struct IDirect3DRMLightArrayVtbl Direct3DRMLightArray_Vtbl =
-{
-    /*** IUnknown methods ***/
-    IDirect3DRMLightArrayImpl_QueryInterface,
-    IDirect3DRMLightArrayImpl_AddRef,
-    IDirect3DRMLightArrayImpl_Release,
-    /*** IDirect3DRMArray methods ***/
-    IDirect3DRMLightArrayImpl_GetSize,
-    /*** IDirect3DRMLightArray methods ***/
-    IDirect3DRMLightArrayImpl_GetElement
-};
-
-HRESULT Direct3DRMLightArray_create(IDirect3DRMLightArray** obj)
-{
-    IDirect3DRMLightArrayImpl* object;
-
-    TRACE("(%p)\n", obj);
-
-    *obj = NULL;
-
-    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMLightArrayImpl));
-    if (!object)
-    {
-        ERR("Out of memory\n");
-        return E_OUTOFMEMORY;
-    }
-
-    object->IDirect3DRMLightArray_iface.lpVtbl = &Direct3DRMLightArray_Vtbl;
-    object->ref = 1;
-
-    *obj = &object->IDirect3DRMLightArray_iface;
-
-    return S_OK;
-}
-- 
1.7.10




More information about the wine-patches mailing list