[PATCH 3/5] d3drm: Fix frame object creation method. (v3 resend)

Aaryaman Vasishta jem456.vasishta at gmail.com
Sat Jun 18 17:29:09 CDT 2016


Signed-off-by: Aaryaman Vasishta <jem456.vasishta at gmail.com>
---
 dlls/d3drm/d3drm.c         | 32 +++++++++++++++++++++++++++++---
 dlls/d3drm/d3drm_private.h | 23 ++++++++++++++++++++++-
 dlls/d3drm/frame.c         | 37 +++++++++----------------------------
 3 files changed, 60 insertions(+), 32 deletions(-)

diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c
index 14fed3a..4f1f840 100644
--- a/dlls/d3drm/d3drm.c
+++ b/dlls/d3drm/d3drm.c
@@ -150,9 +150,17 @@ static HRESULT WINAPI d3drm1_CreateObject(IDirect3DRM *iface,
 static HRESULT WINAPI d3drm1_CreateFrame(IDirect3DRM *iface,
         IDirect3DRMFrame *parent_frame, IDirect3DRMFrame **frame)
 {
+    struct d3drm_frame *object;
+    HRESULT hr;
+
     TRACE("iface %p, parent_frame %p, frame %p.\n", iface, parent_frame, frame);
 
-    return Direct3DRMFrame_create(&IID_IDirect3DRMFrame, (IUnknown *)parent_frame, (IUnknown **)frame);
+    if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent_frame, iface)))
+        return hr;
+
+    *frame = &object->IDirect3DRMFrame_iface;
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI d3drm1_CreateMesh(IDirect3DRM *iface, IDirect3DRMMesh **mesh)
@@ -624,9 +632,18 @@ static HRESULT WINAPI d3drm2_CreateObject(IDirect3DRM2 *iface,
 static HRESULT WINAPI d3drm2_CreateFrame(IDirect3DRM2 *iface,
         IDirect3DRMFrame *parent_frame, IDirect3DRMFrame2 **frame)
 {
+    struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
+    struct d3drm_frame *object;
+    HRESULT hr;
+
     TRACE("iface %p, parent_frame %p, frame %p.\n", iface, parent_frame, frame);
 
-    return Direct3DRMFrame_create(&IID_IDirect3DRMFrame2, (IUnknown*)parent_frame, (IUnknown**)frame);
+    if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent_frame, &d3drm->IDirect3DRM_iface)))
+        return hr;
+
+    *frame = &object->IDirect3DRMFrame2_iface;
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI d3drm2_CreateMesh(IDirect3DRM2 *iface, IDirect3DRMMesh **mesh)
@@ -1126,9 +1143,18 @@ static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
 static HRESULT WINAPI d3drm3_CreateFrame(IDirect3DRM3 *iface,
         IDirect3DRMFrame3 *parent, IDirect3DRMFrame3 **frame)
 {
+    struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
+    struct d3drm_frame *object;
+    HRESULT hr;
+
     TRACE("iface %p, parent %p, frame %p.\n", iface, parent, frame);
 
-    return Direct3DRMFrame_create(&IID_IDirect3DRMFrame3, (IUnknown *)parent, (IUnknown **)frame);
+    if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent, &d3drm->IDirect3DRM_iface)))
+        return hr;
+
+    *frame = &object->IDirect3DRMFrame3_iface;
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI d3drm3_CreateMesh(IDirect3DRM3 *iface, IDirect3DRMMesh **mesh)
diff --git a/dlls/d3drm/d3drm_private.h b/dlls/d3drm/d3drm_private.h
index 817accf..1f4094b 100644
--- a/dlls/d3drm/d3drm_private.h
+++ b/dlls/d3drm/d3drm_private.h
@@ -44,6 +44,27 @@ struct d3drm_texture
     D3DRMIMAGE *image;
 };
 
+struct d3drm_frame
+{
+    IDirect3DRMFrame IDirect3DRMFrame_iface;
+    IDirect3DRMFrame2 IDirect3DRMFrame2_iface;
+    IDirect3DRMFrame3 IDirect3DRMFrame3_iface;
+    IDirect3DRM *d3drm;
+    LONG ref;
+    struct d3drm_frame *parent;
+    ULONG nb_children;
+    ULONG children_capacity;
+    IDirect3DRMFrame3** children;
+    ULONG nb_visuals;
+    ULONG visuals_capacity;
+    IDirect3DRMVisual** visuals;
+    ULONG nb_lights;
+    ULONG lights_capacity;
+    IDirect3DRMLight** lights;
+    D3DRMMATRIX4D transform;
+    D3DCOLOR scenebackground;
+};
+
 void d3drm_object_init(struct d3drm_object *object) DECLSPEC_HIDDEN;
 HRESULT d3drm_object_add_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx) DECLSPEC_HIDDEN;
 HRESULT d3drm_object_delete_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx) DECLSPEC_HIDDEN;
@@ -51,11 +72,11 @@ void d3drm_object_cleanup(IDirect3DRMObject *iface, struct d3drm_object *object)
 
 HRESULT d3drm_device_create(struct d3drm_device **out) DECLSPEC_HIDDEN;
 HRESULT d3drm_texture_create(struct d3drm_texture **texture, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
+HRESULT d3drm_frame_create(struct d3drm_frame **frame, IUnknown* parent_frame, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
 IDirect3DRMDevice *IDirect3DRMDevice_from_impl(struct d3drm_device *device) DECLSPEC_HIDDEN;
 IDirect3DRMDevice2 *IDirect3DRMDevice2_from_impl(struct d3drm_device *device) DECLSPEC_HIDDEN;
 IDirect3DRMDevice3 *IDirect3DRMDevice3_from_impl(struct d3drm_device *device) DECLSPEC_HIDDEN;
 HRESULT Direct3DRMFace_create(REFIID riid, IUnknown** ret_iface) DECLSPEC_HIDDEN;
-HRESULT Direct3DRMFrame_create(REFIID riid, IUnknown* parent_frame, IUnknown** ret_iface) DECLSPEC_HIDDEN;
 HRESULT Direct3DRMLight_create(IUnknown** ppObj) DECLSPEC_HIDDEN;
 HRESULT Direct3DRMMesh_create(IDirect3DRMMesh** obj) DECLSPEC_HIDDEN;
 HRESULT Direct3DRMMeshBuilder_create(REFIID riid, IUnknown** ppObj) DECLSPEC_HIDDEN;
diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c
index bdc6580..fb42323 100644
--- a/dlls/d3drm/frame.c
+++ b/dlls/d3drm/frame.c
@@ -38,26 +38,6 @@ static D3DRMMATRIX4D identity = {
     { 0.0f, 0.0f, 0.0f, 1.0f }
 };
 
-struct d3drm_frame
-{
-    IDirect3DRMFrame IDirect3DRMFrame_iface;
-    IDirect3DRMFrame2 IDirect3DRMFrame2_iface;
-    IDirect3DRMFrame3 IDirect3DRMFrame3_iface;
-    LONG ref;
-    struct d3drm_frame *parent;
-    ULONG nb_children;
-    ULONG children_capacity;
-    IDirect3DRMFrame3** children;
-    ULONG nb_visuals;
-    ULONG visuals_capacity;
-    IDirect3DRMVisual** visuals;
-    ULONG nb_lights;
-    ULONG lights_capacity;
-    IDirect3DRMLight** lights;
-    D3DRMMATRIX4D transform;
-    D3DCOLOR scenebackground;
-};
-
 struct d3drm_frame_array
 {
     IDirect3DRMFrameArray IDirect3DRMFrameArray_iface;
@@ -2923,12 +2903,12 @@ static inline struct d3drm_frame *unsafe_impl_from_IDirect3DRMFrame(IDirect3DRMF
     return impl_from_IDirect3DRMFrame(iface);
 }
 
-HRESULT Direct3DRMFrame_create(REFIID riid, IUnknown *parent, IUnknown **out)
+HRESULT d3drm_frame_create(struct d3drm_frame **frame, IUnknown* parent_frame, IDirect3DRM *d3drm)
 {
     struct d3drm_frame *object;
-    HRESULT hr;
+    HRESULT hr = D3DRM_OK;
 
-    TRACE("riid %s, parent %p, out %p.\n", debugstr_guid(riid), parent, out);
+    TRACE("out %p, parent_frame %p, d3drm %p.\n", frame, parent_frame, d3drm);
 
     if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
         return E_OUTOFMEMORY;
@@ -2936,26 +2916,27 @@ HRESULT Direct3DRMFrame_create(REFIID riid, IUnknown *parent, IUnknown **out)
     object->IDirect3DRMFrame_iface.lpVtbl = &d3drm_frame1_vtbl;
     object->IDirect3DRMFrame2_iface.lpVtbl = &d3drm_frame2_vtbl;
     object->IDirect3DRMFrame3_iface.lpVtbl = &d3drm_frame3_vtbl;
+    object->d3drm = d3drm;
     object->ref = 1;
     object->scenebackground = RGBA_MAKE(0, 0, 0, 0xff);
 
     memcpy(object->transform, identity, sizeof(D3DRMMATRIX4D));
 
-    if (parent)
+    if (parent_frame)
     {
         IDirect3DRMFrame3 *p;
 
-        hr = IDirect3DRMFrame_QueryInterface(parent, &IID_IDirect3DRMFrame3, (void**)&p);
+        hr = IDirect3DRMFrame_QueryInterface(parent_frame, &IID_IDirect3DRMFrame3, (void**)&p);
         if (hr != S_OK)
         {
             HeapFree(GetProcessHeap(), 0, object);
             return hr;
         }
-        IDirect3DRMFrame_Release(parent);
+        IDirect3DRMFrame_Release(parent_frame);
         IDirect3DRMFrame3_AddChild(p, &object->IDirect3DRMFrame3_iface);
     }
 
-    hr = IDirect3DRMFrame3_QueryInterface(&object->IDirect3DRMFrame3_iface, riid, (void **)out);
-    IDirect3DRMFrame3_Release(&object->IDirect3DRMFrame3_iface);
+    *frame = object;
+
     return hr;
 }
-- 
2.3.2 (Apple Git-55)




More information about the wine-patches mailing list