Module: wine Branch: master Commit: 94bab100a4fe6b99c5accdf161f638d1f2419903 URL: http://source.winehq.org/git/wine.git/?a=commit;h=94bab100a4fe6b99c5accdf161...
Author: Aaryaman Vasishta jem456.vasishta@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@gmail.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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 {