ReactOS 0.4.17-dev-784-g3812a95
d3dxof_private.h File Reference
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "wtypes.h"
#include "wingdi.h"
#include "winuser.h"
#include "dxfile.h"
Include dependency graph for d3dxof_private.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  member
 
struct  xtemplate
 
struct  xobject_member
 
struct  _xobject
 
struct  IDirectXFileImpl
 
struct  IDirectXFileBinaryImpl
 
struct  IDirectXFileDataImpl
 
struct  IDirectXFileDataReferenceImpl
 
struct  IDirectXFileObjectImpl
 
struct  parse_buffer
 
struct  IDirectXFileEnumObjectImpl
 
struct  IDirectXFileSaveObjectImpl
 

Macros

#define MAX_NAME_LEN   40
 
#define MAX_ARRAY_DIM   4
 
#define MAX_MEMBERS   50
 
#define MAX_CHILDREN   200
 
#define MAX_TEMPLATES   200
 
#define MAX_OBJECTS   500
 
#define MAX_SUBOBJECTS   2000
 
#define MAX_STRINGS_BUFFER   10000
 

Typedefs

typedef struct _xobject xobject
 

Functions

HRESULT IDirectXFileImpl_Create (IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN
 
HRESULT parse_header (parse_buffer *buf, BYTE **decomp_buffer_ptr) DECLSPEC_HIDDEN
 
BOOL parse_object (parse_buffer *buf) DECLSPEC_HIDDEN
 
BOOL parse_templates (parse_buffer *buf, BOOL templates_only) DECLSPEC_HIDDEN
 
int mszip_decompress (int inlen, int outlen, char *inbuffer, char *outbuffer) DECLSPEC_HIDDEN
 

Macro Definition Documentation

◆ MAX_ARRAY_DIM

#define MAX_ARRAY_DIM   4

Definition at line 34 of file d3dxof_private.h.

◆ MAX_CHILDREN

#define MAX_CHILDREN   200

Definition at line 36 of file d3dxof_private.h.

◆ MAX_MEMBERS

#define MAX_MEMBERS   50

Definition at line 35 of file d3dxof_private.h.

◆ MAX_NAME_LEN

#define MAX_NAME_LEN   40

Definition at line 33 of file d3dxof_private.h.

◆ MAX_OBJECTS

#define MAX_OBJECTS   500

Definition at line 38 of file d3dxof_private.h.

◆ MAX_STRINGS_BUFFER

#define MAX_STRINGS_BUFFER   10000

Definition at line 40 of file d3dxof_private.h.

◆ MAX_SUBOBJECTS

#define MAX_SUBOBJECTS   2000

Definition at line 39 of file d3dxof_private.h.

◆ MAX_TEMPLATES

#define MAX_TEMPLATES   200

Definition at line 37 of file d3dxof_private.h.

Typedef Documentation

◆ xobject

Definition at line 85 of file d3dxof_private.h.

Function Documentation

◆ IDirectXFileImpl_Create()

HRESULT IDirectXFileImpl_Create ( IUnknown pUnkOuter,
LPVOID ppObj 
)

Definition at line 50 of file d3dxof.c.

51{
53
54 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
55
57 if (!object)
58 return DXFILEERR_BADALLOC;
59
60 object->IDirectXFile_iface.lpVtbl = &IDirectXFile_Vtbl;
61 object->ref = 1;
62
63 /* Reserve first template to handle the case sensitive legacy type indexColor */
64 object->nb_xtemplates = 1;
65 strcpy(object->xtemplates[0].name, "indexColor");
66 object->xtemplates[0].nb_members = 2;
67 object->xtemplates[0].members[0].type = TOKEN_DWORD;
68 object->xtemplates[0].members[0].nb_dims = 0;
69 object->xtemplates[0].members[1].type = TOKEN_FLOAT;
70 object->xtemplates[0].members[1].nb_dims = 1;
71 object->xtemplates[0].members[1].dim_fixed[0] = TRUE;
72 object->xtemplates[0].members[1].dim_value[0] = 4;
73
74 *ppObj = &object->IDirectXFile_iface;
75
76 return S_OK;
77}
#define TOKEN_FLOAT
Definition: d3dxof.c:48
#define TOKEN_DWORD
Definition: d3dxof.c:47
static const struct IDirectXFileVtbl IDirectXFile_Vtbl
Definition: d3dxof.c:36
#define TRUE
Definition: types.h:120
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define DXFILEERR_BADALLOC
Definition: dxfile.h:274
#define S_OK
Definition: intsafe.h:52
strcpy
Definition: string.h:131
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by DirectXFileCreate().

◆ mszip_decompress()

int mszip_decompress ( int  inlen,
int  outlen,
char inbuffer,
char outbuffer 
)

Referenced by parse_header().

◆ parse_header()

HRESULT parse_header ( parse_buffer buf,
BYTE **  decomp_buffer_ptr 
)

Definition at line 175 of file parsing.c.

176{
177 /* X File common header:
178 * 0-3 -> Magic Number (format identifier)
179 * 4-7 -> Format Version
180 * 8-11 -> Format Type (text or binary, decompressed or compressed)
181 * 12-15 -> Float Size (32 or 64 bits) */
182 DWORD header[4];
183
184 if (!read_bytes(buf, header, sizeof(header)))
186
187 if (TRACE_ON(d3dxof_parsing))
188 {
189 char string[17];
190 memcpy(string, header, 16);
191 string[16] = 0;
192 TRACE("header = '%s'\n", string);
193 }
194
197
200
203 {
204 WARN("File type %s unknown\n", debugstr_fourcc(header[2]));
206 }
207
210
212
214 {
215 /* Extended header for compressed data:
216 * 16-19 -> size of decompressed file including xof header,
217 * 20-21 -> size of first decompressed MSZIP chunk, 22-23 -> size of first compressed MSZIP chunk
218 * 24-xx -> compressed MSZIP data chunk
219 * xx-xx -> size of next decompressed MSZIP chunk, xx-xx -> size of next compressed MSZIP chunk
220 * xx-xx -> compressed MSZIP data chunk
221 * .............................................................................................. */
222 int err;
223 DWORD decomp_file_size;
224 WORD decomp_chunk_size;
225 WORD comp_chunk_size;
226 LPBYTE decomp_buffer;
227
228 if (!read_bytes(buf, &decomp_file_size, sizeof(decomp_file_size)))
230
231 TRACE("Compressed format %s detected: decompressed file size with xof header = %d\n",
232 debugstr_fourcc(header[2]), decomp_file_size);
233
234 /* Does not take xof header into account */
235 decomp_file_size -= 16;
236
237 decomp_buffer = HeapAlloc(GetProcessHeap(), 0, decomp_file_size);
238 if (!decomp_buffer)
239 {
240 ERR("Out of memory\n");
241 return DXFILEERR_BADALLOC;
242 }
243 *decomp_buffer_ptr = decomp_buffer;
244
245 while (buf->rem_bytes)
246 {
247 if (!read_bytes(buf, &decomp_chunk_size, sizeof(decomp_chunk_size)))
249 if (!read_bytes(buf, &comp_chunk_size, sizeof(comp_chunk_size)))
251
252 TRACE("Process chunk: compressed_size = %d, decompressed_size = %d\n",
253 comp_chunk_size, decomp_chunk_size);
254
255 err = mszip_decompress(comp_chunk_size, decomp_chunk_size, (char*)buf->buffer, (char*)decomp_buffer);
256 if (err)
257 {
258 WARN("Error while decompressing MSZIP chunk %d\n", err);
259 HeapFree(GetProcessHeap(), 0, decomp_buffer);
260 return DXFILEERR_BADALLOC;
261 }
262 buf->rem_bytes -= comp_chunk_size;
263 buf->buffer += comp_chunk_size;
264 decomp_buffer += decomp_chunk_size;
265 }
266
267 if ((decomp_buffer - *decomp_buffer_ptr) != decomp_file_size)
268 ERR("Size of all decompressed chunks (%u) does not match decompressed file size (%u)\n",
269 (DWORD)(decomp_buffer - *decomp_buffer_ptr), decomp_file_size);
270
271 /* Use decompressed data */
272 buf->buffer = *decomp_buffer_ptr;
273 buf->rem_bytes = decomp_file_size;
274 }
275
276 TRACE("Header is correct\n");
277
278 return S_OK;
279}
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
int mszip_decompress(int inlen, int outlen, char *inbuffer, char *outbuffer) DECLSPEC_HIDDEN
#define TRACE_ON(x)
Definition: compat.h:75
#define HeapFree(x, y, z)
Definition: compat.h:735
#define DXFILEERR_BADFILEVERSION
Definition: dxfile.h:282
#define DXFILEERR_BADFILEFLOATSIZE
Definition: dxfile.h:283
#define DXFILEERR_BADFILETYPE
Definition: dxfile.h:281
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define XOFFILE_FORMAT_MAGIC
Definition: parsing.c:37
#define XOFFILE_FORMAT_FLOAT_BITS_32
Definition: parsing.c:45
#define XOFFILE_FORMAT_VERSION_302
Definition: parsing.c:38
static BOOL read_bytes(parse_buffer *buf, LPVOID data, DWORD size)
Definition: parsing.c:159
#define XOFFILE_FORMAT_BINARY
Definition: parsing.c:40
#define XOFFILE_FORMAT_TEXT
Definition: parsing.c:41
#define XOFFILE_FORMAT_VERSION_303
Definition: parsing.c:39
#define XOFFILE_FORMAT_BINARY_MSZIP
Definition: parsing.c:42
#define XOFFILE_FORMAT_TEXT_MSZIP
Definition: parsing.c:43
#define XOFFILE_FORMAT_FLOAT_BITS_64
Definition: parsing.c:46
#define err(...)
unsigned char * LPBYTE
Definition: typedefs.h:53

Referenced by IDirectXFileImpl_CreateEnumObject(), and IDirectXFileImpl_RegisterTemplates().

◆ parse_object()

BOOL parse_object ( parse_buffer buf)

Definition at line 1370 of file parsing.c.

1371{
1372 ULONG i;
1373
1374 buf->pxo->pos_data = buf->cur_pos_data;
1375 buf->pxo->ptarget = NULL;
1376 buf->pxo->binary = FALSE;
1377 buf->pxo->root = buf->pxo_tab;
1378
1379 if (get_TOKEN(buf) != TOKEN_NAME)
1380 return FALSE;
1381
1382 /* To do template lookup */
1383 for (i = 0; i < buf->pdxf->nb_xtemplates; i++)
1384 {
1385 if (!_strnicmp((char*)buf->value, buf->pdxf->xtemplates[i].name, -1))
1386 {
1387 buf->pxt[buf->level] = &buf->pdxf->xtemplates[i];
1388 memcpy(&buf->pxo->type, &buf->pdxf->xtemplates[i].class_id, 16);
1389 break;
1390 }
1391 }
1392 if (i == buf->pdxf->nb_xtemplates)
1393 {
1394 ERR("Unknown template %s\n", (char*)buf->value);
1395 return FALSE;
1396 }
1397
1398 if (check_TOKEN(buf) == TOKEN_NAME)
1399 {
1400 get_TOKEN(buf);
1401 strcpy(buf->pxo->name, (char*)buf->value);
1402 }
1403 else
1404 buf->pxo->name[0] = 0;
1405
1406 if (get_TOKEN(buf) != TOKEN_OBRACE)
1407 return FALSE;
1408 if (check_TOKEN(buf) == TOKEN_GUID)
1409 {
1410 get_TOKEN(buf);
1411 memcpy(&buf->pxo->class_id, buf->value, 16);
1412 }
1413 else
1414 memset(&buf->pxo->class_id, 0, 16);
1415
1417 return FALSE;
1418 if (get_TOKEN(buf) != TOKEN_CBRACE)
1419 return FALSE;
1420
1421 /* For seeking to a possibly eof to avoid parsing another object next time */
1423
1424 return TRUE;
1425}
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define _strnicmp(_String1, _String2, _MaxCount)
Definition: compat.h:23
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define TOKEN_GUID
Definition: parsing.c:53
#define TOKEN_NAME
Definition: parsing.c:50
static BOOL parse_object_parts(parse_buffer *buf, BOOL allow_optional)
Definition: parsing.c:1284
#define TOKEN_OBRACE
Definition: parsing.c:56
static WORD check_TOKEN(parse_buffer *buf)
Definition: parsing.c:866
#define TOKEN_CBRACE
Definition: parsing.c:57
static WORD get_TOKEN(parse_buffer *buf)
Definition: parsing.c:853
#define memset(x, y, z)
Definition: compat.h:39
uint32_t ULONG
Definition: typedefs.h:59

Referenced by IDirectXFileEnumObjectImpl_GetNextDataObject(), and parse_object_parts().

◆ parse_templates()

BOOL parse_templates ( parse_buffer buf,
BOOL  templates_only 
)

Definition at line 1089 of file parsing.c.

1090{
1091 while (check_TOKEN(buf) != TOKEN_NONE)
1092 {
1093 if (templates_only && (check_TOKEN(buf) != TOKEN_TEMPLATE))
1094 return TRUE;
1095 if (!parse_template(buf))
1096 {
1097 WARN("Template is not correct\n");
1098 return FALSE;
1099 }
1100 else
1101 {
1102 TRACE("Template successfully parsed:\n");
1103 if (TRACE_ON(d3dxof_parsing))
1104 dump_template(buf->pdxf->xtemplates, &buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates - 1]);
1105 }
1106 }
1107 return TRUE;
1108}
static void dump_template(xtemplate *templates_array, xtemplate *ptemplate)
Definition: parsing.c:118
#define TOKEN_TEMPLATE
Definition: parsing.c:67
static BOOL parse_template(parse_buffer *buf)
Definition: parsing.c:1066
#define TOKEN_NONE
Definition: parsing.c:49

Referenced by IDirectXFileEnumObjectImpl_GetNextDataObject(), IDirectXFileImpl_CreateEnumObject(), and IDirectXFileImpl_RegisterTemplates().