blob: a491949837bac0977511a20dfb3092f7964bec80 [file] [log] [blame]
Nicolas Capens7b21f272014-06-04 22:51:10 -04001/*!****************************************************************************
2
3 @file PVRTGlobal.h
4 @copyright Copyright (c) Imagination Technologies Limited.
5 @brief Global defines and typedefs for PVRTools
6
7******************************************************************************/
8#ifndef _PVRTGLOBAL_H_
9#define _PVRTGLOBAL_H_
10
11/*!***************************************************************************
12 Macros
13*****************************************************************************/
14#define PVRT_MIN(a,b) (((a) < (b)) ? (a) : (b))
15#define PVRT_MAX(a,b) (((a) > (b)) ? (a) : (b))
16#define PVRT_CLAMP(x, l, h) (PVRT_MIN((h), PVRT_MAX((x), (l))))
17
18// avoid warning about unused parameter
19#define PVRT_UNREFERENCED_PARAMETER(x) ((void) x)
20
21#if defined(_WIN32) && !defined(__QT__) && !defined(UNDER_CE) /* Windows desktop */
22#if !defined(_CRTDBG_MAP_ALLOC)
23 #define _CRTDBG_MAP_ALLOC
24#endif
25 #include <windows.h>
26 #include <crtdbg.h>
27 #include <tchar.h>
28#endif
29
30#if defined(UNDER_CE)
31 #include <windows.h>
32
33#ifndef _ASSERT
34 #ifdef _DEBUG
35 #define _ASSERT(X) { (X) ? 0 : DebugBreak(); }
36 #else
37 #define _ASSERT(X)
38 #endif
39#endif
40
41#ifndef _ASSERTE
42 #ifdef _DEBUG
43 #define _ASSERTE _ASSERT
44 #else
45 #define _ASSERTE(X)
46 #endif
47#endif
48 #define _RPT0(a,b)
49 #define _RPT1(a,b,c)
50 #define _RPT2(a,b,c,d)
51 #define _RPT3(a,b,c,d,e)
52 #define _RPT4(a,b,c,d,e,f)
53#else
54
55#if defined(_WIN32) && !defined(__QT__)
56
57#else
58#if defined(__linux__) || defined(__APPLE__)
59 #include <assert.h>
60 #ifdef _DEBUG
61 #ifndef _RPT0
62 #define _RPT0(a,b) printf(b)
63 #endif
64 #ifndef _RPT1
65 #define _RPT1(a,b,c) printf(b,c)
66 #endif
67 #ifndef _ASSERT
68 #define _ASSERT(a) assert(a)
69 #endif
70 #ifndef _ASSERTE
71 #define _ASSERTE(a) assert(a)
72 #endif
73 #else
74 #ifndef _RPT0
75 #define _RPT0(a,b)((void)0)
76 #endif
77 #ifndef _RPT1
78 #define _RPT1(a,b,c)((void)0)
79 #endif
80 #ifndef _ASSERT
81 #define _ASSERT(a)((void)0)
82 #endif
83 #ifndef _ASSERTE
84 #define _ASSERTE(a)((void)0)
85 #endif
86 #endif
87 #ifndef _RPT2
88 #define _RPT2(a,b,c,d)((void)0)
89 #endif
90 #ifndef _RPT3
91 #define _RPT3(a,b,c,d,e)((void)0)
92 #endif
93 #ifndef _RPT4
94 #define _RPT4(a,b,c,d,e,f)((void)0)
95 #endif
96 #include <stdlib.h>
97 #include <string.h>
98 #ifndef BYTE
99 #define BYTE unsigned char
100 #endif
101 #ifndef WORD
102 #define WORD unsigned short
103 #endif
104 #ifndef DWORD
105 #define DWORD unsigned int
106 #endif
107 #if !defined(BOOL) && !defined(OBJC_BOOL_DEFINED)
108 #define BOOL int
109 #endif
110 typedef struct tagRGBQUAD {
111 BYTE rgbBlue;
112 BYTE rgbGreen;
113 BYTE rgbRed;
114 BYTE rgbReserved;
115 } RGBQUAD;
116#if !defined(TRUE)
117 #define TRUE 1
118#endif
119#if !defined(FALSE)
120 #define FALSE 0
121#endif
122#else
123 #define _CRT_WARN 0
124 #define _RPT0(a,b)
125 #define _RPT1(a,b,c)
126 #define _RPT2(a,b,c,d)
127 #define _RPT3(a,b,c,d,e)
128 #define _RPT4(a,b,c,d,e,f)
129 #define _ASSERT(X)
130 #define _ASSERTE(X)
131#endif
132#endif
133#endif
134
135#include <stdio.h>
136
137#define FREE(X) { if(X) { free(X); (X) = 0; } }
138
139// This macro is used to check at compile time that types are of a certain size
140// If the size does not equal the expected size, this typedefs an array of size 0
141// which causes a compile error
142#define PVRTSIZEASSERT(T, size) typedef int (sizeof_##T)[sizeof(T) == (size)]
143#define PVRTCOMPILEASSERT(T, expr) typedef int (assert_##T)[expr]
144
145
146/****************************************************************************
147** Integer types
148****************************************************************************/
149
150typedef char PVRTchar8;
151typedef signed char PVRTint8;
152typedef signed short PVRTint16;
153typedef signed int PVRTint32;
154typedef unsigned char PVRTuint8;
155typedef unsigned short PVRTuint16;
156typedef unsigned int PVRTuint32;
157
158typedef float PVRTfloat32;
159
160#if (defined(__int64) || defined(_WIN32))
161typedef signed __int64 PVRTint64;
162typedef unsigned __int64 PVRTuint64;
163#elif defined(__GNUC__)
164__extension__ typedef signed long long PVRTint64;
165__extension__ typedef unsigned long long PVRTuint64;
166#else
167typedef signed long long PVRTint64;
168typedef unsigned long long PVRTuint64;
169#endif
170
171#if __SIZEOF_WCHAR_T__ == 4 || __WCHAR_MAX__ > 0x10000
172 #define PVRTSIZEOFWCHAR 4
173#else
174 #define PVRTSIZEOFWCHAR 2
175#endif
176
177PVRTSIZEASSERT(PVRTchar8, 1);
178PVRTSIZEASSERT(PVRTint8, 1);
179PVRTSIZEASSERT(PVRTuint8, 1);
180PVRTSIZEASSERT(PVRTint16, 2);
181PVRTSIZEASSERT(PVRTuint16, 2);
182PVRTSIZEASSERT(PVRTint32, 4);
183PVRTSIZEASSERT(PVRTuint32, 4);
184PVRTSIZEASSERT(PVRTint64, 8);
185PVRTSIZEASSERT(PVRTuint64, 8);
186PVRTSIZEASSERT(PVRTfloat32, 4);
187
188/*!**************************************************************************
189 @enum ETextureFilter
190 @brief Enum values for defining texture filtering
191****************************************************************************/
192enum ETextureFilter
193{
194 eFilter_Nearest,
195 eFilter_Linear,
196 eFilter_None,
197
198 eFilter_Size,
199 eFilter_Default = eFilter_Linear,
200 eFilter_MipDefault = eFilter_None
201};
202
203/*!**************************************************************************
204 @enum ETextureWrap
205 @brief Enum values for defining texture wrapping
206****************************************************************************/
207enum ETextureWrap
208{
209 eWrap_Clamp,
210 eWrap_Repeat,
211
212 eWrap_Size,
213 eWrap_Default = eWrap_Repeat
214};
215
216/****************************************************************************
217** swap template function
218****************************************************************************/
219/*!***************************************************************************
220 @brief A swap template function that swaps a and b
221 @param[in] a Type a
222 @param[in] b Type b
223*****************************************************************************/
224
225template <typename T>
226inline void PVRTswap(T& a, T& b)
227{
228 T temp = a;
229 a = b;
230 b = temp;
231}
232
233/*!***************************************************************************
234 @brief A clamp template function that clamps val between min and max.
235 @param[in] val Value to clamp
236 @param[in] min Minimum legal value
237 @param[in] max Maximum legal value
238*****************************************************************************/
239template <typename T>
240inline T PVRTClamp(const T& val, const T& min, const T& max)
241{
242 if(val > max)
243 return max;
244 if(val < min)
245 return min;
246 return val;
247}
248
249/*!***************************************************************************
250 @brief Swaps the endianness of pBytes in place
251 @param[in] pBytes A number
252 @param[in] i32ByteNo Number of bytes in pBytes
253*****************************************************************************/
254inline void PVRTByteSwap(unsigned char* pBytes, int i32ByteNo)
255{
256 int i = 0, j = i32ByteNo - 1;
257
258 while(i < j)
259 PVRTswap<unsigned char>(pBytes[i++], pBytes[j--]);
260}
261
262/*!***************************************************************************
263 @brief Converts the endianness of an unsigned int
264 @param[in] ui32Long A number
265 @return ui32Long with its endianness changed
266*****************************************************************************/
267inline unsigned int PVRTByteSwap32(unsigned int ui32Long)
268{
269 return ((ui32Long&0x000000FF)<<24) + ((ui32Long&0x0000FF00)<<8) + ((ui32Long&0x00FF0000)>>8) + ((ui32Long&0xFF000000) >> 24);
270}
271
272/*!***************************************************************************
273 @brief Converts the endianness of a unsigned short
274 @param[in] ui16Short A number
275 @return ui16Short with its endianness changed
276*****************************************************************************/
277inline unsigned short PVRTByteSwap16(unsigned short ui16Short)
278{
279 return (ui16Short>>8) | (ui16Short<<8);
280}
281
282/*!***************************************************************************
283 @brief Returns true if the platform the code is ran on is little endian
284 @return True if the platform the code is ran on is little endian
285*****************************************************************************/
286inline bool PVRTIsLittleEndian()
287{
288 static bool bLittleEndian;
289 static bool bIsInit = false;
290
291 if(!bIsInit)
292 {
293 short int word = 0x0001;
294 char *byte = (char*) &word;
295 bLittleEndian = byte[0] ? true : false;
296 bIsInit = true;
297 }
298
299 return bLittleEndian;
300}
301
302#endif // _PVRTGLOBAL_H_
303
304/*****************************************************************************
305 End of file (Tools.h)
306*****************************************************************************/
307