Fix some build warnings
[blender.git] / source / blender / blenkernel / BKE_utildefines.h
1 /* 
2         $Id$
3
4  *
5  * ***** BEGIN GPL LICENSE BLOCK *****
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software Foundation,
19  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20  *
21  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
22  * All rights reserved.
23  *
24  * The Original Code is: all of this file.
25  *
26  * Contributor(s): none yet.
27  *
28  * ***** END GPL LICENSE BLOCK *****
29 */
30
31 #ifndef BKE_UTILDEFINES_H
32 #define BKE_UTILDEFINES_H
33
34 #ifndef FALSE
35 #define FALSE 0
36 #endif
37
38 #ifndef TRUE
39 #define TRUE 1
40 #endif
41
42 /* these values need to be hardcoded in structs, dna does not recognize defines */
43 /* also defined in DNA_space_types.h */
44 #ifndef FILE_MAXDIR
45 #define FILE_MAXDIR                     160
46 #define FILE_MAXFILE            80
47 #define FILE_MAX                        240
48 #endif
49
50 #define ELEM(a, b, c)           ( (a)==(b) || (a)==(c) )
51 #define ELEM3(a, b, c, d)       ( ELEM(a, b, c) || (a)==(d) )
52 #define ELEM4(a, b, c, d, e)    ( ELEM(a, b, c) || ELEM(a, d, e) )
53 #define ELEM5(a, b, c, d, e, f) ( ELEM(a, b, c) || ELEM3(a, d, e, f) )
54 #define ELEM6(a, b, c, d, e, f, g)      ( ELEM(a, b, c) || ELEM4(a, d, e, f, g) )
55 #define ELEM7(a, b, c, d, e, f, g, h)   ( ELEM3(a, b, c, d) || ELEM4(a, e, f, g, h) )
56 #define ELEM8(a, b, c, d, e, f, g, h, i)        ( ELEM4(a, b, c, d, e) || ELEM4(a, f, g, h, i) )
57 #define ELEM9(a, b, c, d, e, f, g, h, i, j)        ( ELEM4(a, b, c, d, e) || ELEM5(a, f, g, h, i, j) )
58 #define ELEM10(a, b, c, d, e, f, g, h, i, j, k)        ( ELEM4(a, b, c, d, e) || ELEM6(a, f, g, h, i, j, k) )
59 #define ELEM11(a, b, c, d, e, f, g, h, i, j, k, l)        ( ELEM4(a, b, c, d, e) || ELEM7(a, f, g, h, i, j, k, l) )
60
61 /* shift around elements */
62 #define SHIFT3(type, a, b, c) { type tmp; tmp = a; a = c; c = b; b = tmp; }
63 #define SHIFT4(type, a, b, c, d) { type tmp; tmp = a; a = d; d = c; c = b; b = tmp; }
64
65 /* min/max */
66 #define MIN2(x,y)               ( (x)<(y) ? (x) : (y) )
67 #define MIN3(x,y,z)             MIN2( MIN2((x),(y)) , (z) )
68 #define MIN4(x,y,z,a)           MIN2( MIN2((x),(y)) , MIN2((z),(a)) )
69
70 #define MAX2(x,y)               ( (x)>(y) ? (x) : (y) )
71 #define MAX3(x,y,z)             MAX2( MAX2((x),(y)) , (z) )
72 #define MAX4(x,y,z,a)           MAX2( MAX2((x),(y)) , MAX2((z),(a)) )
73
74 #define INIT_MINMAX(min, max) { (min)[0]= (min)[1]= (min)[2]= 1.0e30f; (max)[0]= (max)[1]= (max)[2]= -1.0e30f; }
75
76 #define INIT_MINMAX2(min, max) { (min)[0]= (min)[1]= 1.0e30f; (max)[0]= (max)[1]= -1.0e30f; }
77
78 #define DO_MIN(vec, min) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0];      \
79                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1];   \
80                                                           if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; } \
81
82 #define DO_MAX(vec, max) { if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0];          \
83                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1];   \
84                                                           if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
85
86 #define DO_MINMAX(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
87                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
88                                                           if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; \
89                                                           if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
90                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
91                                                           if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
92
93 #define DO_MINMAX2(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
94                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
95                                                           if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
96                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; }
97
98 /* some math and copy defines */
99
100 #ifndef SWAP
101 #define SWAP(type, a, b)        { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
102 #endif
103
104 #define ABS(a)                                  ( (a)<0 ? (-(a)) : (a) )
105
106 #define AVG2(x, y)              ( 0.5 * ((x) + (y)) )
107
108 #define FTOCHAR(val) ((val)<=0.0f)? 0 : (((val)>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*(val))+0.5f))
109
110 #define VECCOPY(v1,v2)          {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
111 #define VECCOPY2D(v1,v2)          {*(v1)= *(v2); *(v1+1)= *(v2+1);}
112 #define QUATCOPY(v1,v2)         {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
113 #define LONGCOPY(a, b, c)       {int lcpc=c, *lcpa=(int *)a, *lcpb=(int *)b; while(lcpc-->0) *(lcpa++)= *(lcpb++);}
114
115
116 #define VECADD(v1,v2,v3)        {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
117 #define VECSUB(v1,v2,v3)        {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
118 #define VECSUB2D(v1,v2,v3)      {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1);}
119 #define VECADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac);}
120 #define VECSUBFAC(v1,v2,v3,fac) {*(v1)= *(v2) - *(v3)*(fac); *(v1+1)= *(v2+1) - *(v3+1)*(fac); *(v1+2)= *(v2+2) - *(v3+2)*(fac);}
121 #define QUATADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac); *(v1+3)= *(v2+3) + *(v3+3)*(fac);}
122
123 #define INPR(v1, v2)            ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
124
125
126 /* some misc stuff.... */
127 #define CLAMP(a, b, c)          if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
128 #define CLAMPIS(a, b, c) ((a)<(b) ? (b) : (a)>(c) ? (c) : (a))
129 #define CLAMPTEST(a, b, c)      if((b)<(c)) {CLAMP(a, b, c);} else {CLAMP(a, c, b);}
130
131 #define IS_EQ(a,b) ((fabs((double)(a)-(b)) >= (double) FLT_EPSILON) ? 0 : 1)
132
133 #define IS_EQT(a, b, c) ((a > b)? (((a-b) <= c)? 1:0) : ((((b-a) <= c)? 1:0)))
134 #define IN_RANGE(a, b, c) ((b < c)? ((b<a && a<c)? 1:0) : ((c<a && a<b)? 1:0))
135 #define IN_RANGE_INCL(a, b, c) ((b < c)? ((b<=a && a<=c)? 1:0) : ((c<=a && a<=b)? 1:0))
136
137 /* this weirdo pops up in two places ... */
138 #if !defined(WIN32)
139 #ifndef O_BINARY
140 #define O_BINARY 0
141 #endif
142 #endif
143
144 /* INTEGER CODES */
145 #if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__hppa__) || defined (__BIG_ENDIAN__)
146         /* Big Endian */
147 #define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) )
148 #else
149         /* Little Endian */
150 #define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) )
151 #endif
152
153 #define ID_NEW(a)               if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid
154
155 #define FORM MAKE_ID('F','O','R','M')
156
157 #define BLEN MAKE_ID('B','L','E','N')
158 #define DER_ MAKE_ID('D','E','R','_')
159 #define V100 MAKE_ID('V','1','0','0')
160
161 #define DATA MAKE_ID('D','A','T','A')
162 #define GLOB MAKE_ID('G','L','O','B')
163 #define IMAG MAKE_ID('I','M','A','G')
164
165 #define DNA1 MAKE_ID('D','N','A','1')
166 #define TEST MAKE_ID('T','E','S','T')
167 #define REND MAKE_ID('R','E','N','D')
168 #define USER MAKE_ID('U','S','E','R')
169
170 #define ENDB MAKE_ID('E','N','D','B')
171
172
173 /* This one rotates the bytes in an int64, int (32) and short (16) */
174 #define SWITCH_INT64(a) { \
175         char s_i, *p_i; \
176         p_i= (char *)&(a); \
177         s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \
178         s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \
179         s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \
180         s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; }
181
182 #define SWITCH_INT(a) { \
183         char s_i, *p_i; \
184         p_i= (char *)&(a); \
185         s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
186         s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
187
188 #define SWITCH_SHORT(a) { \
189         char s_i, *p_i; \
190         p_i= (char *)&(a); \
191         s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; }
192
193
194 /* Bit operations */
195 #define BTST(a,b)       ( ( (a) & 1<<(b) )!=0 )   
196 #define BNTST(a,b)      ( ( (a) & 1<<(b) )==0 )
197 #define BTST2(a,b,c)    ( BTST( (a), (b) ) || BTST( (a), (c) ) )
198 #define BSET(a,b)       ( (a) | 1<<(b) )
199 #define BCLR(a,b)       ( (a) & ~(1<<(b)) )
200 /* bit-row */
201 #define BROW(min, max)  (((max)>=31? 0xFFFFFFFF: (1<<(max+1))-1) - ((min)? ((1<<(min))-1):0) )
202
203
204 #ifdef GS
205 #undef GS
206 #endif
207 #define GS(a)   (*((short *)(a)))
208
209 /* Warning-free macros for storing ints in pointers. Use these _only_
210  * for storing an int in a pointer, not a pointer in an int (64bit)! */
211 #define SET_INT_IN_POINTER(i) ((void*)(intptr_t)(i))
212 #define GET_INT_FROM_POINTER(i) ((int)(intptr_t)(i))
213
214 /*little array macro library.  example of usage:
215
216 int *arr = NULL;
217 V_DECLARE(arr);
218 int i;
219
220 for (i=0; i<10; i++) {
221         V_GROW(arr);
222         arr[i] = something;
223 }
224 V_FREE(arr);
225
226 arrays are buffered, using double-buffering (so on each reallocation,
227 the array size is doubled).  supposedly this should give good Big Oh
228 behaviour, though it may not be the best in practice.
229 */
230
231 #define V_DECLARE(vec) int _##vec##_count=0; void *_##vec##_tmp
232
233 /*in the future, I plan on having V_DECLARE allocate stack memory it'll
234   use at first, and switch over to heap when it needs more.  that'll mess
235   up cases where you'd want to use this API to build a dynamic list for
236   non-local use, so all such cases should use this macro.*/
237 #define V_DYNDECLARE(vec) V_DECLARE(vec)
238
239 /*this returns the entire size of the array, including any buffering.*/
240 #define V_SIZE(vec) ((signed int)((vec)==NULL ? 0 : MEM_allocN_len(vec) / sizeof(*vec)))
241
242 /*this returns the logical size of the array, not including buffering.*/
243 #define V_COUNT(vec) _##vec##_count
244
245 /*grow the array by one.  zeroes the new elements.*/
246 #define V_GROW(vec) \
247         V_SIZE(vec) > _##vec##_count ? _##vec##_count++ : \
248         ((_##vec##_tmp = MEM_callocN(sizeof(*vec)*(_##vec##_count*2+2), #vec " " __FILE__ " ")),\
249         (vec && memcpy(_##vec##_tmp, vec, sizeof(*vec) * _##vec##_count)),\
250         (vec && (MEM_freeN(vec),1)),\
251         (vec = _##vec##_tmp),\
252         _##vec##_count++)
253
254 #define V_FREE(vec) if (vec) MEM_freeN(vec);
255
256 /*resets the logical size of an array to zero, but doesn't
257   free the memory.*/
258 #define V_RESET(vec) _##vec##_count=0
259
260 /*set the count of the array*/
261 #define V_SETCOUNT(vec, count) _##vec##_count = (count)
262
263 #endif
264