1 /*=========================================================================
3 Module: $RCSfile: bbitkImage.h,v $
5 Date: $Date: 2009/06/24 08:08:57 $
6 Version: $Revision: 1.7 $
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)
299 /// General macro which calls the template function FUN instanciated
300 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
301 #define BBTK_TEMPLATE_ITK_IMAGE_DIM_3_SWITCH(TYPE_INFO,FUN,ERROR_MESSAGE) \
302 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
303 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,) \
304 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,) \
305 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,) \
306 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,) \
307 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,) \
308 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,) \
309 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,) \
310 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,) \
311 BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,ERROR_MESSAGE)
314 /// General macro which calls the template function FUN instanciated
315 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
317 #define BBTK_TEMPLATE_CONST_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
318 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
319 BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,c) \
320 BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,c) \
321 BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,c) \
322 BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,c) \
323 BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,c) \
324 BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,c) \
325 BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,c) \
326 BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,c) \
327 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,c) \
328 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,c) \
329 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,c) \
330 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,c) \
331 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,c) \
332 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,c) \
333 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,c) \
334 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,c) \
335 BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,c) \
336 BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,c) \
337 BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,c) \
338 BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,c) \
339 BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,c) \
340 BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,c) \
341 BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,c) \
342 BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,c) \
343 BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)
345 #define BBTK_GITIFPTI_DIM(DIM) \
346 if (pti == typeid(unsigned char)) \
347 return typeid(itk::Image<unsigned char,DIM>*); \
348 if (pti == typeid(unsigned short)) \
349 return typeid(itk::Image<unsigned short,DIM>*); \
350 if (pti == typeid(unsigned int)) \
351 return typeid(itk::Image<unsigned int,DIM>*); \
352 if (pti == typeid(unsigned long)) \
353 return typeid(itk::Image<unsigned long,DIM>*); \
354 if (pti == typeid(signed char)) \
355 return typeid(itk::Image<signed char,DIM>*); \
356 if (pti == typeid(signed short)) \
357 return typeid(itk::Image<signed short,DIM>*); \
358 if (pti == typeid(signed int)) \
359 return typeid(itk::Image<signed int,DIM>*); \
360 if (pti == typeid(signed long)) \
361 return typeid(itk::Image<signed long,DIM>*); \
362 if (pti == typeid(float)) \
363 return typeid(itk::Image<float,DIM>*); \
364 if (pti == typeid(double)) \
365 return typeid(itk::Image<double,DIM>*);
368 inline bbtk::TypeInfo GetITKImagePtrTypeInfoFromPixelTypeInfoAndDimension(
372 if (dim==2) { BBTK_GITIFPTI_DIM(2); }
373 else if (dim==3) { BBTK_GITIFPTI_DIM(3); }
374 else if (dim==4) { BBTK_GITIFPTI_DIM(4); }
377 //bbtkGlobalError("GetImageTypeInfoFromPixelTypeInfo : itk::Images not compiled for dim "<<dim);
384 #undef BBTK_GITIFPTI_DIM
388 template <typename ValueType>
394 template <typename T>
397 return m_map[ (void*)typeid(T).name() ];
399 template <typename T>
400 ValueType& operator[]( const T& )
402 return m_map[ (void*)typeid(T).name() ];
405 ValueType& operator[]( const std::type_info& t)
407 return m_map[ (void*)t.name() ];
410 unsigned int size() const { return m_map.size(); }
412 typedef typename std::map<void*, ValueType>::const_iterator const_iterator;
414 const_iterator begin() const { return m_map.begin(); }
415 const_iterator end() const { return m_map.end(); }
418 std::map<void*, ValueType> m_map;
421 #define BBTK_BUILD_ITK_IMAGE_FUNCTION_MAPPING(MAP,FUN) \
422 MAP.value<bbtk::Image_int8_t_2_ptr>() = FUN<bbtk::Image_int8_t_2_ptr>; \
423 MAP.value<bbtk::Image_int16_t_2_ptr>() = FUN<bbtk::Image_int16_t_2_ptr>; \
424 MAP.value<bbtk::Image_int32_t_2_ptr>() = FUN<bbtk::Image_int32_t_2_ptr>; \
425 MAP.value<bbtk::Image_uint8_t_2_ptr>() = FUN<bbtk::Image_uint8_t_2_ptr>; \
426 MAP.value<bbtk::Image_uint16_t_2_ptr>() = FUN<bbtk::Image_uint16_t_2_ptr>; \
427 MAP.value<bbtk::Image_uint32_t_2_ptr>() = FUN<bbtk::Image_uint32_t_2_ptr>; \
428 MAP.value<bbtk::Image_float_2_ptr>() = FUN<bbtk::Image_float_2_ptr>; \
429 MAP.value<bbtk::Image_double_2_ptr>() = FUN<bbtk::Image_double_2_ptr>; \
430 MAP.value<bbtk::Image_int8_t_3_ptr>() = FUN<bbtk::Image_int8_t_3_ptr>; \
431 MAP.value<bbtk::Image_int16_t_3_ptr>() = FUN<bbtk::Image_int16_t_3_ptr>; \
432 MAP.value<bbtk::Image_int32_t_3_ptr>() = FUN<bbtk::Image_int32_t_3_ptr>; \
433 MAP.value<bbtk::Image_uint8_t_3_ptr>() = FUN<bbtk::Image_uint8_t_3_ptr>; \
434 MAP.value<bbtk::Image_uint16_t_3_ptr>() = FUN<bbtk::Image_uint16_t_3_ptr>; \
435 MAP.value<bbtk::Image_uint32_t_3_ptr>() = FUN<bbtk::Image_uint32_t_3_ptr>; \
436 MAP.value<bbtk::Image_float_3_ptr>() = FUN<bbtk::Image_float_3_ptr>; \
437 MAP.value<bbtk::Image_double_3_ptr>() = FUN<bbtk::Image_double_3_ptr>; \
438 MAP.value<bbtk::Image_int8_t_4_ptr>() = FUN<bbtk::Image_int8_t_4_ptr>; \
439 MAP.value<bbtk::Image_int16_t_4_ptr>() = FUN<bbtk::Image_int16_t_4_ptr>; \
440 MAP.value<bbtk::Image_int32_t_4_ptr>() = FUN<bbtk::Image_int32_t_4_ptr>; \
441 MAP.value<bbtk::Image_uint8_t_4_ptr>() = FUN<bbtk::Image_uint8_t_4_ptr>; \
442 MAP.value<bbtk::Image_uint16_t_4_ptr>() = FUN<bbtk::Image_uint16_t_4_ptr>; \
443 MAP.value<bbtk::Image_uint32_t_4_ptr>() = FUN<bbtk::Image_uint32_t_4_ptr>; \
444 MAP.value<bbtk::Image_float_4_ptr>() = FUN<bbtk::Image_float_4_ptr>; \
445 MAP.value<bbtk::Image_double_4_ptr>() = FUN<bbtk::Image_double_4_ptr>;
447 //=======================================================================
450 //=======================================================================
451 // Type traits ImagePointer to define bbtk::any<ImagePointer>
452 /// The TypeTraits for all itk::Image pointer types
453 template <typename T> struct ImagePointer { static const bool value = false; };
455 typedef bbtk::any<ImagePointer> anyImagePointer;
457 // Specialisations for instantiated image types
459 #ifdef BBTK_ITK_IMAGE_DIM_2
460 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
461 template <> struct ImagePointer<Image_int8_t_2_ptr> { static const bool value = true; };
463 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
464 template <> struct ImagePointer<Image_int16_t_2_ptr> { static const bool value = true; };
466 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
467 template <> struct ImagePointer<Image_int32_t_2_ptr> { static const bool value = true; };
469 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
470 template <> struct ImagePointer<Image_uint8_t_2_ptr> { static const bool value = true; };
472 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
473 template <> struct ImagePointer<Image_uint16_t_2_ptr> { static const bool value = true; };
475 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
476 template <> struct ImagePointer<Image_uint32_t_2_ptr> { static const bool value = true; };
478 # ifdef BBTK_ITK_IMAGE_TYPE_float
479 template <> struct ImagePointer<Image_float_2_ptr> { static const bool value = true; };
481 # ifdef BBTK_ITK_IMAGE_TYPE_double
482 template <> struct ImagePointer<Image_double_2_ptr> { static const bool value = true; };
488 #ifdef BBTK_ITK_IMAGE_DIM_3
489 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
490 template <> struct ImagePointer<Image_int8_t_3_ptr> { static const bool value = true; };
492 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
493 template <> struct ImagePointer<Image_int16_t_3_ptr> { static const bool value = true; };
495 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
496 template <> struct ImagePointer<Image_int32_t_3_ptr> { static const bool value = true; };
498 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
499 template <> struct ImagePointer<Image_uint8_t_3_ptr> { static const bool value = true; };
501 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
502 template <> struct ImagePointer<Image_uint16_t_3_ptr> { static const bool value = true; };
504 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
505 template <> struct ImagePointer<Image_uint32_t_3_ptr> { static const bool value = true; };
507 # ifdef BBTK_ITK_IMAGE_TYPE_float
508 template <> struct ImagePointer<Image_float_3_ptr> { static const bool value = true; };
510 # ifdef BBTK_ITK_IMAGE_TYPE_double
511 template <> struct ImagePointer<Image_double_3_ptr> { static const bool value = true; };
517 #ifdef BBTK_ITK_IMAGE_DIM_4
518 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
519 template <> struct ImagePointer<Image_int8_t_4_ptr> { static const bool value = true; };
521 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
522 template <> struct ImagePointer<Image_int16_t_4_ptr> { static const bool value = true; };
524 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
525 template <> struct ImagePointer<Image_int32_t_4_ptr> { static const bool value = true; };
527 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
528 template <> struct ImagePointer<Image_uint8_t_4_ptr> { static const bool value = true; };
530 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
531 template <> struct ImagePointer<Image_uint16_t_4_ptr> { static const bool value = true; };
533 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
534 template <> struct ImagePointer<Image_uint32_t_4_ptr> { static const bool value = true; };
536 # ifdef BBTK_ITK_IMAGE_TYPE_float
537 template <> struct ImagePointer<Image_float_4_ptr> { static const bool value = true; };
539 # ifdef BBTK_ITK_IMAGE_TYPE_double
540 template <> struct ImagePointer<Image_double_4_ptr> { static const bool value = true; };
549 BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::anyImagePointer,"anyItkImagePointer");
550 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_2_ptr,"itkImageDouble3ptr");
551 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_3_ptr,"itkImageDouble3ptr");
553 // Human readable names for itk images
554 // #define BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) std::string("itkImage")+HumanTypeName<TYPE>()+std::string(#DIM)+std::string("ptr")
556 #define BBTK_HUMAN_READABLE_ITK_IMAGE(TYPE,DIM) \
557 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >() \
558 { std::string n("itkImage"); \
559 n+= HumanTypeName<TYPE>(); \
560 n += std::string(#DIM); \
561 n += std::string("ptr"); \
563 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >(const bbitk::Image_##TYPE##_##DIM##_ptr &) \
564 { std::string n("itkImage");\
565 n+= HumanTypeName<TYPE>(); \
566 n += std::string(#DIM); \
567 n+= std::string("ptr"); \
569 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >() \
570 { std::string n("itkImage"); \
571 n+= HumanTypeName<TYPE>();\
572 n += std::string(#DIM);\
573 n += std::string("cptr"); \
575 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >(const bbitk::Image_##TYPE##_##DIM##_cptr &) \
576 { std::string n("itkImage");\
577 n+= HumanTypeName<TYPE>(); \
578 n += std::string(#DIM); \
579 n+= std::string("cptr"); \
582 //BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,2);
584 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_##TYPE##_##DIM##_ptr,BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) )
587 #define BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(DIM) \
588 BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,DIM); \
589 BBTK_HUMAN_READABLE_ITK_IMAGE(uint8_t,DIM); \
590 BBTK_HUMAN_READABLE_ITK_IMAGE(int16_t,DIM); \
591 BBTK_HUMAN_READABLE_ITK_IMAGE(uint16_t,DIM);\
592 BBTK_HUMAN_READABLE_ITK_IMAGE(int32_t,DIM); \
593 BBTK_HUMAN_READABLE_ITK_IMAGE(uint32_t,DIM);\
594 BBTK_HUMAN_READABLE_ITK_IMAGE(float,DIM); \
595 BBTK_HUMAN_READABLE_ITK_IMAGE(double,DIM)
597 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(2);
598 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(3);
599 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(4);
600 //BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(5)