forked from Mirrors/wine-wine
d3dxof: Use offsets to reference data instead of pointers so data buffer can be resized.
parent
fd77bc5f10
commit
df48d6f578
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue