d3dxof: Use offsets to reference data instead of pointers so data buffer can be resized.

oldstable
Christian Costa 2009-03-12 09:06:16 +01:00 committed by Alexandre Julliard
parent fd77bc5f10
commit df48d6f578
3 changed files with 23 additions and 19 deletions

View File

@ -686,7 +686,7 @@ static HRESULT WINAPI IDirectXFileDataImpl_GetData(IDirectXFileData* iface, LPCS
} }
*pcbSize = This->pobj->size; *pcbSize = This->pobj->size;
*ppvData = This->pobj->pdata; *ppvData = This->pobj->root->pdata + This->pobj->pos_data;
return DXFILE_OK; return DXFILE_OK;
} }
@ -1063,7 +1063,8 @@ static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileE
hr = DXFILEERR_BADALLOC; hr = DXFILEERR_BADALLOC;
goto error; goto error;
} }
This->buf.cur_pdata = This->buf.pdata = object->pdata = pdata; This->buf.pxo->pdata = This->buf.pdata = object->pdata = pdata;
This->buf.cur_pos_data = 0;
pstrings = HeapAlloc(GetProcessHeap(), 0, MAX_STRINGS_BUFFER); pstrings = HeapAlloc(GetProcessHeap(), 0, MAX_STRINGS_BUFFER);
if (!pstrings) if (!pstrings)

View File

@ -66,7 +66,7 @@ typedef struct {
typedef struct { typedef struct {
char* name; char* name;
LPBYTE start; ULONG start;
ULONG size; ULONG size;
} xobject_member; } xobject_member;
@ -77,12 +77,14 @@ struct _xobject {
GUID class_id; GUID class_id;
GUID type; GUID type;
LPBYTE pdata; LPBYTE pdata;
ULONG pos_data;
DWORD size; DWORD size;
ULONG nb_members; ULONG nb_members;
xobject_member members[MAX_MEMBERS]; xobject_member members[MAX_MEMBERS];
ULONG nb_childs; ULONG nb_childs;
ULONG nb_subobjects; ULONG nb_subobjects;
struct _xobject * childs[MAX_CHILDS]; struct _xobject * childs[MAX_CHILDS];
struct _xobject * root;
}; };
typedef struct _xobject xobject; typedef struct _xobject xobject;
@ -130,7 +132,7 @@ typedef struct {
BOOL token_present; BOOL token_present;
BOOL txt; BOOL txt;
ULONG cur_subobject; ULONG cur_subobject;
LPBYTE cur_pdata; ULONG cur_pos_data;
LPBYTE cur_pstrings; LPBYTE cur_pstrings;
BYTE value[100]; BYTE value[100];
xobject** pxo_globals; xobject** pxo_globals;

View File

@ -1009,14 +1009,14 @@ static BOOL parse_object_members_list(parse_buffer * buf)
int nb_elems = 1; int nb_elems = 1;
buf->pxo->members[i].name = pt->members[i].name; buf->pxo->members[i].name = pt->members[i].name;
buf->pxo->members[i].start = buf->cur_pdata; buf->pxo->members[i].start = buf->cur_pos_data;
for (k = 0; k < pt->members[i].nb_dims; k++) for (k = 0; k < pt->members[i].nb_dims; k++)
{ {
if (pt->members[i].dim_fixed[k]) if (pt->members[i].dim_fixed[k])
nb_elems *= pt->members[i].dim_value[k]; nb_elems *= pt->members[i].dim_value[k];
else else
nb_elems *= *(DWORD*)buf->pxo->members[pt->members[i].dim_value[k]].start; nb_elems *= *(DWORD*)(buf->pxo->root->pdata + buf->pxo->members[pt->members[i].dim_value[k]].start);
} }
TRACE("Elements to consider: %d\n", nb_elems); TRACE("Elements to consider: %d\n", nb_elems);
@ -1076,20 +1076,20 @@ static BOOL parse_object_members_list(parse_buffer * buf)
last_dword = *(DWORD*)buf->value; last_dword = *(DWORD*)buf->value;
TRACE("%s = %d\n", pt->members[i].name, *(DWORD*)buf->value); TRACE("%s = %d\n", pt->members[i].name, *(DWORD*)buf->value);
/* Assume larger size */ /* Assume larger size */
if ((buf->cur_pdata - buf->pdata + 4) > MAX_DATA_SIZE) if ((buf->cur_pos_data + 4) > MAX_DATA_SIZE)
{ {
FIXME("Buffer too small\n"); FIXME("Buffer too small\n");
return FALSE; return FALSE;
} }
if (pt->members[i].type == TOKEN_WORD) if (pt->members[i].type == TOKEN_WORD)
{ {
*(((WORD*)(buf->cur_pdata))) = (WORD)(*(DWORD*)buf->value); *(((WORD*)(buf->cur_pos_data + buf->pdata))) = (WORD)(*(DWORD*)buf->value);
buf->cur_pdata += 2; buf->cur_pos_data += 2;
} }
else if (pt->members[i].type == TOKEN_DWORD) else if (pt->members[i].type == TOKEN_DWORD)
{ {
*(((DWORD*)(buf->cur_pdata))) = (DWORD)(*(DWORD*)buf->value); *(((DWORD*)(buf->cur_pos_data + buf->pdata))) = (DWORD)(*(DWORD*)buf->value);
buf->cur_pdata += 4; buf->cur_pos_data += 4;
} }
else else
{ {
@ -1102,15 +1102,15 @@ static BOOL parse_object_members_list(parse_buffer * buf)
get_TOKEN(buf); get_TOKEN(buf);
TRACE("%s = %f\n", pt->members[i].name, *(float*)buf->value); TRACE("%s = %f\n", pt->members[i].name, *(float*)buf->value);
/* Assume larger size */ /* Assume larger size */
if ((buf->cur_pdata - buf->pdata + 4) > MAX_DATA_SIZE) if ((buf->cur_pos_data + 4) > MAX_DATA_SIZE)
{ {
FIXME("Buffer too small\n"); FIXME("Buffer too small\n");
return FALSE; return FALSE;
} }
if (pt->members[i].type == TOKEN_FLOAT) if (pt->members[i].type == TOKEN_FLOAT)
{ {
*(((float*)(buf->cur_pdata))) = (float)(*(float*)buf->value); *(((float*)(buf->cur_pos_data + buf->pdata))) = (float)(*(float*)buf->value);
buf->cur_pdata += 4; buf->cur_pos_data += 4;
} }
else else
{ {
@ -1123,7 +1123,7 @@ static BOOL parse_object_members_list(parse_buffer * buf)
get_TOKEN(buf); get_TOKEN(buf);
TRACE("%s = %s\n", pt->members[i].name, (char*)buf->value); TRACE("%s = %s\n", pt->members[i].name, (char*)buf->value);
/* Assume larger size */ /* Assume larger size */
if ((buf->cur_pdata - buf->pdata + 4) > MAX_DATA_SIZE) if ((buf->cur_pos_data + 4) > MAX_DATA_SIZE)
{ {
FIXME("Buffer too small\n"); FIXME("Buffer too small\n");
return FALSE; return FALSE;
@ -1137,9 +1137,9 @@ static BOOL parse_object_members_list(parse_buffer * buf)
return FALSE; return FALSE;
} }
strcpy((char*)buf->cur_pstrings, (char*)buf->value); strcpy((char*)buf->cur_pstrings, (char*)buf->value);
*(((LPCSTR*)(buf->cur_pdata))) = (char*)buf->cur_pstrings; *(((LPCSTR*)(buf->cur_pos_data + buf->pdata))) = (char*)buf->cur_pstrings;
buf->cur_pstrings += len; buf->cur_pstrings += len;
buf->cur_pdata += 4; buf->cur_pos_data += 4;
} }
else else
{ {
@ -1173,7 +1173,7 @@ static BOOL parse_object_parts(parse_buffer * buf, BOOL allow_optional)
if (allow_optional) if (allow_optional)
{ {
buf->pxo->size = buf->cur_pdata - buf->pxo->pdata; buf->pxo->size = buf->cur_pos_data - buf->pxo->pos_data;
/* Skip trailing semicolon */ /* Skip trailing semicolon */
while (check_TOKEN(buf) == TOKEN_SEMICOLON) while (check_TOKEN(buf) == TOKEN_SEMICOLON)
@ -1242,8 +1242,9 @@ BOOL parse_object(parse_buffer * buf)
{ {
int i; int i;
buf->pxo->pdata = buf->cur_pdata; buf->pxo->pos_data = buf->cur_pos_data;
buf->pxo->ptarget = NULL; buf->pxo->ptarget = NULL;
buf->pxo->root = buf->pxo_tab;
if (get_TOKEN(buf) != TOKEN_NAME) if (get_TOKEN(buf) != TOKEN_NAME)
return FALSE; return FALSE;