From: Nikolay Sivov Subject: [PATCH 2/2] d3drm: Added IDirect3DRMWrap stub Message-Id: <20170623131501.19966-2-nsivov@codeweavers.com> Date: Fri, 23 Jun 2017 16:15:01 +0300 In-Reply-To: <20170623131501.19966-1-nsivov@codeweavers.com> References: <20170623131501.19966-1-nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov --- dlls/d3drm/d3drm.c | 54 +++++++++++-- dlls/d3drm/d3drm_private.h | 7 ++ dlls/d3drm/meshbuilder.c | 190 +++++++++++++++++++++++++++++++++++++++++++++ dlls/d3drm/tests/d3drm.c | 26 ++++++- 4 files changed, 267 insertions(+), 10 deletions(-) diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c index 487a044896..3bc2f6993d 100644 --- a/dlls/d3drm/d3drm.c +++ b/dlls/d3drm/d3drm.c @@ -175,6 +175,19 @@ static HRESULT d3drm_create_animation_object(void **object, IDirect3DRM *d3drm) return hr; } +static HRESULT d3drm_create_wrap_object(void **object, IDirect3DRM *d3drm) +{ + struct d3drm_wrap *wrap; + HRESULT hr; + + if (FAILED(hr = d3drm_wrap_create(&wrap, d3drm))) + return hr; + + *object = &wrap->IDirect3DRMWrap_iface; + + return hr; +} + struct d3drm { IDirect3DRM IDirect3DRM_iface; @@ -593,11 +606,22 @@ static HRESULT WINAPI d3drm1_CreateWrap(IDirect3DRM *iface, D3DRMWRAPTYPE type, D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv, IDirect3DRMWrap **wrap) { + struct d3drm_wrap *object; + HRESULT hr; + FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, " - "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n", + "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p, semi-stub.\n", iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap); - return E_NOTIMPL; + if (!wrap) + return D3DRMERR_BADVALUE; + + if (FAILED(hr = d3drm_wrap_create(&object, iface))) + return hr; + + *wrap = &object->IDirect3DRMWrap_iface; + + return S_OK; } static HRESULT WINAPI d3drm1_CreateUserVisual(IDirect3DRM *iface, @@ -1097,11 +1121,14 @@ static HRESULT WINAPI d3drm2_CreateWrap(IDirect3DRM2 *iface, D3DRMWRAPTYPE type, D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv, IDirect3DRMWrap **wrap) { - FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, " - "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n", + struct d3drm *d3drm = impl_from_IDirect3DRM2(iface); + + TRACE("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, " + "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p.\n", iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap); - return E_NOTIMPL; + return IDirect3DRM_CreateWrap(&d3drm->IDirect3DRM_iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, + ou, ov, su, sv, wrap); } static HRESULT WINAPI d3drm2_CreateUserVisual(IDirect3DRM2 *iface, @@ -1340,6 +1367,7 @@ static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface, {&CLSID_CDirect3DRMMaterial, d3drm_create_material_object}, {&CLSID_CDirect3DRMMesh, d3drm_create_mesh_object}, {&CLSID_CDirect3DRMAnimation, d3drm_create_animation_object}, + {&CLSID_CDirect3DRMWrap, d3drm_create_wrap_object}, }; TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n", @@ -1756,11 +1784,23 @@ static HRESULT WINAPI d3drm3_CreateWrap(IDirect3DRM3 *iface, D3DRMWRAPTYPE type, D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv, IDirect3DRMWrap **wrap) { + struct d3drm *d3drm = impl_from_IDirect3DRM3(iface); + struct d3drm_wrap *object; + HRESULT hr; + FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, " - "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n", + "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p, semi-stub.\n", iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap); - return E_NOTIMPL; + if (!wrap) + return D3DRMERR_BADVALUE; + + if (FAILED(hr = d3drm_wrap_create(&object, &d3drm->IDirect3DRM_iface))) + return hr; + + *wrap = &object->IDirect3DRMWrap_iface; + + return S_OK; } static HRESULT WINAPI d3drm3_CreateUserVisual(IDirect3DRM3 *iface, diff --git a/dlls/d3drm/d3drm_private.h b/dlls/d3drm/d3drm_private.h index 3dad93bc4c..f2a613167e 100644 --- a/dlls/d3drm/d3drm_private.h +++ b/dlls/d3drm/d3drm_private.h @@ -215,6 +215,12 @@ struct d3drm_animation IDirect3DRM *d3drm; }; +struct d3drm_wrap +{ + struct d3drm_object obj; + IDirect3DRMWrap IDirect3DRMWrap_iface; + LONG ref; +}; HRESULT d3drm_device_create(struct d3drm_device **device, IDirect3DRM *d3drm) DECLSPEC_HIDDEN; HRESULT d3drm_device_create_surfaces_from_clipper(struct d3drm_device *object, IDirectDraw *ddraw, @@ -243,6 +249,7 @@ HRESULT d3drm_light_create(struct d3drm_light **light, IDirect3DRM *d3drm) DECLS HRESULT d3drm_material_create(struct d3drm_material **material, IDirect3DRM *d3drm) DECLSPEC_HIDDEN; HRESULT d3drm_mesh_create(struct d3drm_mesh **mesh, IDirect3DRM *d3drm) DECLSPEC_HIDDEN; HRESULT d3drm_animation_create(struct d3drm_animation **animation, IDirect3DRM *d3drm) DECLSPEC_HIDDEN; +HRESULT d3drm_wrap_create(struct d3drm_wrap **wrap, IDirect3DRM *d3drm) DECLSPEC_HIDDEN; HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *data, D3DRMLOADTEXTURECALLBACK load_texture_proc, void *arg) DECLSPEC_HIDDEN; diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c index 4f6c7602c8..2e554ebb8b 100644 --- a/dlls/d3drm/meshbuilder.c +++ b/dlls/d3drm/meshbuilder.c @@ -307,6 +307,11 @@ static inline struct d3drm_mesh_builder *impl_from_IDirect3DRMMeshBuilder3(IDire return CONTAINING_RECORD(iface, struct d3drm_mesh_builder, IDirect3DRMMeshBuilder3_iface); } +static inline struct d3drm_wrap *impl_from_IDirect3DRMWrap(IDirect3DRMWrap *iface) +{ + return CONTAINING_RECORD(iface, struct d3drm_wrap, IDirect3DRMWrap_iface); +} + static void clean_mesh_builder_data(struct d3drm_mesh_builder *mesh_builder) { DWORD i; @@ -2878,3 +2883,188 @@ HRESULT d3drm_mesh_create(struct d3drm_mesh **mesh, IDirect3DRM *d3drm) return S_OK; } + +static HRESULT WINAPI d3drm_wrap_QueryInterface(IDirect3DRMWrap *iface, REFIID riid, void **out) +{ + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); + + if (IsEqualGUID(riid, &IID_IDirect3DRMWrap) + || IsEqualGUID(riid, &IID_IDirect3DRMObject) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IDirect3DRMWrap_AddRef(iface); + *out = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3drm_wrap_AddRef(IDirect3DRMWrap *iface) +{ + struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface); + ULONG refcount = InterlockedIncrement(&wrap->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + return refcount; +} + +static ULONG WINAPI d3drm_wrap_Release(IDirect3DRMWrap *iface) +{ + struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface); + ULONG refcount = InterlockedDecrement(&wrap->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + d3drm_object_cleanup((IDirect3DRMObject *)iface, &wrap->obj); + //IDirect3DRM_Release(mesh->d3drm); + HeapFree(GetProcessHeap(), 0, wrap); + } + + return refcount; +} + +static HRESULT WINAPI d3drm_wrap_Clone(IDirect3DRMWrap *iface, + IUnknown *outer, REFIID iid, void **out) +{ + FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_wrap_AddDestroyCallback(IDirect3DRMWrap *iface, + D3DRMOBJECTCALLBACK cb, void *ctx) +{ + struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface); + + TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx); + + return d3drm_object_add_destroy_callback(&wrap->obj, cb, ctx); +} + +static HRESULT WINAPI d3drm_wrap_DeleteDestroyCallback(IDirect3DRMWrap *iface, + D3DRMOBJECTCALLBACK cb, void *ctx) +{ + struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface); + + TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx); + + return d3drm_object_delete_destroy_callback(&wrap->obj, cb, ctx); +} + +static HRESULT WINAPI d3drm_wrap_SetAppData(IDirect3DRMWrap *iface, DWORD data) +{ + struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface); + + TRACE("iface %p, data %#x.\n", iface, data); + + wrap->obj.appdata = data; + + return D3DRM_OK; +} + +static DWORD WINAPI d3drm_wrap_GetAppData(IDirect3DRMWrap *iface) +{ + struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface); + + TRACE("iface %p.\n", iface); + + return wrap->obj.appdata; +} + +static HRESULT WINAPI d3drm_wrap_SetName(IDirect3DRMWrap *iface, const char *name) +{ + struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface); + + TRACE("iface %p, name %s.\n", iface, debugstr_a(name)); + + return d3drm_object_set_name(&wrap->obj, name); +} + +static HRESULT WINAPI d3drm_wrap_GetName(IDirect3DRMWrap *iface, DWORD *size, char *name) +{ + struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface); + + TRACE("iface %p, size %p, name %p.\n", iface, size, name); + + return d3drm_object_get_name(&wrap->obj, size, name); +} + +static HRESULT WINAPI d3drm_wrap_GetClassName(IDirect3DRMWrap *iface, DWORD *size, char *name) +{ + struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface); + + TRACE("iface %p, size %p, name %p.\n", iface, size, name); + + return d3drm_object_get_class_name(&wrap->obj, size, name); +} + +static HRESULT WINAPI d3drm_wrap_Init(IDirect3DRMWrap *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *reference, + D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, D3DVALUE ux, + D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv) +{ + FIXME("iface %p, type %d, reference frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, ux %.8e, " + "uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e.\n", iface, type, reference, ox, oy, oz, dx, dy, dz, + ux, uy, uz, ou, ov, su, sv); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_wrap_Apply(IDirect3DRMWrap *iface, IDirect3DRMObject *object) +{ + FIXME("iface %p, object %p.\n", iface, object); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3drm_wrap_ApplyRelative(IDirect3DRMWrap *iface, IDirect3DRMFrame *frame, + IDirect3DRMObject *object) +{ + FIXME("iface %p, frame %p, object %p.\n", iface, frame, object); + + return E_NOTIMPL; +} + +static const struct IDirect3DRMWrapVtbl d3drm_wrap_vtbl = +{ + d3drm_wrap_QueryInterface, + d3drm_wrap_AddRef, + d3drm_wrap_Release, + d3drm_wrap_Clone, + d3drm_wrap_AddDestroyCallback, + d3drm_wrap_DeleteDestroyCallback, + d3drm_wrap_SetAppData, + d3drm_wrap_GetAppData, + d3drm_wrap_SetName, + d3drm_wrap_GetName, + d3drm_wrap_GetClassName, + d3drm_wrap_Init, + d3drm_wrap_Apply, + d3drm_wrap_ApplyRelative, +}; + +HRESULT d3drm_wrap_create(struct d3drm_wrap **wrap, IDirect3DRM *d3drm) +{ + static const char classname[] = ""; + struct d3drm_wrap *object; + + TRACE("wrap %p, d3drm %p.\n", wrap, d3drm); + + if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) + return E_OUTOFMEMORY; + + object->IDirect3DRMWrap_iface.lpVtbl = &d3drm_wrap_vtbl; + object->ref = 1; + + d3drm_object_init(&object->obj, classname); + + *wrap = object; + + return S_OK; +} diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index ae88d9ee1d..7f008e561e 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -96,8 +96,8 @@ static HWND create_window(void) static void test_class_name_(unsigned int line, IDirect3DRMObject *object, const char *name) { char cname[64] = {0}; + DWORD size, size2; HRESULT hr; - DWORD size; hr = IDirect3DRMObject_GetClassName(object, NULL, cname); ok_(__FILE__, line)(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); @@ -109,10 +109,10 @@ static void test_class_name_(unsigned int line, IDirect3DRMObject *object, const ok_(__FILE__, line)(hr == D3DRM_OK, "Failed to get classname size, hr %#x.\n", hr); ok_(__FILE__, line)(size == strlen(name) + 1, "wrong size: %u\n", size); - size = 1; + size = size2 = *name ? 1 : 0; hr = IDirect3DRMObject_GetClassName(object, &size, cname); ok_(__FILE__, line)(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); - ok_(__FILE__, line)(size == 1, "Got size %u.\n", size); + ok_(__FILE__, line)(size == size2, "Got size %u.\n", size); size = sizeof(cname); hr = IDirect3DRMObject_GetClassName(object, &size, cname); @@ -1490,6 +1490,7 @@ static void test_object(void) { &CLSID_CDirect3DRMMesh, &IID_IDirect3DRMMesh, TRUE }, { &CLSID_CDirect3DRMAnimation, &IID_IDirect3DRMAnimation, TRUE }, { &CLSID_CDirect3DRMAnimation, &IID_IDirect3DRMAnimation2, TRUE }, + { &CLSID_CDirect3DRMWrap, &IID_IDirect3DRMWrap }, }; IDirect3DRM *d3drm1; IDirect3DRM2 *d3drm2; @@ -6743,6 +6744,24 @@ static void test_animation(void) IDirect3DRM_Release(d3drm1); } +static void test_wrap(void) +{ + IDirect3DRMWrap *wrap; + IDirect3DRM *d3drm1; + HRESULT hr; + + hr = Direct3DRMCreate(&d3drm1); + ok(SUCCEEDED(hr), "Failed to create IDirect3DRM instance, hr %#x.\n", hr); + + hr = IDirect3DRM_CreateObject(d3drm1, &CLSID_CDirect3DRMWrap, NULL, &IID_IDirect3DRMWrap, (void **)&wrap); + ok(SUCCEEDED(hr), "Failed to create wrap instance, hr %#x.\n", hr); + + test_class_name((IDirect3DRMObject *)wrap, ""); + + IDirect3DRMWrap_Release(wrap); + IDirect3DRM_Release(d3drm1); +} + START_TEST(d3drm) { test_MeshBuilder(); @@ -6778,4 +6797,5 @@ START_TEST(d3drm) test_viewport_clear2(); test_create_texture_from_surface(); test_animation(); + test_wrap(); } -- 2.11.0