1 /*=========================================================================
3 Module: $RCSfile: bbitkImage.h,v $
5 Date: $Date: 2011/05/25 12:34:48 $
6 Version: $Revision: 1.8 $
7 =========================================================================*/
9 /* ---------------------------------------------------------------------
11 * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
12 * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
14 * This software is governed by the CeCILL-B license under French law and
15 * abiding by the rules of distribution of free software. You can use,
16 * modify and/ or redistribute the software under the terms of the CeCILL-B
17 * license as circulated by CEA, CNRS and INRIA at the following URL
18 * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
19 * or in the file LICENSE.txt.
21 * As a counterpart to the access to the source code and rights to copy,
22 * modify and redistribute granted by the license, users are provided only
23 * with a limited warranty and the software's author, the holder of the
24 * economic rights, and the successive licensors have only limited
27 * The fact that you are presently reading this means that you have had
28 * knowledge of the CeCILL-B license and that you accept its terms.
29 * ------------------------------------------------------------------------ */
34 #ifndef __BBITKIMAGE_H_INCLUDED__
35 #define __BBITKIMAGE_H_INCLUDED__
39 #include "bbtkSystem.h"
44 // bbtk typedefs for itk images
45 #define BBTK_TYPEDEF_ITK_IMAGE(TYPE,DIM) \
46 typedef itk::Image<TYPE,DIM> Image_##TYPE##_##DIM; \
47 typedef const Image_##TYPE##_##DIM Image_##TYPE##_##DIM##_c; \
48 typedef Image_##TYPE##_##DIM * Image_##TYPE##_##DIM##_ptr; \
49 typedef Image_##TYPE##_##DIM##_c * Image_##TYPE##_##DIM##_cptr;
52 #define BBTK_TYPEDEF_ITK_IMAGES_DIM(DIM) \
53 BBTK_TYPEDEF_ITK_IMAGE(int8_t,DIM); \
54 BBTK_TYPEDEF_ITK_IMAGE(uint8_t,DIM); \
55 BBTK_TYPEDEF_ITK_IMAGE(int16_t,DIM); \
56 BBTK_TYPEDEF_ITK_IMAGE(uint16_t,DIM); \
57 BBTK_TYPEDEF_ITK_IMAGE(int32_t,DIM); \
58 BBTK_TYPEDEF_ITK_IMAGE(uint32_t,DIM); \
59 BBTK_TYPEDEF_ITK_IMAGE(float,DIM); \
60 BBTK_TYPEDEF_ITK_IMAGE(double,DIM)
62 BBTK_TYPEDEF_ITK_IMAGES_DIM(2);
63 BBTK_TYPEDEF_ITK_IMAGES_DIM(3);
64 BBTK_TYPEDEF_ITK_IMAGES_DIM(4);
65 //BBTK_TYPEDEF_ITK_IMAGES_DIM(5)
69 #define BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) if (false) {}
71 #define BBTK_END_TEMPLATE_SWITCH(TYPE_INFO) else { bbtkError("bbtk was not built for itk images of type <"<< bbtk::demangle_type_name(TYPE_INFO.name())<<">"); }
73 #define BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,MESSAGE) else { bbtkError(MESSAGE); }
75 /// Generic macro which calls a TEMPLATE_FUNCTION instanciated
76 /// on TEMPLATE_TYPE iff TYPE_INFO == typeid(TEST_TYPE).
77 /// This macro must be used (maybe several times) between a pair of BEGIN_TEMPLATE_SWITCH and END_TEMPLATE_SWITCH macros
78 #define TEMPLATE_SWITCH(TYPE_INFO,TEST_TYPE,TEMPLATE_FUNCTION,TEMPLATE_TYPE) \
79 else if (TYPE_INFO == typeid(bbitk::TEST_TYPE)) \
80 { TEMPLATE_FUNCTION<bbitk::TEMPLATE_TYPE>(); }
84 #ifdef BBTK_ITK_IMAGE_DIM_2
85 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
86 # define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST) \
87 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_2_##CONST##ptr,FUN,Image_int8_t_2)
89 # define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST)
91 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
92 # define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST) \
93 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_2_##CONST##ptr,FUN,Image_int16_t_2)
95 # define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)
97 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
98 # define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST) \
99 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_2_##CONST##ptr,FUN,Image_int32_t_2)
101 # define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST)
103 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
104 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST) \
105 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_2_##CONST##ptr,FUN,Image_uint8_t_2)
107 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)
109 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
110 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST) \
111 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_2_##CONST##ptr,FUN,Image_uint16_t_2)
113 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)
115 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
116 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST) \
117 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_2_##CONST##ptr,FUN,Image_uint32_t_2)
119 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)
121 # ifdef BBTK_ITK_IMAGE_TYPE_float
122 # define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST) \
123 TEMPLATE_SWITCH(TYPE_INFO,Image_float_2_##CONST##ptr,FUN,Image_float_2)
125 # define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)
127 # ifdef BBTK_ITK_IMAGE_TYPE_double
128 # define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST) \
129 TEMPLATE_SWITCH(TYPE_INFO,Image_double_2_##CONST##ptr,FUN,Image_double_2)
131 # define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)
134 # define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST)
135 # define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)
136 # define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST)
137 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)
138 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)
139 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)
140 # define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)
141 # define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)
146 #ifdef BBTK_ITK_IMAGE_DIM_3
147 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
148 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST) \
149 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_3_##CONST##ptr,FUN,Image_int8_t_3)
151 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
153 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
154 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST) \
155 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_3_##CONST##ptr,FUN,Image_int16_t_3)
157 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
159 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
160 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST) \
161 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_3_##CONST##ptr,FUN,Image_int32_t_3)
163 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
165 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
166 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST) \
167 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_3_##CONST##ptr,FUN,Image_uint8_t_3)
169 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
171 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
172 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST) \
173 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_3_##CONST##ptr,FUN,Image_uint16_t_3)
175 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
177 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
178 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST) \
179 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_3_##CONST##ptr,FUN,Image_uint32_t_3)
181 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
183 # ifdef BBTK_ITK_IMAGE_TYPE_float
184 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST) \
185 TEMPLATE_SWITCH(TYPE_INFO,Image_float_3_##CONST##ptr,FUN,Image_float_3)
187 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
189 # ifdef BBTK_ITK_IMAGE_TYPE_double
190 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST) \
191 TEMPLATE_SWITCH(TYPE_INFO,Image_double_3_##CONST##ptr,FUN,Image_double_3)
193 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
196 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
197 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
198 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
199 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
200 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
201 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
202 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
203 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
208 #ifdef BBTK_ITK_IMAGE_DIM_4
209 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
210 # define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST) \
211 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_4_##CONST##ptr,FUN,Image_int8_t_4)
213 # define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST)
215 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
216 # define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST) \
217 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_4_##CONST##ptr,FUN,Image_int16_t_4)
219 # define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST)
221 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
222 # define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST) \
223 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_4_##CONST##ptr,FUN,Image_int32_t_4)
225 # define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST)
227 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
228 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST) \
229 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_4_##CONST##ptr,FUN,Image_uint8_t_4)
231 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST)
233 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
234 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST) \
235 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_4_##CONST##ptr,FUN,Image_uint16_t_4)
237 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)
239 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
240 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST) \
241 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_4_##CONST##ptr,FUN,Image_uint32_t_4)
243 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)
245 # ifdef BBTK_ITK_IMAGE_TYPE_float
246 # define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST) \
247 TEMPLATE_SWITCH(TYPE_INFO,Image_float_4_##CONST##ptr,FUN,Image_float_4)
249 # define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)
251 # ifdef BBTK_ITK_IMAGE_TYPE_double
252 # define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST) \
253 TEMPLATE_SWITCH(TYPE_INFO,Image_double_4_##CONST##ptr,FUN,Image_double_4)
255 # define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
258 # define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST)
259 # define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST)
260 # define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST)
261 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST)
262 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)
263 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)
264 # define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)
265 # define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
269 /// General macro which calls the template function FUN instanciated
270 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
271 #define BBTK_TEMPLATE_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
272 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
273 BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,) \
274 BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,) \
275 BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,) \
276 BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,) \
277 BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,) \
278 BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,) \
279 BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,) \
280 BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,) \
281 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,) \
282 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,) \
283 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,) \
284 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,) \
285 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,) \
286 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,) \
287 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,) \
288 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,) \
289 BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,) \
290 BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,) \
291 BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,) \
292 BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,) \
293 BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,) \
294 BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,) \
295 BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,) \
296 BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,) \
297 BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)
301 /// General macro which calls the template function FUN instanciated
302 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
303 #define BBTK_TEMPLATE_ITK_IMAGE_DIM_3_SWITCH(TYPE_INFO,FUN,ERROR_MESSAGE) \
304 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
305 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,) \
306 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,) \
307 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,) \
308 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,) \
309 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,) \
310 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,) \
311 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,) \
312 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,) \
313 BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,ERROR_MESSAGE)
316 /// General macro which calls the template function FUN instanciated
317 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
319 #define BBTK_TEMPLATE_CONST_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
320 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
321 BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,c) \
322 BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,c) \
323 BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,c) \
324 BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,c) \
325 BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,c) \
326 BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,c) \
327 BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,c) \
328 BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,c) \
329 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,c) \
330 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,c) \
331 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,c) \
332 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,c) \
333 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,c) \
334 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,c) \
335 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,c) \
336 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,c) \
337 BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,c) \
338 BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,c) \
339 BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,c) \
340 BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,c) \
341 BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,c) \
342 BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,c) \
343 BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,c) \
344 BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,c) \
345 BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)
347 #define BBTK_GITIFPTI_DIM(DIM) \
348 if (pti == typeid(unsigned char)) \
349 return typeid(itk::Image<unsigned char,DIM>*); \
350 if (pti == typeid(unsigned short)) \
351 return typeid(itk::Image<unsigned short,DIM>*); \
352 if (pti == typeid(unsigned int)) \
353 return typeid(itk::Image<unsigned int,DIM>*); \
354 if (pti == typeid(unsigned long)) \
355 return typeid(itk::Image<unsigned long,DIM>*); \
356 if (pti == typeid(signed char)) \
357 return typeid(itk::Image<signed char,DIM>*); \
358 if (pti == typeid(signed short)) \
359 return typeid(itk::Image<signed short,DIM>*); \
360 if (pti == typeid(signed int)) \
361 return typeid(itk::Image<signed int,DIM>*); \
362 if (pti == typeid(signed long)) \
363 return typeid(itk::Image<signed long,DIM>*); \
364 if (pti == typeid(float)) \
365 return typeid(itk::Image<float,DIM>*); \
366 if (pti == typeid(double)) \
367 return typeid(itk::Image<double,DIM>*);
370 inline bbtk::TypeInfo GetITKImagePtrTypeInfoFromPixelTypeInfoAndDimension(
374 if (dim==2) { BBTK_GITIFPTI_DIM(2); }
375 else if (dim==3) { BBTK_GITIFPTI_DIM(3); }
376 else if (dim==4) { BBTK_GITIFPTI_DIM(4); }
379 //bbtkGlobalError("GetImageTypeInfoFromPixelTypeInfo : itk::Images not compiled for dim "<<dim);
386 #undef BBTK_GITIFPTI_DIM
390 template <typename ValueType>
396 template <typename T>
399 return m_map[ (void*)typeid(T).name() ];
401 template <typename T>
402 ValueType& operator[]( const T& )
404 return m_map[ (void*)typeid(T).name() ];
407 ValueType& operator[]( const std::type_info& t)
409 return m_map[ (void*)t.name() ];
412 unsigned int size() const { return m_map.size(); }
414 typedef typename std::map<void*, ValueType>::const_iterator const_iterator;
416 const_iterator begin() const { return m_map.begin(); }
417 const_iterator end() const { return m_map.end(); }
420 std::map<void*, ValueType> m_map;
423 #define BBTK_BUILD_ITK_IMAGE_FUNCTION_MAPPING(MAP,FUN) \
424 MAP.value<bbtk::Image_int8_t_2_ptr>() = FUN<bbtk::Image_int8_t_2_ptr>; \
425 MAP.value<bbtk::Image_int16_t_2_ptr>() = FUN<bbtk::Image_int16_t_2_ptr>; \
426 MAP.value<bbtk::Image_int32_t_2_ptr>() = FUN<bbtk::Image_int32_t_2_ptr>; \
427 MAP.value<bbtk::Image_uint8_t_2_ptr>() = FUN<bbtk::Image_uint8_t_2_ptr>; \
428 MAP.value<bbtk::Image_uint16_t_2_ptr>() = FUN<bbtk::Image_uint16_t_2_ptr>; \
429 MAP.value<bbtk::Image_uint32_t_2_ptr>() = FUN<bbtk::Image_uint32_t_2_ptr>; \
430 MAP.value<bbtk::Image_float_2_ptr>() = FUN<bbtk::Image_float_2_ptr>; \
431 MAP.value<bbtk::Image_double_2_ptr>() = FUN<bbtk::Image_double_2_ptr>; \
432 MAP.value<bbtk::Image_int8_t_3_ptr>() = FUN<bbtk::Image_int8_t_3_ptr>; \
433 MAP.value<bbtk::Image_int16_t_3_ptr>() = FUN<bbtk::Image_int16_t_3_ptr>; \
434 MAP.value<bbtk::Image_int32_t_3_ptr>() = FUN<bbtk::Image_int32_t_3_ptr>; \
435 MAP.value<bbtk::Image_uint8_t_3_ptr>() = FUN<bbtk::Image_uint8_t_3_ptr>; \
436 MAP.value<bbtk::Image_uint16_t_3_ptr>() = FUN<bbtk::Image_uint16_t_3_ptr>; \
437 MAP.value<bbtk::Image_uint32_t_3_ptr>() = FUN<bbtk::Image_uint32_t_3_ptr>; \
438 MAP.value<bbtk::Image_float_3_ptr>() = FUN<bbtk::Image_float_3_ptr>; \
439 MAP.value<bbtk::Image_double_3_ptr>() = FUN<bbtk::Image_double_3_ptr>; \
440 MAP.value<bbtk::Image_int8_t_4_ptr>() = FUN<bbtk::Image_int8_t_4_ptr>; \
441 MAP.value<bbtk::Image_int16_t_4_ptr>() = FUN<bbtk::Image_int16_t_4_ptr>; \
442 MAP.value<bbtk::Image_int32_t_4_ptr>() = FUN<bbtk::Image_int32_t_4_ptr>; \
443 MAP.value<bbtk::Image_uint8_t_4_ptr>() = FUN<bbtk::Image_uint8_t_4_ptr>; \
444 MAP.value<bbtk::Image_uint16_t_4_ptr>() = FUN<bbtk::Image_uint16_t_4_ptr>; \
445 MAP.value<bbtk::Image_uint32_t_4_ptr>() = FUN<bbtk::Image_uint32_t_4_ptr>; \
446 MAP.value<bbtk::Image_float_4_ptr>() = FUN<bbtk::Image_float_4_ptr>; \
447 MAP.value<bbtk::Image_double_4_ptr>() = FUN<bbtk::Image_double_4_ptr>;
449 //=======================================================================
452 //=======================================================================
453 // Type traits ImagePointer to define bbtk::any<ImagePointer>
454 /// The TypeTraits for all itk::Image pointer types
455 template <typename T> struct ImagePointer { static const bool value = false; };
457 typedef bbtk::any<ImagePointer> anyImagePointer;
459 // Specialisations for instantiated image types
461 #ifdef BBTK_ITK_IMAGE_DIM_2
462 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
463 template <> struct ImagePointer<Image_int8_t_2_ptr> { static const bool value = true; };
465 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
466 template <> struct ImagePointer<Image_int16_t_2_ptr> { static const bool value = true; };
468 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
469 template <> struct ImagePointer<Image_int32_t_2_ptr> { static const bool value = true; };
471 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
472 template <> struct ImagePointer<Image_uint8_t_2_ptr> { static const bool value = true; };
474 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
475 template <> struct ImagePointer<Image_uint16_t_2_ptr> { static const bool value = true; };
477 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
478 template <> struct ImagePointer<Image_uint32_t_2_ptr> { static const bool value = true; };
480 # ifdef BBTK_ITK_IMAGE_TYPE_float
481 template <> struct ImagePointer<Image_float_2_ptr> { static const bool value = true; };
483 # ifdef BBTK_ITK_IMAGE_TYPE_double
484 template <> struct ImagePointer<Image_double_2_ptr> { static const bool value = true; };
490 #ifdef BBTK_ITK_IMAGE_DIM_3
491 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
492 template <> struct ImagePointer<Image_int8_t_3_ptr> { static const bool value = true; };
494 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
495 template <> struct ImagePointer<Image_int16_t_3_ptr> { static const bool value = true; };
497 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
498 template <> struct ImagePointer<Image_int32_t_3_ptr> { static const bool value = true; };
500 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
501 template <> struct ImagePointer<Image_uint8_t_3_ptr> { static const bool value = true; };
503 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
504 template <> struct ImagePointer<Image_uint16_t_3_ptr> { static const bool value = true; };
506 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
507 template <> struct ImagePointer<Image_uint32_t_3_ptr> { static const bool value = true; };
509 # ifdef BBTK_ITK_IMAGE_TYPE_float
510 template <> struct ImagePointer<Image_float_3_ptr> { static const bool value = true; };
512 # ifdef BBTK_ITK_IMAGE_TYPE_double
513 template <> struct ImagePointer<Image_double_3_ptr> { static const bool value = true; };
519 #ifdef BBTK_ITK_IMAGE_DIM_4
520 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
521 template <> struct ImagePointer<Image_int8_t_4_ptr> { static const bool value = true; };
523 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
524 template <> struct ImagePointer<Image_int16_t_4_ptr> { static const bool value = true; };
526 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
527 template <> struct ImagePointer<Image_int32_t_4_ptr> { static const bool value = true; };
529 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
530 template <> struct ImagePointer<Image_uint8_t_4_ptr> { static const bool value = true; };
532 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
533 template <> struct ImagePointer<Image_uint16_t_4_ptr> { static const bool value = true; };
535 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
536 template <> struct ImagePointer<Image_uint32_t_4_ptr> { static const bool value = true; };
538 # ifdef BBTK_ITK_IMAGE_TYPE_float
539 template <> struct ImagePointer<Image_float_4_ptr> { static const bool value = true; };
541 # ifdef BBTK_ITK_IMAGE_TYPE_double
542 template <> struct ImagePointer<Image_double_4_ptr> { static const bool value = true; };
551 BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::anyImagePointer,"anyItkImagePointer");
552 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_2_ptr,"itkImageDouble3ptr");
553 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_3_ptr,"itkImageDouble3ptr");
555 // Human readable names for itk images
556 // #define BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) std::string("itkImage")+HumanTypeName<TYPE>()+std::string(#DIM)+std::string("ptr")
558 #define BBTK_HUMAN_READABLE_ITK_IMAGE(TYPE,DIM) \
559 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >() \
560 { std::string n("itkImage"); \
561 n+= HumanTypeName<TYPE>(); \
562 n += std::string(#DIM); \
563 n += std::string("ptr"); \
565 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >(const bbitk::Image_##TYPE##_##DIM##_ptr &) \
566 { std::string n("itkImage");\
567 n+= HumanTypeName<TYPE>(); \
568 n += std::string(#DIM); \
569 n+= std::string("ptr"); \
571 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >() \
572 { std::string n("itkImage"); \
573 n+= HumanTypeName<TYPE>();\
574 n += std::string(#DIM);\
575 n += std::string("cptr"); \
577 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >(const bbitk::Image_##TYPE##_##DIM##_cptr &) \
578 { std::string n("itkImage");\
579 n+= HumanTypeName<TYPE>(); \
580 n += std::string(#DIM); \
581 n+= std::string("cptr"); \
584 //BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,2);
586 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_##TYPE##_##DIM##_ptr,BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) )
589 #define BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(DIM) \
590 BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,DIM); \
591 BBTK_HUMAN_READABLE_ITK_IMAGE(uint8_t,DIM); \
592 BBTK_HUMAN_READABLE_ITK_IMAGE(int16_t,DIM); \
593 BBTK_HUMAN_READABLE_ITK_IMAGE(uint16_t,DIM);\
594 BBTK_HUMAN_READABLE_ITK_IMAGE(int32_t,DIM); \
595 BBTK_HUMAN_READABLE_ITK_IMAGE(uint32_t,DIM);\
596 BBTK_HUMAN_READABLE_ITK_IMAGE(float,DIM); \
597 BBTK_HUMAN_READABLE_ITK_IMAGE(double,DIM)
599 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(2);
600 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(3);
601 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(4);
602 //BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(5)