Christian Costa : d3dxof: Finish support for multi-dimensional array.

Alexandre Julliard julliard at winehq.org
Mon Nov 24 09:16:38 CST 2008


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

Author: Christian Costa <titan.costa at wanadoo.fr>
Date:   Sun Nov 23 21:31:13 2008 +0100

d3dxof: Finish support for multi-dimensional array.

---

 dlls/d3dxof/d3dxof.c         |   34 +++++++++++++++-------------------
 dlls/d3dxof/d3dxof_private.h |    2 +-
 2 files changed, 16 insertions(+), 20 deletions(-)

diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c
index 3093fb3..5f471b1 100644
--- a/dlls/d3dxof/d3dxof.c
+++ b/dlls/d3dxof/d3dxof.c
@@ -1100,6 +1100,11 @@ static BOOL parse_template_members_list(parse_buffer * buf)
     {
       while (check_TOKEN(buf) == TOKEN_OBRACKET)
       {
+        if (nb_dims >= MAX_ARRAY_DIM)
+        {
+          FIXME("Too many dimensions (%d) for multi-dimensional array\n", nb_dims + 1);
+          return FALSE;
+        }
         get_TOKEN(buf);
         if (check_TOKEN(buf) == TOKEN_INTEGER)
         {
@@ -1842,29 +1847,20 @@ static BOOL parse_object_members_list(parse_buffer * buf)
 
   for (i = 0; i < pt->nb_members; i++)
   {
-    int nb_elems, k;
+    int k;
+    int nb_elems = 1;
 
-    if (pt->members[i].nb_dims > 1)
-    {
-      FIXME("Arrays with dimension > 1 not yet supported\n");
-      return FALSE;
-    }
-    else if (pt->members[i].nb_dims)
+    buf->pxo->members[i].start = buf->cur_pdata;
+
+    for (k = 0; k < pt->members[i].nb_dims; k++)
     {
-      if (!pt->members[i].dim_fixed[0])
-      {
-        if (!i)
-        {
-          FIXME("Array with variable must be preceded by the size\n");
-          return FALSE;
-        }
-        nb_elems = last_dword;
-      }
+      if (pt->members[i].dim_fixed[k])
+        nb_elems *= pt->members[i].dim_value[k];
       else
-        nb_elems = pt->members[i].dim_value[0];
+        nb_elems *= *(DWORD*)buf->pxo->members[pt->members[i].dim_value[k]].start;
     }
-    else
-      nb_elems = 1;
+
+    TRACE("Elements to consider: %d\n", nb_elems);
 
     for (k = 0; k < nb_elems; k++)
     {
diff --git a/dlls/d3dxof/d3dxof_private.h b/dlls/d3dxof/d3dxof_private.h
index 1789dc7..b2f5b41 100644
--- a/dlls/d3dxof/d3dxof_private.h
+++ b/dlls/d3dxof/d3dxof_private.h
@@ -34,7 +34,7 @@
 #include "dxfile.h"
 
 #define MAX_NAME_LEN 32
-#define MAX_ARRAY_DIM 1
+#define MAX_ARRAY_DIM 4
 #define MAX_MEMBERS 50
 #define MAX_CHILDS 20
 #define MAX_TEMPLATES 200




More information about the wine-cvs mailing list