summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/assimp/code/IFF.h
blob: a1b2dc9c5308e2e0fb92489d85fe60f43db268c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102


// Definitions for the Interchange File Format (IFF)
// Alexander Gessler, 2006
// Adapted to Assimp August 2008

#ifndef AI_IFF_H_INCLUDED
#define AI_IFF_H_INCLUDED

#include "ByteSwap.h"

namespace Assimp	{
namespace IFF		{

#include "./../include/assimp/Compiler/pushpack1.h"

/////////////////////////////////////////////////////////////////////////////////
//! Describes an IFF chunk header
/////////////////////////////////////////////////////////////////////////////////
struct ChunkHeader
{
	//! Type of the chunk header - FourCC
	uint32_t type;

	//! Length of the chunk data, in bytes
	uint32_t length;
} PACK_STRUCT;


/////////////////////////////////////////////////////////////////////////////////
//! Describes an IFF sub chunk header
/////////////////////////////////////////////////////////////////////////////////
struct SubChunkHeader
{
	//! Type of the chunk header - FourCC
	uint32_t type;

	//! Length of the chunk data, in bytes
	uint16_t length;
} PACK_STRUCT;

#include "./../include/assimp/Compiler/poppack1.h"


#define AI_IFF_FOURCC(a,b,c,d) ((uint32_t) (((uint8_t)a << 24u) | \
	((uint8_t)b << 16u) | ((uint8_t)c << 8u) | ((uint8_t)d)))


#define AI_IFF_FOURCC_FORM AI_IFF_FOURCC('F','O','R','M')


/////////////////////////////////////////////////////////////////////////////////
//! Load a chunk header
//! @param outFile Pointer to the file data - points to the chunk data afterwards
//! @return Pointer to the chunk header
/////////////////////////////////////////////////////////////////////////////////
inline ChunkHeader* LoadChunk(uint8_t*& outFile)
{
	ChunkHeader* head = (ChunkHeader*) outFile;
	AI_LSWAP4(head->length);
	AI_LSWAP4(head->type);
	outFile += sizeof(ChunkHeader);
	return head;
}

/////////////////////////////////////////////////////////////////////////////////
//! Load a sub chunk header
//! @param outFile Pointer to the file data - points to the chunk data afterwards
//! @return Pointer to the sub chunk header
/////////////////////////////////////////////////////////////////////////////////
inline SubChunkHeader* LoadSubChunk(uint8_t*& outFile)
{
	SubChunkHeader* head = (SubChunkHeader*) outFile;
	AI_LSWAP2(head->length);
	AI_LSWAP4(head->type);
	outFile += sizeof(SubChunkHeader);
	return head;
}

/////////////////////////////////////////////////////////////////////////////////
//! Read the file header and return the type of the file and its size
//! @param outFile Pointer to the file data. The buffer must at 
//!   least be 12 bytes large.
//! @param fileType Receives the type of the file
//! @return 0 if everything was OK, otherwise an error message
/////////////////////////////////////////////////////////////////////////////////
inline const char* ReadHeader(uint8_t* outFile,uint32_t& fileType) 
{
	ChunkHeader* head = LoadChunk(outFile);
	if(AI_IFF_FOURCC_FORM != head->type)
	{
		return "The file is not an IFF file: FORM chunk is missing";
	}
	fileType = *((uint32_t*)(head+1));
	AI_LSWAP4(fileType);
	return 0;
}


}}

#endif // !! AI_IFF_H_INCLUDED