]> Creatis software - cpPlugins.git/commitdiff
Now it compiles again on Windows.
authorLeonardo Florez Valencia <florez-l@javeriana.edu.co>
Tue, 15 Mar 2016 21:39:09 +0000 (16:39 -0500)
committerLeonardo Florez Valencia <florez-l@javeriana.edu.co>
Tue, 15 Mar 2016 21:39:09 +0000 (16:39 -0500)
14 files changed:
appli/bash/cpPlugins_HostCreator.cxx
appli/examples/example_LoadPluginsFile.cxx
lib/cpPlugins/CMakeLists.txt
lib/cpPlugins/Config.h.in
lib/cpPlugins/Interface.cxx
lib/cpPlugins/Interface.h
lib/cpPlugins_ITKInstances/ImageIterators_explicit_description.txt
lib/cpPlugins_ITKInstances/Image_explicit_description.txt
lib/third_party/tinyxml/CMakeLists.txt
lib/third_party/tinyxml/tinyxml2.h
plugins/cpPluginsImageFilters/BinaryThresholdImageFilter.cxx
plugins/cpPluginsImageFilters/HistogramThresholdImageFilter.cxx
plugins/cpPluginsImageFilters/OtsuThresholdImageFilter.cxx
plugins/cpPluginsImageFilters/OtsuThresholdImageFilter.h

index ee11adf24c667c3453baca007f984d2c88f88c46..445302fe9090bbe5d03d3f4664e96492dc56f070 100644 (file)
@@ -100,33 +100,34 @@ int main( int argc, char* argv[] )
   std::ofstream out_stream( argv[ 1 ] );
 
   // Write include section
-  out_stream
-    << "#include <map>" << std::endl
-    << "#include <set>" << std::endl;
   for( int i = 2; i < argc; ++i )
     out_stream << "#include \"" << argv[ i ] << "\"" <<std::endl;
 
   // Write init/finish section
-  out_stream
-    << std::endl
-    << "void __attribute__ ((constructor)) _initialize( )" << std::endl
-    << "{" << std::endl << "}" << std::endl << std::endl
-    << "void __attribute__ ((destructor)) _finalize( )" << std::endl
-    << "{" << std::endl << "}" << std::endl << std::endl;
+  /* TODO:
+     out_stream
+     << std::endl
+     << "void __attribute__ ((constructor)) _initialize( )" << std::endl
+     << "{" << std::endl << "}" << std::endl << std::endl
+     << "void __attribute__ ((destructor)) _finalize( )" << std::endl
+     << "{" << std::endl << "}" << std::endl;
+  */
 
   // Write access function
   out_stream
-    << "extern \"C\" std::map< std::string, std::set< std::string > > "
+    << std::endl
+    << "extern \"C\" __declspec(dllexport) const char* "
     << "cpPlugins_LoadedFilters( )" << std::endl << "{" << std::endl
-    << "  std::map< std::string, std::set< std::string > > classes;"
-    << std::endl;
+    << "  static std::string classes;"
+    << std::endl
+    << "  classes = \"\";" << std::endl;
   for( auto iIt = info.begin( ); iIt != info.end( ); ++iIt )
     for( auto jIt = iIt->second.begin( ); jIt != iIt->second.end( ); ++jIt )
       out_stream
-        << "  classes[ \"" << iIt->first
-        << "\" ].insert( \"" << jIt->first << "\" );" << std::endl;
+        << "  classes += std::string( \"" << iIt->first
+        << ":" << jIt->first << ";\" );" << std::endl;
   out_stream
-    << "  return( classes );" << std::endl
+    << "  return( classes.c_str( ) );" << std::endl
     << "}" << std::endl << std::endl;
 
   // Write creators
@@ -135,14 +136,12 @@ int main( int argc, char* argv[] )
     for( auto jIt = iIt->second.begin( ); jIt != iIt->second.end( ); ++jIt )
     {
       out_stream
-        << "extern \"C\" cpPlugins::ProcessObject::Pointer "
+        << "extern \"C\" __declspec(dllexport) void* "
         << iIt->first << "_" << jIt->first
         << "( )" << std::endl << "{" << std::endl
-        << std::endl
-        << "  cpPlugins::ProcessObject::Pointer p;" << std::endl
-        << "  " << jIt->second << "::" << jIt->first << "::Pointer f = "
-        << jIt->second << "::" << jIt->first << "::New( );" << std::endl
-        << "  p = f.GetPointer( );" << std::endl << "  return( p );"
+        << "  static " << jIt->second << "::" << jIt->first << "::Pointer f;" << std::endl
+        << "  f = " << jIt->second << "::" << jIt->first << "::New( );" << std::endl
+        << "  return( &f );"
         << std::endl;
       out_stream
         << "}" << std::endl << std::endl;
index ddef1706c063d34f77c452f6044e6ef43b875358..b9a281799c0042667f756b354fe15386d937501b 100644 (file)
@@ -19,7 +19,7 @@ int main( int argc, char* argv[] )
   catch( std::exception& err )
   {
     std::cerr
-      << "Error caught:"
+      << "Error caught: "
       << err.what( )
       << std::endl;
     return( 1 );
index 565c9c1db882348d52e330f5c3547a8b01c064e0..c35c81d34cbafb3eac4ccd63413313178372368b 100644 (file)
@@ -83,6 +83,7 @@ SET(
 
 SET(
   target_LIBRARIES
+  cpPlugins_tinyxml2
   cpPlugins_ITKInstances_Base
   cpPlugins_ITKInstances_Image
   cpPlugins_ITKInstances_ImageIterators
@@ -93,7 +94,6 @@ IF(NOT WIN32)
   SET(
     target_LIBRARIES
     ${target_LIBRARIES}
-    cpPlugins_tinyxml2
     dl
     )
 ENDIF(NOT WIN32)
index 75ae331c78387b5ea180f761fe0e68e78ca6fb00..54f0af4737e6739a33cbdf5a29f73253c7717bf2 100644 (file)
@@ -43,9 +43,9 @@
 #  ifndef WIN32_LEAN_AND_MEAN
 #    define WIN32_LEAN_AND_MEAN
 #  endif
-#  ifndef NOMINMAX
-#    define NOMINMAX
-#  endif
+#  define NOMINMAX
+#  include <windows.h>
+#  include <tchar.h>
 #elif defined( linux ) || defined( __linux )
 #  define cpPlugins_SYS_LINUX
 #  define cpPlugins_PLUGIN_PREFIX "lib"
index 259288243d5a309e803115bddb6e50a98645b210..611143e09d66ca6e170a44adb4edd73bcbc05e4b 100644 (file)
@@ -64,6 +64,7 @@ SaveConfiguration( const std::string& filename ) const
   for( ; dIt != this->m_DynLibraries.end( ); ++dIt )
     out << dIt->first << std::endl;
   out.close( );
+  return( true );
 }
 
 // -------------------------------------------------------------------------
@@ -104,7 +105,7 @@ LoadPluginFile( const std::string& filename )
       if( new_filter )
       {
         // Update filters container
-        TCreator creator = Self::_DLGetCreator( hnd, catIt->first, *clsIt );
+        auto creator = Self::_DLGetCreator( hnd, catIt->first, *clsIt );
         if( creator != NULL )
         {
           this->m_DynFilters[ catIt->first][ *clsIt ] =
@@ -146,13 +147,16 @@ UnloadAll( )
 cpPlugins::ProcessObject::Pointer cpPlugins::Interface::
 Create( const std::string& category, const std::string& name )
 {
-  cpPlugins::ProcessObject::Pointer filter = NULL;
+  typedef cpPlugins::ProcessObject::Pointer _TPointer;
+  _TPointer filter = NULL;
   auto catIt = this->m_DynFilters.find( category );
   if( catIt != this->m_DynFilters.end( ) )
   {
     auto clsIt = catIt->second.find( name );
     if( clsIt != catIt->second.end( ) )
-      filter = clsIt->second.second( );
+      filter =
+        ( reinterpret_cast< _TPointer* >( clsIt->second.second( ) ) )->
+        GetPointer( );
 
   } // fi
   return( filter );
@@ -177,29 +181,40 @@ cpPlugins::Interface::
 TFilters cpPlugins::Interface::
 _DLGetFilters( void* hnd )
 {
-  typedef const TFilters ( *f_t )( );
-
-  TFilters filters;
+  // Get descriptors
+  typedef const char* ( *f_t )( );
+  f_t f = NULL;
 #ifdef cpPlugins_SYS_WINDOWS
-  auto f = ( f_t )(
-    ::GetProcAddress( ( HMODULE )hnd, "cpPlugins_LoadedFilters" )
-    );
-  std::cout << f << std::endl;
+  f = ( f_t )( ::GetProcAddress( ( HMODULE )hnd, "cpPlugins_LoadedFilters" ) );
 #else // cpPlugins_SYS_WINDOWS
-  auto f = ( f_t ) dlsym( hnd, "cpPlugins_LoadedFilters" );
-  const char* err = dlerror( );
-  if( err != NULL )
+  f = ( f_t )( dlsym( hnd, "cpPlugins_LoadedFilters" ) );
+#endif // cpPlugins_SYS_WINDOWS
+  if( f == NULL )
   {
-    dlclose( hnd );
+    Self::_DLClose( hnd );
     throw std::runtime_error(
-      std::string(
-        "cpPlugins::Interface: Library not recognized as a cpPlugins library: "
-        ) + std::string( err )
+      "cpPlugins::Interface: Library not recognized as a cpPlugins library: "
       );
 
   } // fi
-#endif // cpPlugins_SYS_WINDOWS
-  filters = f( );
+  std::string descriptors = f( );
+
+  // Demangle descriptors
+  TFilters filters;
+  std::replace( descriptors.begin( ), descriptors.end( ), ';', ' ' );
+  std::istringstream str( descriptors );
+  while( str )
+  {
+    std::string value, category, name;
+    str >> value;
+    if( value == "" )
+      continue;
+    std::replace( value.begin( ), value.end( ), ':', ' ' );
+    std::istringstream value_str( value );
+    value_str >> category >> name;
+    filters[ category ].insert( name );
+
+  } // elihw
   return( filters );
 }
 
@@ -213,16 +228,16 @@ _DLGetCreator(
   TCreator c = NULL;
   std::string func_name = category + "_" + name;
 #ifdef cpPlugins_SYS_WINDOWS
-  // TODO:
+  c = ( TCreator )( ::GetProcAddress( ( HMODULE )hnd, func_name.c_str( ) ) );
 #else // cpPlugins_SYS_WINDOWS
-  c = ( TCreator )dlsym( hnd, func_name.c_str( ) );
+  c = ( TCreator )( dlsym( hnd, func_name.c_str( ) ) );
+#endif // cpPlugins_SYS_WINDOWS
   if( c == NULL )
     throw std::runtime_error(
       std::string( "cpPlugins::Interface: Class \"" ) +
       category + std::string( ":" ) + name +
       std::string( "\" does not have a valid creator function." )
       );
-#endif // cpPlugins_SYS_WINDOWS
   return( c );
 }
 
index 5dcd843ab00ff924f2d344a1a06c545d2fe15347..e2f5b0c814ed6d4381e89402bf1e1a66496e3126 100644 (file)
@@ -16,7 +16,7 @@ namespace cpPlugins
   public:
     typedef Interface Self;
 
-    typedef cpPlugins::ProcessObject::Pointer ( *TCreator )( );
+    typedef void* ( *TCreator )( );
     typedef std::pair< std::string, TCreator >               TDynFunc;
     typedef std::map< std::string, TDynFunc >                TDynFilter;
     typedef std::map< std::string, TDynFilter >              TDynFilters;
index 68e90fd3bc4a96b414288cb8e936ae55406fdcff..7221e6760985e0a0dd0451cc6f7fb791e579eefb 100644 (file)
@@ -43,6 +43,7 @@ c itk::ImageScanlineIterator< itk::Image< #1 , #2 > >
 c itk::ImageScanlineIterator< itk::Image< std::complex< #3 > , #2 > >
 c itk::ImageScanlineIterator< itk::Image< itk::RGBPixel< #1 > , #2 > >
 c itk::ImageScanlineIterator< itk::Image< itk::RGBAPixel< #1 > , #2 > >
+c #4 < itk::Image< #1 , #2 >, itk::Image< #1 , #2 > >
 c itk::ConstNeighborhoodIterator< itk::Image< #1 , #2 >, #4 < itk::Image< #1 , #2 >, itk::Image< #1 , #2 > > >
 c itk::NeighborhoodIterator< itk::Image< #1 , #2 >, #4 < itk::Image< #1 , #2 >, itk::Image< #1 , #2 > > >
 c itk::ConstShapedNeighborhoodIterator< itk::Image< #1 , #2 >, #4 < itk::Image< #1 , #2 >, itk::Image< #1 , #2 > > >
index dcad0a2e7725b8abc4e9db4482f62f6c9698386d..210e7bbe545b490bb46ce4e7553822b31d083597 100644 (file)
@@ -9,6 +9,7 @@ c itk::Neighborhood< #1 , #2 , itk::NeighborhoodAllocator< #1 > >
 c itk::Neighborhood< #5 , #2 , itk::NeighborhoodAllocator< #5 > >
 c itk::Statistics::Histogram< #1 >
 c itk::HistogramAlgorithmBase< itk::Statistics::Histogram< #1 > >
+c itk::ImageRegion< #2 >
 c itk::Image< #1 , #2 >
 c itk::Image< std::complex< #4 > , #2 >
 c itk::Image< itk::RGBPixel< #1 > , #2 >
index a66769f4ac2a24a57fc1bd2895e35ecdaeb0dbe3..6579b71295edcb1ab49abb643ec699e8c7ff9909 100644 (file)
@@ -1,4 +1,5 @@
 SET(lib_NAME cpPlugins_tinyxml2)\r
+SET(lib_DIR  third_party/tinyxml)\r
 \r
 IF(MSVC)\r
   ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)\r
@@ -10,7 +11,13 @@ SET_TARGET_PROPERTIES(
   VERSION "${prj_VER}"\r
   SOVERSION "${prj_sVER}"\r
   )\r
-\r
+GENERATE_EXPORT_HEADER(\r
+  ${lib_NAME}\r
+  BASE_NAME ${lib_NAME}\r
+  EXPORT_MACRO_NAME ${lib_NAME}_EXPORT\r
+  EXPORT_FILE_NAME ${PROJECT_BINARY_DIR}/lib/${lib_DIR}/${lib_NAME}_Export.h\r
+  STATIC_DEFINE ${lib_NAME}_BUILT_AS_STATIC\r
+  )\r
 INSTALL(\r
   TARGETS ${lib_NAME}\r
   RUNTIME DESTINATION bin\r
index fb7464a7790dc1d78f232f11a0207e086b9635b4..599669e3891b9eb29b24d27c2341d7040055a859 100644 (file)
@@ -96,6 +96,10 @@ static const int TIXML2_MAJOR_VERSION = 3;
 static const int TIXML2_MINOR_VERSION = 0;\r
 static const int TIXML2_PATCH_VERSION = 0;\r
 \r
+#include <tinyxml/cpPlugins_tinyxml2_Export.h>\r
+#undef TINYXML2_LIB\r
+#define TINYXML2_LIB cpPlugins_tinyxml2_EXPORT\r
+\r
 namespace tinyxml2\r
 {\r
 class XMLDocument;\r
index 6545d56750072111aa70e519d1f482d2d6f039bc..37342a58184b947d71682f05aeaecefe1500f6bb 100644 (file)
@@ -101,13 +101,12 @@ _GD1( _TImage* image )
   typedef itk::Image< _TBinaryPixel, _TImage::ImageDimension > _TBinaryImage;
   typedef itk::BinaryThresholdImageFilter< _TImage, _TBinaryImage > _F;
   typedef typename _TImage::PixelType _TP;
-  typedef typename _TBinaryImage::PixelType _UP;
 
   // Get parameters
   _TP lower_val = _TP( this->m_Parameters.GetReal( "LowerThresholdValue" ) );
   _TP upper_val = _TP( this->m_Parameters.GetReal( "UpperThresholdValue" ) );
-  _UP in_val    = _UP( this->m_Parameters.GetReal( "InsideValue" ) );
-  _UP out_val   = _UP( this->m_Parameters.GetReal( "OutsideValue" ) );
+  _TBinaryPixel in_val  = _TBinaryPixel( this->m_Parameters.GetReal( "InsideValue" ) );
+  _TBinaryPixel out_val = _TBinaryPixel( this->m_Parameters.GetReal( "OutsideValue" ) );
 
   // Configure filter
   _F* filter = this->_CreateITK< _F >( );
index f3addf451c0a00a0b1545ce1ee014b8369a1f99e..6d6608b57e2ef0e02cbc10986ed45f9830a1ee1a 100644 (file)
@@ -69,7 +69,6 @@ _GD1( _TImage* image )
 {
   typedef itk::HistogramThresholdImageFilter< _TImage, _TBinaryImage > _F;
   typedef typename _TImage::PixelType _TP;
-  typedef typename _TBinaryImage::PixelType _UP;
 
   // Get parameters
 
index 177d4645f219aa557cd7935680c519512073f3a4..b5dff63a9e44c9e76a26ad2abd36934c4a464cf5 100644 (file)
@@ -54,28 +54,26 @@ std::string cpPluginsImageFilters::OtsuThresholdImageFilter::
 _GD0( _TImage* image )
 {
   if( image != NULL )
-    return(
-      this->_GD1< _TImage, itk::Image< unsigned char, _TImage::ImageDimension > >( image )
-      );
+    return( this->_GD1< _TImage, unsigned char >( image ) );
   else
     return( "ImageFilters::OtsuThresholdImageFilter: No valid input image." );
 }
 
 // -------------------------------------------------------------------------
-template< class _TImage, class _TBinaryImage >
+template< class _TImage, class _TBinaryPixel >
 std::string cpPluginsImageFilters::OtsuThresholdImageFilter::
 _GD1( _TImage* image )
 {
-  typedef itk::OtsuThresholdImageFilter< _TImage, _TBinaryImage > _F;
-  typedef typename _TBinaryImage::PixelType _UP;
+  typedef itk::Image< _TBinaryPixel, _TImage::ImageDimension > _TBinaryImage;
+  typedef itk::OtsuThresholdImageFilter< _TImage, _TBinaryImage > _TFilter;
 
   // Get parameters
   unsigned int bins = this->m_Parameters.GetUint( "NumberOfHistogramBins" );
-  _UP in_val = _UP( this->m_Parameters.GetUint( "InsideValue" ) );
-  _UP out_val = _UP( this->m_Parameters.GetUint( "OutsideValue" ) );
+  _TBinaryPixel in_val = _TBinaryPixel( this->m_Parameters.GetUint( "InsideValue" ) );
+  _TBinaryPixel out_val = _TBinaryPixel( this->m_Parameters.GetUint( "OutsideValue" ) );
 
   // Configure filter
-  _F* filter = this->_CreateITK< _F >( );
+  _TFilter* filter = this->_CreateITK< _TFilter >( );
   filter->SetInput( image );
   filter->SetNumberOfHistogramBins( bins );
   filter->SetInsideValue( out_val ); // WARNING: these are inverted
index a583ad56e046f94f90260d9668a3e7f7923a4cf8..1eecbf3ff887985d474d78e70a1716bc87af79d2 100644 (file)
@@ -31,7 +31,7 @@ namespace cpPluginsImageFilters
     template< class _TImage >
       inline std::string _GD0( _TImage* image );
 
-    template< class _TImage, class _TBinaryImage >
+    template< class _TImage, class _TBinaryPixel >
       inline std::string _GD1( _TImage* image );
 
   private: