2 # ---------------------------------------------------------------------
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
6 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
10 # This software is governed by the CeCILL-B license under French law and
11 # abiding by the rules of distribution of free software. You can use,
12 # modify and/ or redistribute the software under the terms of the CeCILL-B
13 # license as circulated by CEA, CNRS and INRIA at the following URL
14 # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15 # or in the file LICENSE.txt.
17 # As a counterpart to the access to the source code and rights to copy,
18 # modify and redistribute granted by the license, users are provided only
19 # with a limited warranty and the software's author, the holder of the
20 # economic rights, and the successive licensors have only limited
23 # The fact that you are presently reading this means that you have had
24 # knowledge of the CeCILL-B license and that you accept its terms.
25 # ------------------------------------------------------------------------ */
28 /*=========================================================================
30 Module: $RCSfile: bbitkImage.h,v $
32 Date: $Date: 2012/11/16 08:50:39 $
33 Version: $Revision: 1.9 $
34 =========================================================================*/
41 #ifndef __BBITKIMAGE_H_INCLUDED__
42 #define __BBITKIMAGE_H_INCLUDED__
46 #include "bbtkSystem.h"
51 // bbtk typedefs for itk images
52 #define BBTK_TYPEDEF_ITK_IMAGE(TYPE,DIM) \
53 typedef itk::Image<TYPE,DIM> Image_##TYPE##_##DIM; \
54 typedef const Image_##TYPE##_##DIM Image_##TYPE##_##DIM##_c; \
55 typedef Image_##TYPE##_##DIM * Image_##TYPE##_##DIM##_ptr; \
56 typedef Image_##TYPE##_##DIM##_c * Image_##TYPE##_##DIM##_cptr;
59 #define BBTK_TYPEDEF_ITK_IMAGES_DIM(DIM) \
60 BBTK_TYPEDEF_ITK_IMAGE(int8_t,DIM); \
61 BBTK_TYPEDEF_ITK_IMAGE(uint8_t,DIM); \
62 BBTK_TYPEDEF_ITK_IMAGE(int16_t,DIM); \
63 BBTK_TYPEDEF_ITK_IMAGE(uint16_t,DIM); \
64 BBTK_TYPEDEF_ITK_IMAGE(int32_t,DIM); \
65 BBTK_TYPEDEF_ITK_IMAGE(uint32_t,DIM); \
66 BBTK_TYPEDEF_ITK_IMAGE(float,DIM); \
67 BBTK_TYPEDEF_ITK_IMAGE(double,DIM)
69 BBTK_TYPEDEF_ITK_IMAGES_DIM(2);
70 BBTK_TYPEDEF_ITK_IMAGES_DIM(3);
71 BBTK_TYPEDEF_ITK_IMAGES_DIM(4);
72 //BBTK_TYPEDEF_ITK_IMAGES_DIM(5)
76 #define BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
79 #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())<<">"); }
81 #define BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,MESSAGE) else { bbtkError(MESSAGE); }
83 /// Generic macro which calls a TEMPLATE_FUNCTION instanciated
84 /// on TEMPLATE_TYPE iff TYPE_INFO == typeid(TEST_TYPE).
85 /// This macro must be used (maybe several times) between a pair of BEGIN_TEMPLATE_SWITCH and END_TEMPLATE_SWITCH macros
88 //EED 2021-12-15 typeid comparation is not working in MacOs for objects declared in different libraries
89 // ex: itk <-> vtk templates convertion
91 #define TEMPLATE_SWITCH(TYPE_INFO,TEST_TYPE,TEMPLATE_FUNCTION,TEMPLATE_TYPE) \
92 else if ( strcmp(TYPE_INFO.name() , typeid(bbitk::TEST_TYPE).name() ) ==0 ) \
93 { TEMPLATE_FUNCTION<bbitk::TEMPLATE_TYPE>(); }
95 #define TEMPLATE_SWITCH(TYPE_INFO,TEST_TYPE,TEMPLATE_FUNCTION,TEMPLATE_TYPE) \
96 else if (TYPE_INFO == typeid(bbitk::TEST_TYPE)) \
97 { TEMPLATE_FUNCTION<bbitk::TEMPLATE_TYPE>(); }
102 #ifdef BBTK_ITK_IMAGE_DIM_2
103 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
104 # define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST) \
105 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_2_##CONST##ptr,FUN,Image_int8_t_2)
107 # define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST)
109 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
110 # define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST) \
111 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_2_##CONST##ptr,FUN,Image_int16_t_2)
113 # define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)
115 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
116 # define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST) \
117 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_2_##CONST##ptr,FUN,Image_int32_t_2)
119 # define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST)
121 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
122 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST) \
123 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_2_##CONST##ptr,FUN,Image_uint8_t_2)
125 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)
127 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
128 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST) \
129 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_2_##CONST##ptr,FUN,Image_uint16_t_2)
131 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)
133 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
134 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST) \
135 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_2_##CONST##ptr,FUN,Image_uint32_t_2)
137 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)
139 # ifdef BBTK_ITK_IMAGE_TYPE_float
140 # define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST) \
141 TEMPLATE_SWITCH(TYPE_INFO,Image_float_2_##CONST##ptr,FUN,Image_float_2)
143 # define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)
145 # ifdef BBTK_ITK_IMAGE_TYPE_double
146 # define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST) \
147 TEMPLATE_SWITCH(TYPE_INFO,Image_double_2_##CONST##ptr,FUN,Image_double_2)
149 # define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)
152 # define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST)
153 # define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)
154 # define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST)
155 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)
156 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)
157 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)
158 # define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)
159 # define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)
163 #ifdef BBTK_ITK_IMAGE_DIM_3
164 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
165 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST) \
166 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_3_##CONST##ptr,FUN,Image_int8_t_3)
168 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
170 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
171 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST) \
172 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_3_##CONST##ptr,FUN,Image_int16_t_3)
174 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
176 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
177 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST) \
178 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_3_##CONST##ptr,FUN,Image_int32_t_3)
180 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
182 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
183 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST) \
184 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_3_##CONST##ptr,FUN,Image_uint8_t_3)
186 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
188 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
189 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST) \
190 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_3_##CONST##ptr,FUN,Image_uint16_t_3)
192 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
194 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
195 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST) \
196 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_3_##CONST##ptr,FUN,Image_uint32_t_3)
198 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
200 # ifdef BBTK_ITK_IMAGE_TYPE_float
201 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST) \
202 TEMPLATE_SWITCH(TYPE_INFO,Image_float_3_##CONST##ptr,FUN,Image_float_3)
204 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
206 # ifdef BBTK_ITK_IMAGE_TYPE_double
207 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST) \
208 TEMPLATE_SWITCH(TYPE_INFO,Image_double_3_##CONST##ptr,FUN,Image_double_3)
210 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
213 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
214 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
215 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
216 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
217 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
218 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
219 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
220 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
224 #ifdef BBTK_ITK_IMAGE_DIM_4
225 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
226 # define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST) \
227 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_4_##CONST##ptr,FUN,Image_int8_t_4)
229 # define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST)
231 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
232 # define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST) \
233 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_4_##CONST##ptr,FUN,Image_int16_t_4)
235 # define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST)
237 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
238 # define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST) \
239 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_4_##CONST##ptr,FUN,Image_int32_t_4)
241 # define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST)
243 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
244 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST) \
245 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_4_##CONST##ptr,FUN,Image_uint8_t_4)
247 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST)
249 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
250 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST) \
251 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_4_##CONST##ptr,FUN,Image_uint16_t_4)
253 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)
255 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
256 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST) \
257 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_4_##CONST##ptr,FUN,Image_uint32_t_4)
259 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)
261 # ifdef BBTK_ITK_IMAGE_TYPE_float
262 # define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST) \
263 TEMPLATE_SWITCH(TYPE_INFO,Image_float_4_##CONST##ptr,FUN,Image_float_4)
265 # define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)
267 # ifdef BBTK_ITK_IMAGE_TYPE_double
268 # define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST) \
269 TEMPLATE_SWITCH(TYPE_INFO,Image_double_4_##CONST##ptr,FUN,Image_double_4)
271 # define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
274 # define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST)
275 # define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST)
276 # define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST)
277 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST)
278 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)
279 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)
280 # define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)
281 # define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
285 /// General macro which calls the template function FUN instanciated
286 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
287 #define BBTK_TEMPLATE_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
288 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
289 BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,) \
290 BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,) \
291 BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,) \
292 BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,) \
293 BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,) \
294 BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,) \
295 BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,) \
296 BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,) \
297 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,) \
298 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,) \
299 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,) \
300 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,) \
301 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,) \
302 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,) \
303 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,) \
304 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,) \
305 BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,) \
306 BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,) \
307 BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,) \
308 BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,) \
309 BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,) \
310 BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,) \
311 BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,) \
312 BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,) \
313 BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)
317 /// General macro which calls the template function FUN instanciated
318 /// 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_ITK_IMAGE_DIM_3_SWITCH(TYPE_INFO,FUN,ERROR_MESSAGE) \
320 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
321 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,) \
322 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,) \
323 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,) \
324 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,) \
325 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,) \
326 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,) \
327 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,) \
328 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,) \
329 BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,ERROR_MESSAGE)
332 /// General macro which calls the template function FUN instanciated
333 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
335 #define BBTK_TEMPLATE_CONST_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
336 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
337 BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,c) \
338 BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,c) \
339 BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,c) \
340 BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,c) \
341 BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,c) \
342 BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,c) \
343 BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,c) \
344 BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,c) \
345 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,c) \
346 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,c) \
347 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,c) \
348 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,c) \
349 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,c) \
350 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,c) \
351 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,c) \
352 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,c) \
353 BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,c) \
354 BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,c) \
355 BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,c) \
356 BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,c) \
357 BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,c) \
358 BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,c) \
359 BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,c) \
360 BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,c) \
361 BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)
363 #define BBTK_GITIFPTI_DIM(DIM) \
364 if (pti == typeid(unsigned char)) \
365 return typeid(itk::Image<unsigned char,DIM>*); \
366 if (pti == typeid(unsigned short)) \
367 return typeid(itk::Image<unsigned short,DIM>*); \
368 if (pti == typeid(unsigned int)) \
369 return typeid(itk::Image<unsigned int,DIM>*); \
370 if (pti == typeid(unsigned long)) \
371 return typeid(itk::Image<unsigned long,DIM>*); \
372 if (pti == typeid(signed char)) \
373 return typeid(itk::Image<signed char,DIM>*); \
374 if (pti == typeid(signed short)) \
375 return typeid(itk::Image<signed short,DIM>*); \
376 if (pti == typeid(signed int)) \
377 return typeid(itk::Image<signed int,DIM>*); \
378 if (pti == typeid(signed long)) \
379 return typeid(itk::Image<signed long,DIM>*); \
380 if (pti == typeid(float)) \
381 return typeid(itk::Image<float,DIM>*); \
382 if (pti == typeid(double)) \
383 return typeid(itk::Image<double,DIM>*);
386 inline bbtk::TypeInfo GetITKImagePtrTypeInfoFromPixelTypeInfoAndDimension(
390 if (dim==2) { BBTK_GITIFPTI_DIM(2); }
391 else if (dim==3) { BBTK_GITIFPTI_DIM(3); }
392 else if (dim==4) { BBTK_GITIFPTI_DIM(4); }
395 //bbtkGlobalError("GetImageTypeInfoFromPixelTypeInfo : itk::Images not compiled for dim "<<dim);
402 #undef BBTK_GITIFPTI_DIM
406 template <typename ValueType>
412 template <typename T>
415 return m_map[ (void*)typeid(T).name() ];
417 template <typename T>
418 ValueType& operator[]( const T& )
420 return m_map[ (void*)typeid(T).name() ];
423 ValueType& operator[]( const std::type_info& t)
425 return m_map[ (void*)t.name() ];
428 unsigned int size() const { return m_map.size(); }
430 typedef typename std::map<void*, ValueType>::const_iterator const_iterator;
432 const_iterator begin() const { return m_map.begin(); }
433 const_iterator end() const { return m_map.end(); }
436 std::map<void*, ValueType> m_map;
439 #define BBTK_BUILD_ITK_IMAGE_FUNCTION_MAPPING(MAP,FUN) \
440 MAP.value<bbtk::Image_int8_t_2_ptr>() = FUN<bbtk::Image_int8_t_2_ptr>; \
441 MAP.value<bbtk::Image_int16_t_2_ptr>() = FUN<bbtk::Image_int16_t_2_ptr>; \
442 MAP.value<bbtk::Image_int32_t_2_ptr>() = FUN<bbtk::Image_int32_t_2_ptr>; \
443 MAP.value<bbtk::Image_uint8_t_2_ptr>() = FUN<bbtk::Image_uint8_t_2_ptr>; \
444 MAP.value<bbtk::Image_uint16_t_2_ptr>() = FUN<bbtk::Image_uint16_t_2_ptr>; \
445 MAP.value<bbtk::Image_uint32_t_2_ptr>() = FUN<bbtk::Image_uint32_t_2_ptr>; \
446 MAP.value<bbtk::Image_float_2_ptr>() = FUN<bbtk::Image_float_2_ptr>; \
447 MAP.value<bbtk::Image_double_2_ptr>() = FUN<bbtk::Image_double_2_ptr>; \
448 MAP.value<bbtk::Image_int8_t_3_ptr>() = FUN<bbtk::Image_int8_t_3_ptr>; \
449 MAP.value<bbtk::Image_int16_t_3_ptr>() = FUN<bbtk::Image_int16_t_3_ptr>; \
450 MAP.value<bbtk::Image_int32_t_3_ptr>() = FUN<bbtk::Image_int32_t_3_ptr>; \
451 MAP.value<bbtk::Image_uint8_t_3_ptr>() = FUN<bbtk::Image_uint8_t_3_ptr>; \
452 MAP.value<bbtk::Image_uint16_t_3_ptr>() = FUN<bbtk::Image_uint16_t_3_ptr>; \
453 MAP.value<bbtk::Image_uint32_t_3_ptr>() = FUN<bbtk::Image_uint32_t_3_ptr>; \
454 MAP.value<bbtk::Image_float_3_ptr>() = FUN<bbtk::Image_float_3_ptr>; \
455 MAP.value<bbtk::Image_double_3_ptr>() = FUN<bbtk::Image_double_3_ptr>; \
456 MAP.value<bbtk::Image_int8_t_4_ptr>() = FUN<bbtk::Image_int8_t_4_ptr>; \
457 MAP.value<bbtk::Image_int16_t_4_ptr>() = FUN<bbtk::Image_int16_t_4_ptr>; \
458 MAP.value<bbtk::Image_int32_t_4_ptr>() = FUN<bbtk::Image_int32_t_4_ptr>; \
459 MAP.value<bbtk::Image_uint8_t_4_ptr>() = FUN<bbtk::Image_uint8_t_4_ptr>; \
460 MAP.value<bbtk::Image_uint16_t_4_ptr>() = FUN<bbtk::Image_uint16_t_4_ptr>; \
461 MAP.value<bbtk::Image_uint32_t_4_ptr>() = FUN<bbtk::Image_uint32_t_4_ptr>; \
462 MAP.value<bbtk::Image_float_4_ptr>() = FUN<bbtk::Image_float_4_ptr>; \
463 MAP.value<bbtk::Image_double_4_ptr>() = FUN<bbtk::Image_double_4_ptr>;
465 //=======================================================================
468 //=======================================================================
469 // Type traits ImagePointer to define bbtk::any<ImagePointer>
470 /// The TypeTraits for all itk::Image pointer types
471 template <typename T> struct ImagePointer { static const bool value = false; };
473 typedef bbtk::any<ImagePointer> anyImagePointer;
475 // Specialisations for instantiated image types
477 #ifdef BBTK_ITK_IMAGE_DIM_2
478 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
479 template <> struct ImagePointer<Image_int8_t_2_ptr> { static const bool value = true; };
481 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
482 template <> struct ImagePointer<Image_int16_t_2_ptr> { static const bool value = true; };
484 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
485 template <> struct ImagePointer<Image_int32_t_2_ptr> { static const bool value = true; };
487 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
488 template <> struct ImagePointer<Image_uint8_t_2_ptr> { static const bool value = true; };
490 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
491 template <> struct ImagePointer<Image_uint16_t_2_ptr> { static const bool value = true; };
493 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
494 template <> struct ImagePointer<Image_uint32_t_2_ptr> { static const bool value = true; };
496 # ifdef BBTK_ITK_IMAGE_TYPE_float
497 template <> struct ImagePointer<Image_float_2_ptr> { static const bool value = true; };
499 # ifdef BBTK_ITK_IMAGE_TYPE_double
500 template <> struct ImagePointer<Image_double_2_ptr> { static const bool value = true; };
506 #ifdef BBTK_ITK_IMAGE_DIM_3
507 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
508 template <> struct ImagePointer<Image_int8_t_3_ptr> { static const bool value = true; };
510 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
511 template <> struct ImagePointer<Image_int16_t_3_ptr> { static const bool value = true; };
513 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
514 template <> struct ImagePointer<Image_int32_t_3_ptr> { static const bool value = true; };
516 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
517 template <> struct ImagePointer<Image_uint8_t_3_ptr> { static const bool value = true; };
519 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
520 template <> struct ImagePointer<Image_uint16_t_3_ptr> { static const bool value = true; };
522 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
523 template <> struct ImagePointer<Image_uint32_t_3_ptr> { static const bool value = true; };
525 # ifdef BBTK_ITK_IMAGE_TYPE_float
526 template <> struct ImagePointer<Image_float_3_ptr> { static const bool value = true; };
528 # ifdef BBTK_ITK_IMAGE_TYPE_double
529 template <> struct ImagePointer<Image_double_3_ptr> { static const bool value = true; };
535 #ifdef BBTK_ITK_IMAGE_DIM_4
536 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
537 template <> struct ImagePointer<Image_int8_t_4_ptr> { static const bool value = true; };
539 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
540 template <> struct ImagePointer<Image_int16_t_4_ptr> { static const bool value = true; };
542 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
543 template <> struct ImagePointer<Image_int32_t_4_ptr> { static const bool value = true; };
545 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
546 template <> struct ImagePointer<Image_uint8_t_4_ptr> { static const bool value = true; };
548 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
549 template <> struct ImagePointer<Image_uint16_t_4_ptr> { static const bool value = true; };
551 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
552 template <> struct ImagePointer<Image_uint32_t_4_ptr> { static const bool value = true; };
554 # ifdef BBTK_ITK_IMAGE_TYPE_float
555 template <> struct ImagePointer<Image_float_4_ptr> { static const bool value = true; };
557 # ifdef BBTK_ITK_IMAGE_TYPE_double
558 template <> struct ImagePointer<Image_double_4_ptr> { static const bool value = true; };
567 BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::anyImagePointer,"anyItkImagePointer");
568 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_2_ptr,"itkImageDouble3ptr");
569 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_3_ptr,"itkImageDouble3ptr");
571 // Human readable names for itk images
572 // #define BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) std::string("itkImage")+HumanTypeName<TYPE>()+std::string(#DIM)+std::string("ptr")
574 #define BBTK_HUMAN_READABLE_ITK_IMAGE(TYPE,DIM) \
575 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >() \
576 { std::string n("itkImage"); \
577 n+= HumanTypeName<TYPE>(); \
578 n += std::string(#DIM); \
579 n += std::string("ptr"); \
581 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >(const bbitk::Image_##TYPE##_##DIM##_ptr &) \
582 { std::string n("itkImage");\
583 n+= HumanTypeName<TYPE>(); \
584 n += std::string(#DIM); \
585 n+= std::string("ptr"); \
587 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >() \
588 { std::string n("itkImage"); \
589 n+= HumanTypeName<TYPE>();\
590 n += std::string(#DIM);\
591 n += std::string("cptr"); \
593 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >(const bbitk::Image_##TYPE##_##DIM##_cptr &) \
594 { std::string n("itkImage");\
595 n+= HumanTypeName<TYPE>(); \
596 n += std::string(#DIM); \
597 n+= std::string("cptr"); \
600 //BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,2);
602 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_##TYPE##_##DIM##_ptr,BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) )
605 #define BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(DIM) \
606 BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,DIM); \
607 BBTK_HUMAN_READABLE_ITK_IMAGE(uint8_t,DIM); \
608 BBTK_HUMAN_READABLE_ITK_IMAGE(int16_t,DIM); \
609 BBTK_HUMAN_READABLE_ITK_IMAGE(uint16_t,DIM);\
610 BBTK_HUMAN_READABLE_ITK_IMAGE(int32_t,DIM); \
611 BBTK_HUMAN_READABLE_ITK_IMAGE(uint32_t,DIM);\
612 BBTK_HUMAN_READABLE_ITK_IMAGE(float,DIM); \
613 BBTK_HUMAN_READABLE_ITK_IMAGE(double,DIM)
615 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(2);
616 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(3);
617 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(4);
618 //BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(5)