Aaryaman Vasishta : d3drm: Use a table in d3drm3_CreateObject() to create objects in a generic manner.

Alexandre Julliard julliard at winehq.org
Sun Jul 3 12:18:27 CDT 2016


Module: wine
Branch: master
Commit: 94bab100a4fe6b99c5accdf161f638d1f2419903
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=94bab100a4fe6b99c5accdf161f638d1f2419903

Author: Aaryaman Vasishta <jem456.vasishta at 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 at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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
 {




More information about the wine-cvs mailing list