Module: wine Branch: master Commit: 40fff317ea1fbb4a012bf6d96a07ed37b5366990 URL: http://source.winehq.org/git/wine.git/?a=commit;h=40fff317ea1fbb4a012bf6d96a...
Author: Christian Costa titan.costa@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