Aaryaman Vasishta : d3drm: Use a table in d3drm3_CreateObject() to create objects in a generic manner.
Module: wine Branch: master Commit: 94bab100a4fe6b99c5accdf161f638d1f2419903 URL: http://source.winehq.org/git/wine.git/?a=commit;h=94bab100a4fe6b99c5accdf161... Author: Aaryaman Vasishta <jem456.vasishta(a)gmail.com> Date: Wed Jun 29 15:39:01 2016 +0200 d3drm: Use a table in d3drm3_CreateObject() to create objects in a generic manner. Signed-off-by: Aaryaman Vasishta <jem456.vasishta(a)gmail.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/d3drm/d3drm.c | 40 +++++++++++++++++++++++++++++++++------- dlls/d3drm/d3drm_private.h | 4 ++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c index 8d054b5..7fcb0ba 100644 --- a/dlls/d3drm/d3drm.c +++ b/dlls/d3drm/d3drm.c @@ -51,6 +51,19 @@ static const char* get_IID_string(const GUID* guid) return "?"; } +static HRESULT d3drm_create_texture_object(void **object, IDirect3DRM *d3drm) +{ + struct d3drm_texture *texture; + HRESULT hr; + + if (FAILED(hr = d3drm_texture_create(&texture, d3drm))) + return hr; + + *object = &texture->IDirect3DRMTexture_iface; + + return hr; +} + struct d3drm { IDirect3DRM IDirect3DRM_iface; @@ -1106,8 +1119,19 @@ static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface, { struct d3drm *d3drm = impl_from_IDirect3DRM3(iface); IUnknown *object; + unsigned int i; HRESULT hr; + static const struct + { + const CLSID *clsid; + HRESULT (*create_object)(void **object, IDirect3DRM *d3drm); + } + object_table[] = + { + {&CLSID_CDirect3DRMTexture, d3drm_create_texture_object}, + }; + TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n", iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out); @@ -1127,17 +1151,19 @@ static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface, return E_NOTIMPL; } - if (IsEqualGUID(clsid, &CLSID_CDirect3DRMTexture)) + for (i = 0; i < ARRAY_SIZE(object_table); ++i) { - struct d3drm_texture *texture; - if (FAILED(hr = d3drm_texture_create(&texture, &d3drm->IDirect3DRM_iface))) + if (IsEqualGUID(clsid, object_table[i].clsid)) { - *out = NULL; - return hr; + if (FAILED(hr = object_table[i].create_object((void **)&object, &d3drm->IDirect3DRM_iface))) + { + *out = NULL; + return hr; + } + break; } - object = (IUnknown *)&texture->IDirect3DRMTexture3_iface; } - else + if (i == ARRAY_SIZE(object_table)) { FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid)); *out = NULL; diff --git a/dlls/d3drm/d3drm_private.h b/dlls/d3drm/d3drm_private.h index 06cbdc1..651eaec 100644 --- a/dlls/d3drm/d3drm_private.h +++ b/dlls/d3drm/d3drm_private.h @@ -26,6 +26,10 @@ #include "wine/list.h" +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a))) +#endif + struct d3drm_device; struct d3drm_object {
participants (1)
-
Alexandre Julliard