Program: bbtk
Module: $RCSfile: bbitkImage.h,v $
Language: C++
- Date: $Date: 2009/05/18 10:45:43 $
- Version: $Revision: 1.6 $
+ Date: $Date: 2009/06/24 08:08:57 $
+ Version: $Revision: 1.7 $
=========================================================================*/
/* ---------------------------------------------------------------------
namespace bbitk
{
-
+
// bbtk typedefs for itk images
#define BBTK_TYPEDEF_ITK_IMAGE(TYPE,DIM) \
typedef itk::Image<TYPE,DIM> Image_##TYPE##_##DIM; \
typedef const Image_##TYPE##_##DIM Image_##TYPE##_##DIM##_c; \
typedef Image_##TYPE##_##DIM * Image_##TYPE##_##DIM##_ptr; \
- typedef Image_##TYPE##_##DIM##_c * Image_##TYPE##_##DIM##_cptr;
+ typedef Image_##TYPE##_##DIM##_c * Image_##TYPE##_##DIM##_cptr;
#define BBTK_TYPEDEF_ITK_IMAGES_DIM(DIM) \
BBTK_TYPEDEF_ITK_IMAGES_DIM(3);
BBTK_TYPEDEF_ITK_IMAGES_DIM(4);
//BBTK_TYPEDEF_ITK_IMAGES_DIM(5)
-
-
-
+
+
+
#define BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) if (false) {}
-
+
#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())<<">"); }
#define BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,MESSAGE) else { bbtkError(MESSAGE); }
-
+
/// Generic macro which calls a TEMPLATE_FUNCTION instanciated
/// on TEMPLATE_TYPE iff TYPE_INFO == typeid(TEST_TYPE).
/// This macro must be used (maybe several times) between a pair of BEGIN_TEMPLATE_SWITCH and END_TEMPLATE_SWITCH macros
-#define TEMPLATE_SWITCH(TYPE_INFO,TEST_TYPE,TEMPLATE_FUNCTION,TEMPLATE_TYPE) \
- else if (TYPE_INFO == typeid(bbitk::TEST_TYPE)) \
+#define TEMPLATE_SWITCH(TYPE_INFO,TEST_TYPE,TEMPLATE_FUNCTION,TEMPLATE_TYPE) \
+ else if (TYPE_INFO == typeid(bbitk::TEST_TYPE)) \
{ TEMPLATE_FUNCTION<bbitk::TEMPLATE_TYPE>(); }
-
-
+
+
// DIMENSION 2
#ifdef BBTK_ITK_IMAGE_DIM_2
# ifdef BBTK_ITK_IMAGE_TYPE_int8_t
-# define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST) \
+# define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST) \
TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_2_##CONST##ptr,FUN,Image_int8_t_2)
# else
# define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST)
# endif
# ifdef BBTK_ITK_IMAGE_TYPE_int16_t
-# define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST) \
+# define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST) \
TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_2_##CONST##ptr,FUN,Image_int16_t_2)
# else
# define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)
# define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)
# endif
# ifdef BBTK_ITK_IMAGE_TYPE_int16_t
-# define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST) \
+# define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST) \
TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_2_##CONST##ptr,FUN,Image_uint16_t_2)
# else
# define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)
# define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)
# endif
# ifdef BBTK_ITK_IMAGE_TYPE_float
-# define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST) \
+# define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST) \
TEMPLATE_SWITCH(TYPE_INFO,Image_float_2_##CONST##ptr,FUN,Image_float_2)
# else
# define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)
# endif
# ifdef BBTK_ITK_IMAGE_TYPE_double
-# define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST) \
+# define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST) \
TEMPLATE_SWITCH(TYPE_INFO,Image_double_2_##CONST##ptr,FUN,Image_double_2)
# else
# define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)
// DIMENSION 3
#ifdef BBTK_ITK_IMAGE_DIM_3
# ifdef BBTK_ITK_IMAGE_TYPE_int8_t
-# define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST) \
+# define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST) \
TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_3_##CONST##ptr,FUN,Image_int8_t_3)
# else
# define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
# define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
# endif
# ifdef BBTK_ITK_IMAGE_TYPE_float
-# define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST) \
+# define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST) \
TEMPLATE_SWITCH(TYPE_INFO,Image_float_3_##CONST##ptr,FUN,Image_float_3)
# else
# define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
# endif
# ifdef BBTK_ITK_IMAGE_TYPE_double
-# define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST) \
+# define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST) \
TEMPLATE_SWITCH(TYPE_INFO,Image_double_3_##CONST##ptr,FUN,Image_double_3)
# else
# define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
# define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
# define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
#endif
-
-
+
+
// DIMENSION 4
#ifdef BBTK_ITK_IMAGE_DIM_4
# ifdef BBTK_ITK_IMAGE_TYPE_int8_t
-# define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST) \
+# define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST) \
TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_4_##CONST##ptr,FUN,Image_int8_t_4)
# else
# define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST)
# define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)
# endif
# ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
-# define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST) \
+# define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST) \
TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_4_##CONST##ptr,FUN,Image_uint32_t_4)
# else
# define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)
# endif
# ifdef BBTK_ITK_IMAGE_TYPE_float
-# define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST) \
+# define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST) \
TEMPLATE_SWITCH(TYPE_INFO,Image_float_4_##CONST##ptr,FUN,Image_float_4)
# else
# define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)
# endif
# ifdef BBTK_ITK_IMAGE_TYPE_double
-# define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST) \
+# define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST) \
TEMPLATE_SWITCH(TYPE_INFO,Image_double_4_##CONST##ptr,FUN,Image_double_4)
# else
# define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
# define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
#endif
-
+
/// General macro which calls the template function FUN instanciated
/// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
#define BBTK_TEMPLATE_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
/// General macro which calls the template function FUN instanciated
/// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
-#define BBTK_TEMPLATE_ITK_IMAGE_DIM_3_SWITCH(TYPE_INFO,FUN,ERROR_MESSAGE) \
+#define BBTK_TEMPLATE_ITK_IMAGE_DIM_3_SWITCH(TYPE_INFO,FUN,ERROR_MESSAGE) \
BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,) \
BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,) \
/// General macro which calls the template function FUN instanciated
/// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
-
-#define BBTK_TEMPLATE_CONST_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
+
+#define BBTK_TEMPLATE_CONST_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,c) \
BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,c) \
BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,c) \
BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,c) \
BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,c) \
- BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)
-
+ BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)
+
#define BBTK_GITIFPTI_DIM(DIM) \
if (pti == typeid(unsigned char)) \
return typeid(itk::Image<unsigned char,DIM>*); \
if (pti == typeid(float)) \
return typeid(itk::Image<float,DIM>*); \
if (pti == typeid(double)) \
- return typeid(itk::Image<double,DIM>*);
-
+ return typeid(itk::Image<double,DIM>*);
+
inline bbtk::TypeInfo GetITKImagePtrTypeInfoFromPixelTypeInfoAndDimension(
bbtk::TypeInfo pti,
else if (dim==4) { BBTK_GITIFPTI_DIM(4); }
else
{
- //bbtkGlobalError("GetImageTypeInfoFromPixelTypeInfo : itk::Images not compiled for dim "<<dim);
- return typeid(void);
+ //bbtkGlobalError("GetImageTypeInfoFromPixelTypeInfo : itk::Images not compiled for dim "<<dim);
+ return typeid(void);
}
return typeid(void);
}
protected:
std::map<void*, ValueType> m_map;
};
-
-#define BBTK_BUILD_ITK_IMAGE_FUNCTION_MAPPING(MAP,FUN) \
- MAP.value<bbtk::Image_int8_t_2_ptr>() = FUN<bbtk::Image_int8_t_2_ptr>; \
- MAP.value<bbtk::Image_int16_t_2_ptr>() = FUN<bbtk::Image_int16_t_2_ptr>; \
- MAP.value<bbtk::Image_int32_t_2_ptr>() = FUN<bbtk::Image_int32_t_2_ptr>; \
- MAP.value<bbtk::Image_uint8_t_2_ptr>() = FUN<bbtk::Image_uint8_t_2_ptr>; \
+
+#define BBTK_BUILD_ITK_IMAGE_FUNCTION_MAPPING(MAP,FUN) \
+ MAP.value<bbtk::Image_int8_t_2_ptr>() = FUN<bbtk::Image_int8_t_2_ptr>; \
+ MAP.value<bbtk::Image_int16_t_2_ptr>() = FUN<bbtk::Image_int16_t_2_ptr>; \
+ MAP.value<bbtk::Image_int32_t_2_ptr>() = FUN<bbtk::Image_int32_t_2_ptr>; \
+ MAP.value<bbtk::Image_uint8_t_2_ptr>() = FUN<bbtk::Image_uint8_t_2_ptr>; \
MAP.value<bbtk::Image_uint16_t_2_ptr>() = FUN<bbtk::Image_uint16_t_2_ptr>; \
MAP.value<bbtk::Image_uint32_t_2_ptr>() = FUN<bbtk::Image_uint32_t_2_ptr>; \
- MAP.value<bbtk::Image_float_2_ptr>() = FUN<bbtk::Image_float_2_ptr>; \
- MAP.value<bbtk::Image_double_2_ptr>() = FUN<bbtk::Image_double_2_ptr>; \
- MAP.value<bbtk::Image_int8_t_3_ptr>() = FUN<bbtk::Image_int8_t_3_ptr>; \
- MAP.value<bbtk::Image_int16_t_3_ptr>() = FUN<bbtk::Image_int16_t_3_ptr>; \
- MAP.value<bbtk::Image_int32_t_3_ptr>() = FUN<bbtk::Image_int32_t_3_ptr>; \
- MAP.value<bbtk::Image_uint8_t_3_ptr>() = FUN<bbtk::Image_uint8_t_3_ptr>; \
+ MAP.value<bbtk::Image_float_2_ptr>() = FUN<bbtk::Image_float_2_ptr>; \
+ MAP.value<bbtk::Image_double_2_ptr>() = FUN<bbtk::Image_double_2_ptr>; \
+ MAP.value<bbtk::Image_int8_t_3_ptr>() = FUN<bbtk::Image_int8_t_3_ptr>; \
+ MAP.value<bbtk::Image_int16_t_3_ptr>() = FUN<bbtk::Image_int16_t_3_ptr>; \
+ MAP.value<bbtk::Image_int32_t_3_ptr>() = FUN<bbtk::Image_int32_t_3_ptr>; \
+ MAP.value<bbtk::Image_uint8_t_3_ptr>() = FUN<bbtk::Image_uint8_t_3_ptr>; \
MAP.value<bbtk::Image_uint16_t_3_ptr>() = FUN<bbtk::Image_uint16_t_3_ptr>; \
MAP.value<bbtk::Image_uint32_t_3_ptr>() = FUN<bbtk::Image_uint32_t_3_ptr>; \
- MAP.value<bbtk::Image_float_3_ptr>() = FUN<bbtk::Image_float_3_ptr>; \
- MAP.value<bbtk::Image_double_3_ptr>() = FUN<bbtk::Image_double_3_ptr>; \
- MAP.value<bbtk::Image_int8_t_4_ptr>() = FUN<bbtk::Image_int8_t_4_ptr>; \
- MAP.value<bbtk::Image_int16_t_4_ptr>() = FUN<bbtk::Image_int16_t_4_ptr>; \
- MAP.value<bbtk::Image_int32_t_4_ptr>() = FUN<bbtk::Image_int32_t_4_ptr>; \
- MAP.value<bbtk::Image_uint8_t_4_ptr>() = FUN<bbtk::Image_uint8_t_4_ptr>; \
+ MAP.value<bbtk::Image_float_3_ptr>() = FUN<bbtk::Image_float_3_ptr>; \
+ MAP.value<bbtk::Image_double_3_ptr>() = FUN<bbtk::Image_double_3_ptr>; \
+ MAP.value<bbtk::Image_int8_t_4_ptr>() = FUN<bbtk::Image_int8_t_4_ptr>; \
+ MAP.value<bbtk::Image_int16_t_4_ptr>() = FUN<bbtk::Image_int16_t_4_ptr>; \
+ MAP.value<bbtk::Image_int32_t_4_ptr>() = FUN<bbtk::Image_int32_t_4_ptr>; \
+ MAP.value<bbtk::Image_uint8_t_4_ptr>() = FUN<bbtk::Image_uint8_t_4_ptr>; \
MAP.value<bbtk::Image_uint16_t_4_ptr>() = FUN<bbtk::Image_uint16_t_4_ptr>; \
MAP.value<bbtk::Image_uint32_t_4_ptr>() = FUN<bbtk::Image_uint32_t_4_ptr>; \
- MAP.value<bbtk::Image_float_4_ptr>() = FUN<bbtk::Image_float_4_ptr>; \
+ MAP.value<bbtk::Image_float_4_ptr>() = FUN<bbtk::Image_float_4_ptr>; \
MAP.value<bbtk::Image_double_4_ptr>() = FUN<bbtk::Image_double_4_ptr>;
-
+
//=======================================================================
// Human readable names for itk images
// #define BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) std::string("itkImage")+HumanTypeName<TYPE>()+std::string(#DIM)+std::string("ptr")
-#define BBTK_HUMAN_READABLE_ITK_IMAGE(TYPE,DIM) \
-template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >() \
- { std::string n("itkImage"); \
- n+= HumanTypeName<TYPE>();\
- n += std::string(#DIM);\
-n += std::string("ptr"); \
- return n; } \
+#define BBTK_HUMAN_READABLE_ITK_IMAGE(TYPE,DIM) \
+template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >() \
+ { std::string n("itkImage"); \
+ n+= HumanTypeName<TYPE>(); \
+ n += std::string(#DIM); \
+n += std::string("ptr"); \
+ return n; } \
template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >(const bbitk::Image_##TYPE##_##DIM##_ptr &) \
{ std::string n("itkImage");\
n+= HumanTypeName<TYPE>(); \