]> Creatis software - gdcm.git/blobdiff - vtk/vtkGdcmReader.cxx
minor re-indent
[gdcm.git] / vtk / vtkGdcmReader.cxx
index 94d3a213966bc5bde41706f3096dd47b6aae69cd..913f9a7417c29c0110f6a39ca8e119f30d5cd71e 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: vtkGdcmReader.cxx,v $
   Language:  C++
-  Date:      $Date: 2007/05/30 15:11:16 $
-  Version:   $Revision: 1.87 $
+  Date:      $Date: 2010/09/01 13:33:36 $
+  Version:   $Revision: 1.98 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
 // //////////////////////////////////////////////////////////////
 //
 //===>  Many users expect from vtkGdcmReader it 'orders' the images
-//     (that's the job of gdcm::SerieHelper ...)
+//     (that's the job of GDCM_NAME_SPACE::SerieHelper ...)
 //     When user *knows* the files with same Serie UID 
 //        have same sizes, same 'pixel' type, same color convention, ...
 //     the right way to proceed is as follow :
 //
-//      gdcm::SerieHelper *sh= new gdcm::SerieHelper();
+//      GDCM_NAME_SPACE::SerieHelper *sh= new GDCM_NAME_SPACE::SerieHelper();
 //      // if user wants *not* to load some parts of the file headers
 //      sh->SetLoadMode(loadMode);
+//
 //      // if user wants *not* to load some files 
 //      sh->AddRestriction(group, element, value, operator);
 //      sh->AddRestriction( ...
 //
 //      // if user wants to sort reverse order
 //      sh->SetSortOrderToReverse(); 
-//      // here, we suppose only the first Coherent File List is of interest
-//      gdcm::FileList *l = sh->GetFirstCoherentFileList();
+//
+//      // here, we suppose only the first 'Serie' is of interest
+//      // it's up to the user to decide !
+//      GDCM_NAME_SPACE::FileList *l = sh->GetFirstSingleSerieUIDFileSet();
+//
 //      // if user is doesn't trust too much the files with same Serie UID 
 //      if ( !sh->IsCoherent(l) )
 //         return; // not same sizes, same 'pixel' type -> stop
+//
+//      // WARNING : all  that follows works only with 'bona fide' Series
+//      // (In some Series; there are more than one 'orientation'
+//      // Don't expected to build a 'volume' with that!
+//      //
+//      // -> use sh->SplitOnOrientation(l)
+//      //  - or sh->SplitOnPosition(l), or SplitOnTagValue(l, gr, el) -
+//      // depending on what you want to do
+//      // and iterate on the various 'X Coherent File Sets'
+//
+//      // if user *knows* he has to drop the 'duplicates' images
+//      // (same Position)
+//      sh->SetDropDuplicatePositions(true);
+//
+//      // Sorting the list is mandatory
+//      // a side effect is to compute ZSpacing for the file set
 //      sh->OrderFileList(l);        // sort the list
 //
 //      vtkGdcmReader *reader = vtkGdcmReader::New();
+//
 //      // if user wants to modify pixel order (Mirror, TopDown, 90°Rotate, ...)
 //      // he has to supply the function that does the job 
 //      // (a *very* simple example is given in vtkgdcmSerieViewer.cxx)
 //      reader->SetUserFunction (userSuppliedFunction);
-//      // to pass a 'Coherent File List' as produced by gdcm::SerieHelper
+//
+//      // to pass a 'Coherent File List' as produced by GDCM_NAME_SPACE::SerieHelper
 //      reader->SetCoherentFileList(l); 
 //      reader->Update();
 //
@@ -70,7 +92,7 @@
 #include <vtkPointData.h>
 #include <vtkLookupTable.h>
 
-vtkCxxRevisionMacro(vtkGdcmReader, "$Revision: 1.87 $")
+vtkCxxRevisionMacro(vtkGdcmReader, "$Revision: 1.98 $")
 vtkStandardNewMacro(vtkGdcmReader)
 
 //-----------------------------------------------------------------------------
@@ -79,8 +101,8 @@ vtkGdcmReader::vtkGdcmReader()
 {
    this->LookupTable = NULL;
    this->AllowLookupTable = false;
-   this->AllowLightChecking = false;
-   this->LoadMode = gdcm::LD_ALL; // Load everything (possible values : 
+   //this->AllowLightChecking = false;
+   this->LoadMode = GDCM_NAME_SPACE::LD_ALL; // Load everything (possible values : 
                                   //  - LD_NOSEQ, 
                                   //  - LD_NOSHADOW,
                                   //  - LD_NOSHADOWSEQ)
@@ -89,6 +111,9 @@ vtkGdcmReader::vtkGdcmReader()
 
    this->OwnFile=true;
    // this->Execution=false; // For VTK5.0
+   
+   this->KeepOverlays = false;
+   this->FlipY = true; // to keep old behaviour
 }
 
 vtkGdcmReader::~vtkGdcmReader()
@@ -256,7 +281,7 @@ void vtkGdcmReader::ExecuteInformation()
          vtkDebugMacro(<< "32 bits signed image");
          this->SetDataScalarTypeToInt();
       }
-      else if ( ImageType == "FD" )
+      else if ( ImageType == "FD" )  // This is not genuine DICOM, but so usefull
       {
          vtkDebugMacro(<< "64 bits Double image");
          this->SetDataScalarTypeToDouble();
@@ -311,14 +336,14 @@ void vtkGdcmReader::ExecuteData(vtkDataObject *output)
 //}                           // end For VTK5.0
 
    data->AllocateScalars();  // For VTK5.0
+   
+#if (VTK_MAJOR_VERSION >= 5) || ( VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 2 )
+//#if (VTK_MAJOR_VERSION >= 5)
    if (this->UpdateExtentIsEmpty(output))
    {
       return;
    }
-   
-//void vtkGdcmReader::BuildData(vtkDataObject *output)  // For VTK5.0
-//{
-//   vtkImageData *data = this->AllocateOutputData(output);  // end For VTK5.0
+#endif
 
    data->GetPointData()->GetScalars()->SetName("DicomImage-Volume");
 
@@ -348,7 +373,7 @@ void vtkGdcmReader::ExecuteData(vtkDataObject *output)
       size_t size = this->NumColumns * this->NumLines * this->NumPlanes
                   * data->GetScalarSize() * this->NumComponents;
       unsigned char *Dest = (unsigned char *)data->GetScalarPointer();
-      for (std::vector<gdcm::File* >::iterator it =  InternalFileList.begin();
+      for (std::vector<GDCM_NAME_SPACE::File* >::iterator it =  InternalFileList.begin();
                                                it != InternalFileList.end();
                                              ++it)
       {
@@ -442,7 +467,7 @@ void vtkGdcmReader::BuildFileListFromPattern()
  */
 void vtkGdcmReader::LoadFileInformation()
 {
-   gdcm::File *file;
+   GDCM_NAME_SPACE::File *file;
    bool foundReference=false;
    std::string type;
 
@@ -466,7 +491,7 @@ void vtkGdcmReader::LoadFileInformation()
       fclose(fp);
 
       // Read the file
-      file=gdcm::File::New();
+      file=GDCM_NAME_SPACE::File::New();
       file->SetLoadMode( LoadMode );
       file->SetFileName(filename->c_str() );
       file->Load();
@@ -487,11 +512,12 @@ void vtkGdcmReader::LoadFileInformation()
       type = file->GetPixelType();
       if (   (type !=  "8U") && (type !=  "8S")
           && (type != "16U") && (type != "16S")
-          && (type != "32U") && (type != "32S") )
+          && (type != "32U") && (type != "32S")
+          && (type != "FD")  )                // Sure this one is NOT kosher
       {
          vtkErrorMacro(<< "Bad File Type for file " << filename->c_str() << "\n"
                        << "   File type found : " << type.c_str() 
-                       << " (might be 8U, 8S, 16U, 16S, 32U, 32S) \n"
+                       << " (might be 8U, 8S, 16U, 16S, 32U, 32S, FD) \n"
                        << "   Removing this file from read files");
          file->Delete();
          file=NULL;
@@ -548,7 +574,7 @@ void vtkGdcmReader::UpdateFileInformation()
  * These informations are required to specify the output image
  * caracteristics
  */
-void vtkGdcmReader::GetFileInformation(gdcm::File *file)
+void vtkGdcmReader::GetFileInformation(GDCM_NAME_SPACE::File *file)
 {
    // Get the image caracteristics
    this->NumColumns = file->GetXSize();
@@ -567,18 +593,18 @@ void vtkGdcmReader::GetFileInformation(gdcm::File *file)
    this->DataSpacing[1] = file->GetYSpacing();
    
    //  Most of the file headers have NO z spacing
-   //  It must be calculated from the whole gdcm::Serie (if any)
+   //  It must be calculated from the whole GDCM_NAME_SPACE::Serie (if any)
    //  using Jolinda Smith's algoritm.
-   //  see gdcm::SerieHelper::ImagePositionPatientOrdering()
+   //  see GDCM_NAME_SPACE::SerieHelper::ImagePositionPatientOrdering()
    if (CoherentFileList == 0)   
       this->DataSpacing[2] = file->GetZSpacing();
    else
    {
-       // Just because OrderFileList() is a member of gdcm::SerieHelper
+       // Just because OrderFileList() is a member of GDCM_NAME_SPACE::SerieHelper
        // we need to instanciate sh.
-      gdcm::SerieHelper *sh = gdcm::SerieHelper::New();
+      GDCM_NAME_SPACE::SerieHelper *sh = GDCM_NAME_SPACE::SerieHelper::New();
       sh->OrderFileList(CoherentFileList); // calls ImagePositionPatientOrdering()
-      DataSpacing[2] = sh->GetZSpacing();
+      this->DataSpacing[2] = sh->GetZSpacing();
       sh->Delete();         
    } 
 
@@ -621,7 +647,7 @@ void vtkGdcmReader::GetFileInformation(gdcm::File *file)
  *
  * \return True if the file match, False otherwise
  */
-bool vtkGdcmReader::TestFileInformation(gdcm::File *file)
+bool vtkGdcmReader::TestFileInformation(GDCM_NAME_SPACE::File *file)
 {
    int numColumns = file->GetXSize();
    int numLines   = file->GetYSize();
@@ -743,8 +769,8 @@ void vtkGdcmReader::IncrementProgress(const unsigned long updateProgressTarget,
 {
    vtkDebugMacro(<< "Copying to memory image [" << fileName.c_str() << "]");
 
-   gdcm::File *f;
-   f = new gdcm::File();
+   GDCM_NAME_SPACE::File *f;
+   f = new GDCM_NAME_SPACE::File();
    f->SetLoadMode( LoadMode );
    f->SetFileName( fileName.c_str() );
    f->Load( );
@@ -756,14 +782,14 @@ void vtkGdcmReader::IncrementProgress(const unsigned long updateProgressTarget,
 }*/
 
 /*
- * Loads the contents of the image/volume contained by gdcm::File* f at
+ * Loads the contents of the image/volume contained by GDCM_NAME_SPACE::File* f at
  * the Dest memory address. Returns the size of the data loaded.
  * \ param f File to consider. NULL if the file must be skiped
  * \remarks Assume that if (f != NULL) then its caracteristics match
  * with the previous ones
  */
 void vtkGdcmReader::LoadImageInMemory(
-             gdcm::File *f, 
+             GDCM_NAME_SPACE::File *f, 
              unsigned char *dest,
              const unsigned long updateProgressTarget,
              unsigned long &updateProgressCount)
@@ -771,9 +797,11 @@ void vtkGdcmReader::LoadImageInMemory(
    if(!f)
       return;
 
-   gdcm::FileHelper *fileH = gdcm::FileHelper::New( f );
+   GDCM_NAME_SPACE::FileHelper *fileH = GDCM_NAME_SPACE::FileHelper::New( f );
    fileH->SetUserFunction( UserFunction );
-
+   
+   fileH->SetKeepOverlays ( this->KeepOverlays);
+   
    int numColumns = f->GetXSize();
    int numLines   = f->GetYSize();
    int numPlanes  = f->GetZSize();
@@ -823,15 +851,20 @@ void vtkGdcmReader::LoadImageInMemory(
       this->LookupTable->SetRange(0,255);
       vtkDataSetAttributes *a = this->GetOutput()->GetPointData();
       a->GetScalars()->SetLookupTable(this->LookupTable);
-      free(lut);
+      delete[] lut;
    }
    else
    {
       //size = fileH->GetImageDataSize(); 
       // useless - just an accessor;  'size' unused
-      src  = (unsigned char*)fileH->GetImageData();  
-   } 
+      //if (this->GetFlipY())
+         src  = (unsigned char*)fileH->GetImageData();
+      //else
+      // very strange, but it doesn't work (I have to memcpy the pixels ?!?)
+      //   dest  = (unsigned char*)fileH->GetImageData();  
+   }
 
+if (this->GetFlipY()) {
    unsigned char *dst = dest + planeSize - lineSize;
    for (int plane = 0; plane < numPlanes; plane++)
    {
@@ -851,7 +884,11 @@ void vtkGdcmReader::LoadImageInMemory(
       }
       dst += 2 * planeSize;
    }
-
+}
+else // we don't flip (upside down) the image
+{
+  memcpy((void*)dest, (void*)src,  numPlanes * numLines * lineSize);
+}
    fileH->Delete();
 }