]> Creatis software - clitk.git/blobdiff - common/clitkVoxImageIO.cxx
With ITK 5, add itkReadRawBytesAfterSwappingMacro and itkWriteRawBytesAfterSwappingMacro
[clitk.git] / common / clitkVoxImageIO.cxx
index a5b69ca711875098a4645e52af9662fd11ec5c01..568a95ce5136b46c2f725f7c30c72e902429dc1b 100644 (file)
@@ -1,3 +1,20 @@
+/*=========================================================================
+  Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
+
+  Authors belong to:
+  - University of LYON              http://www.universite-lyon.fr/
+  - Léon Bérard cancer center       http://www.centreleonberard.fr
+  - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
+
+  This software is distributed WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  PURPOSE.  See the copyright notices for more information.
+
+  It is distributed under dual licence
+
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+===========================================================================**/
 #ifndef CLITKVOXIMAGEIO_CXX
 #define CLITKVOXIMAGEIO_CXX
 /**
    * @file   clitkVoxImageIO.cxx
    * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
    * @date   17 May 2006 08:03:07
-   * 
-   * @brief  
-   * 
-   * 
+   *
+   * @brief
+   *
+   *
    -------------------------------------------------*/
 
 // clitk include
 #include "clitkCommon.h"
 
 // itk include (for itkReadRawBytesAfterSwappingMacro)
+#if ( ITK_VERSION_MAJOR < 5 )
 #include "itkRawImageIO.h"
+#else
+#include <itkByteSwapper.h>
+#endif
 
 //--------------------------------------------------------------------
 // Read Image Information
-void clitk::VoxImageIO::ReadImageInformation() {
+void clitk::VoxImageIO::ReadImageInformation()
+{
   // open file
   std::ifstream is;
-  clitk::openFileForReading(is, m_FileName);  
+  clitk::openFileForReading(is, m_FileName);
   // read magic number
-  std::string mn; 
-  is >> mn; 
+  std::string mn;
+  is >> mn;
   //DD(mn);
   if (mn != "VOX") {
     itkExceptionMacro(<<"read magic number '" << mn << "' while expect VOX");
-  }    
+  }
   // read vox file version
-  skipComment(is); 
-  is >> mn; 
+  skipComment(is);
+  is >> mn;
   //DD(mn);
   if (mn != "v2") {
     itkExceptionMacro(<<"read old format '" << mn << "'. TODO");
-  }  
-       
+  }
+
   // ONLY 3D IMAGES YET ...
 
   // read grid size/spacing
@@ -46,25 +68,25 @@ void clitk::VoxImageIO::ReadImageInformation() {
   itk::Vector<double,3> spacing;
   itk::Vector<double,3> origin;
   origin.Fill(0.0);
-  skipComment(is); 
-  is >> dim[0]; 
-  is >> dim[1]; 
+  skipComment(is);
+  is >> dim[0];
+  is >> dim[1];
   is >> dim[2];
   //DD(dim);
-  skipComment(is); 
+  skipComment(is);
   is >> spacing[0];
   is >> spacing[1];
   is >> spacing[2];
   //DD(spacing);
   skipComment(is);
-  int d; 
+  int d;
   is >> d;
   if (d != 3 && d != 2) {
     itkExceptionMacro(<<"could not read no " << d << "D image (only 2D and 3D). TODO");
   }
   // read data type
   skipComment(is);
-  std::string dataTypeName; 
+  std::string dataTypeName;
   is >> dataTypeName;
   //DD(dataTypeName);
 
@@ -84,7 +106,7 @@ void clitk::VoxImageIO::ReadImageInformation() {
   // set other information
   SetByteOrderToLittleEndian();
   SetPixelType(itk::ImageIOBase::SCALAR);
-  SetNumberOfComponents(1);  
+  SetNumberOfComponents(1);
 
   if (dataTypeName == "char") SetComponentType(itk::ImageIOBase::CHAR);
   else if (dataTypeName == "schar") SetComponentType(itk::ImageIOBase::CHAR);
@@ -97,16 +119,16 @@ void clitk::VoxImageIO::ReadImageInformation() {
   else if (dataTypeName == "float") SetComponentType(itk::ImageIOBase::FLOAT);
   else if (dataTypeName == "double") SetComponentType(itk::ImageIOBase::DOUBLE);
   else {
-    itkExceptionMacro(<<"Read failed: Wanted pixel type " 
-                     << "(char, uchar, short, ushort, int, uint, float, double)" 
-                     << " but read " << dataTypeName);
+    itkExceptionMacro(<<"Read failed: Wanted pixel type "
+                      << "(char, uchar, short, ushort, int, uint, float, double)"
+                      << " but read " << dataTypeName);
   }
 
 } ////
 
 //--------------------------------------------------------------------
 // Read Image Information
-bool clitk::VoxImageIO::CanReadFile(const char* FileNameToRead) 
+bool clitk::VoxImageIO::CanReadFile(const char* FileNameToRead)
 {
   std::string filename(FileNameToRead);
   std::string filenameext = GetExtension(filename);
@@ -116,7 +138,7 @@ bool clitk::VoxImageIO::CanReadFile(const char* FileNameToRead)
 
 //--------------------------------------------------------------------
 // Read Image Content
-void clitk::VoxImageIO::Read(void * buffer) 
+void clitk::VoxImageIO::Read(void * buffer)
 {
   // Adapted from itkRawImageIO
 
@@ -129,31 +151,59 @@ void clitk::VoxImageIO::Read(void * buffer)
   if ( file.fail() ) {
     itkExceptionMacro(<<"File seek failed (Vox Read)");
   }
-       
+
   unsigned long numberOfBytesToBeRead = GetComponentSize();
   for(unsigned int i=0; i<GetNumberOfDimensions(); i++) numberOfBytesToBeRead *= GetDimensions(i);
 
   //DD(numberOfBytesToBeRead);
-       
+
   if(!this->ReadBufferAsBinary(file, buffer, numberOfBytesToBeRead)) {
-    itkExceptionMacro(<<"Read failed: Wanted " 
-                     << numberOfBytesToBeRead
-                     << " bytes, but read " 
-                     << file.gcount() << " bytes.");
+    itkExceptionMacro(<<"Read failed: Wanted "
+                      << numberOfBytesToBeRead
+                      << " bytes, but read "
+                      << file.gcount() << " bytes.");
   }
   itkDebugMacro(<< "Reading Done");
 
   {
+#if ( ITK_VERSION_MAJOR < 5 )
     using namespace itk;
     // Swap bytes if necessary
-    if itkReadRawBytesAfterSwappingMacro( unsigned short, USHORT ) 
-      else if itkReadRawBytesAfterSwappingMacro( short, SHORT ) 
-       else if itkReadRawBytesAfterSwappingMacro( char, CHAR ) 
-         else if itkReadRawBytesAfterSwappingMacro( unsigned char, UCHAR ) 
-           else if itkReadRawBytesAfterSwappingMacro( unsigned int, UINT ) 
-             else if itkReadRawBytesAfterSwappingMacro( int, INT ) 
-               else if itkReadRawBytesAfterSwappingMacro( float, FLOAT ) 
-                 else if itkReadRawBytesAfterSwappingMacro( double, DOUBLE );
+    if itkReadRawBytesAfterSwappingMacro( unsigned short, USHORT )
+      else if itkReadRawBytesAfterSwappingMacro( short, SHORT )
+        else if itkReadRawBytesAfterSwappingMacro( char, CHAR )
+          else if itkReadRawBytesAfterSwappingMacro( unsigned char, UCHAR )
+            else if itkReadRawBytesAfterSwappingMacro( unsigned int, UINT )
+              else if itkReadRawBytesAfterSwappingMacro( int, INT )
+                else if itkReadRawBytesAfterSwappingMacro( float, FLOAT )
+                  else if itkReadRawBytesAfterSwappingMacro( double, DOUBLE );
+#else
+  #define itkReadRawBytesAfterSwappingMacro(StrongType, WeakType)   \
+    ( this->GetComponentType() == WeakType )                        \
+      {                                                             \
+      using InternalByteSwapperType = itk::ByteSwapper<StrongType>; \
+      if ( m_ByteOrder == LittleEndian )                            \
+        {                                                           \
+        InternalByteSwapperType::SwapRangeFromSystemToLittleEndian( \
+          (StrongType *)buffer, this->GetImageSizeInComponents() ); \
+        }                                                           \
+      else if ( m_ByteOrder == BigEndian )                          \
+        {                                                           \
+        InternalByteSwapperType::SwapRangeFromSystemToBigEndian(    \
+          (StrongType *)buffer, this->GetImageSizeInComponents() ); \
+        }                                                           \
+      }
+
+    // Swap bytes if necessary
+    if itkReadRawBytesAfterSwappingMacro( unsigned short, USHORT )
+      else if itkReadRawBytesAfterSwappingMacro( short, SHORT )
+        else if itkReadRawBytesAfterSwappingMacro( char, CHAR )
+          else if itkReadRawBytesAfterSwappingMacro( unsigned char, UCHAR )
+            else if itkReadRawBytesAfterSwappingMacro( unsigned int, UINT )
+              else if itkReadRawBytesAfterSwappingMacro( int, INT )
+                else if itkReadRawBytesAfterSwappingMacro( float, FLOAT )
+                  else if itkReadRawBytesAfterSwappingMacro( double, DOUBLE );
+#endif
   }
 }
 
@@ -172,13 +222,13 @@ void clitk::VoxImageIO::WriteImageInformation(bool keepOfStream)
   file << "VOX v2" << std::endl;
   // write grid size/spacing
   file << "# Size" << std::endl;
-  file << GetDimensions(0) << " " 
-       << GetDimensions(1) << " " 
+  file << GetDimensions(0) << " "
+       << GetDimensions(1) << " "
        << GetDimensions(2) << std::endl;
   file << "# Spacing" << std::endl;
-  file.precision(40);  
-  file << GetSpacing(0) << " " 
-       << GetSpacing(1) << " " 
+  file.precision(40);
+  file << GetSpacing(0) << " "
+       << GetSpacing(1) << " "
        << GetSpacing(2) << std::endl;
   file << "# Image dim" << std::endl << "3" << std::endl;
   file << "# Image type" << std::endl;
@@ -193,16 +243,16 @@ void clitk::VoxImageIO::WriteImageInformation(bool keepOfStream)
   else if (GetComponentType() == itk::ImageIOBase::FLOAT) dataTypeName = "float";
   else if (GetComponentType() == itk::ImageIOBase::DOUBLE) dataTypeName = "double";
   else {
-    itkExceptionMacro(<<"Write failed: Wanted pixel type " 
-                     << "(char, uchar, short, ushort, int, uint, float, double)" 
-                     << " but Vox is : " << dataTypeName);
+    itkExceptionMacro(<<"Write failed: Wanted pixel type "
+                      << "(char, uchar, short, ushort, int, uint, float, double)"
+                      << " but Vox is : " << dataTypeName);
   }
   file << dataTypeName << std::endl;
 
   // close file
-  if (!keepOfStream) file.close();     
+  if (!keepOfStream) file.close();
 }
-  
+
 //--------------------------------------------------------------------
 // Write Image Information
 bool clitk::VoxImageIO::CanWriteFile(const char* FileNameToWrite)
@@ -215,7 +265,7 @@ bool clitk::VoxImageIO::CanWriteFile(const char* FileNameToWrite)
 
 //--------------------------------------------------------------------
 // Write Image
-void clitk::VoxImageIO::Write(const void * buffer) 
+void clitk::VoxImageIO::Write(const void * buffer)
 {
   clitk::VoxImageIO::WriteImageInformation(true);
   SetByteOrderToLittleEndian();
@@ -225,18 +275,61 @@ void clitk::VoxImageIO::Write(const void * buffer)
   // (warning BigEndian / LittleEndian)
   const unsigned long numberOfBytes      = this->GetImageSizeInBytes();
   const unsigned long numberOfComponents = this->GetImageSizeInComponents();
-  // Swap bytes if necessary
+#if ( ITK_VERSION_MAJOR < 5 )
   using namespace itk;
-  if itkWriteRawBytesAfterSwappingMacro( unsigned short, USHORT ) 
-    else if itkWriteRawBytesAfterSwappingMacro( short, SHORT ) 
-      else if itkWriteRawBytesAfterSwappingMacro( char, CHAR ) 
-       else if itkWriteRawBytesAfterSwappingMacro( unsigned char, UCHAR ) 
-         else if itkWriteRawBytesAfterSwappingMacro( unsigned int, UINT ) 
-           else if itkWriteRawBytesAfterSwappingMacro( int, INT ) 
-             else if itkWriteRawBytesAfterSwappingMacro( float, FLOAT ) 
-               else if itkWriteRawBytesAfterSwappingMacro( double, DOUBLE ) ;
+  // Swap bytes if necessary
+  if itkWriteRawBytesAfterSwappingMacro( unsigned short, USHORT )
+    else if itkWriteRawBytesAfterSwappingMacro( short, SHORT )
+      else if itkWriteRawBytesAfterSwappingMacro( char, CHAR )
+        else if itkWriteRawBytesAfterSwappingMacro( unsigned char, UCHAR )
+          else if itkWriteRawBytesAfterSwappingMacro( unsigned int, UINT )
+            else if itkWriteRawBytesAfterSwappingMacro( int, INT )
+              else if itkWriteRawBytesAfterSwappingMacro( float, FLOAT )
+                else if itkWriteRawBytesAfterSwappingMacro( double, DOUBLE );
+#else
+#define itkWriteRawBytesAfterSwappingMacro(StrongType, WeakType)        \
+  ( this->GetComponentType() == WeakType )                              \
+    {                                                                   \
+    using InternalByteSwapperType = itk::ByteSwapper<StrongType>;       \
+    const SizeValueType numberOfPixels = numberOfBytes/(sizeof(StrongType)); \
+    if ( m_ByteOrder == LittleEndian )                                  \
+      {                                                                 \
+      StrongType *tempBuffer = new StrongType[numberOfPixels];          \
+      memcpy((char *)tempBuffer, buffer, numberOfBytes);          \
+      InternalByteSwapperType::SwapRangeFromSystemToLittleEndian(       \
+        (StrongType *)tempBuffer, numberOfComponents);                  \
+      file.write((char *)tempBuffer, numberOfBytes);                            \
+      delete[] tempBuffer;                                              \
+      }                                                                 \
+    else if ( m_ByteOrder == BigEndian )                                \
+      {                                                                 \
+      StrongType *tempBuffer = new StrongType[numberOfPixels];          \
+      memcpy((char *)tempBuffer, buffer, numberOfBytes);          \
+      InternalByteSwapperType::SwapRangeFromSystemToBigEndian(          \
+        (StrongType *)tempBuffer, numberOfComponents);                  \
+      file.write((char *)tempBuffer, numberOfBytes);                            \
+      delete[] tempBuffer;                                              \
+      }                                                                 \
+    else                                                                \
+      {                                                                 \
+      file.write(static_cast< const char * >( buffer ), numberOfBytes); \
+      }                                                                 \
+    }
+
+    // Swap bytes if necessary
+    if itkWriteRawBytesAfterSwappingMacro(unsigned short, USHORT)
+    else if itkWriteRawBytesAfterSwappingMacro(short, SHORT)
+    else if itkWriteRawBytesAfterSwappingMacro(char, CHAR)
+    else if itkWriteRawBytesAfterSwappingMacro(unsigned char, UCHAR)
+    else if itkWriteRawBytesAfterSwappingMacro(unsigned int, UINT)
+    else if itkWriteRawBytesAfterSwappingMacro(int, INT)
+    else if itkWriteRawBytesAfterSwappingMacro(long, LONG)
+    else if itkWriteRawBytesAfterSwappingMacro(unsigned long, ULONG)
+    else if itkWriteRawBytesAfterSwappingMacro(float, FLOAT)
+    else if itkWriteRawBytesAfterSwappingMacro(double, DOUBLE)
+#endif
   //-------------------------------------------
-         
+
   file.close();
 } ////