]> Creatis software - gdcm.git/blobdiff - vtk/vtkGdcmReader.cxx
ENH: Add a new flag to vtkGdcmReader: AllowLookupTable, user can now select if he...
[gdcm.git] / vtk / vtkGdcmReader.cxx
index 0b240f61ba8e7ef5e19fab6276d5a34b6dce8031..ea4545a02a57c104cbe938be545d633b254083be 100644 (file)
@@ -63,6 +63,7 @@
 vtkGdcmReader::vtkGdcmReader()
 {
    this->LookupTable = NULL;
+   this->AllowLookupTable = 0;
 }
 
 vtkGdcmReader::~vtkGdcmReader()
@@ -122,6 +123,7 @@ void vtkGdcmReader::SetFileName(const char *name)
    // Since we maintain a list of filenames, when building a volume,
    // (see vtkGdcmReader::AddFileName), we additionaly need to purge
    // this list when we manually positionate the filename.
+   vtkDebugMacro("Clearing all files given with AddFileName");
    this->FileNameList.clear();
    this->Modified();
 }
@@ -319,10 +321,26 @@ void vtkGdcmReader::ExecuteData(vtkDataObject *output)
  */
 void vtkGdcmReader::BuildFileListFromPattern()
 {
+   this->RemoveAllInternalFileName();
+
    if ((! this->FileNameList.empty()) && this->FileName )
    {
-      vtkErrorMacro("Both file patterns and AddFileName schemes were used");
-      vtkErrorMacro("Only the files specified with AddFileName shall be used");
+      vtkErrorMacro("Both AddFileName and SetFileName schemes were used");
+      vtkErrorMacro("No images loaded ! ");
+      return;
+   }
+
+   if ((! this->FileNameList.empty()) && this->FilePrefix )
+   {
+      vtkErrorMacro("Both AddFileName and SetFilePrefix schemes were used");
+      vtkErrorMacro("No images loaded ! ");
+      return;
+   }
+
+   if (this->FileName && this->FilePrefix)
+   {
+      vtkErrorMacro("Both SetFileName and SetFilePrefix schemes were used");
+      vtkErrorMacro("No images loaded ! ");
       return;
    }
 
@@ -333,24 +351,24 @@ void vtkGdcmReader::BuildFileListFromPattern()
       return;
    }
 
-   if (!this->FileName && !this->FilePattern)
+   if (!this->FileName && !this->FilePrefix)
    {
       vtkErrorMacro("FileNames are not set. Either use AddFileName() or");
-      vtkErrorMacro("specify a FileName or FilePattern.");
+      vtkErrorMacro("specify a FileName or FilePrefix.");
       return;
    }
 
-   this->RemoveAllInternalFileName();
-   if( this->FileNameList.empty() )
+   if( this->FileName )
    {
-      //Multiframe case:
+      // Single file loading (as given with ::SetFileName()):
+      // Case of multi-frame file considered here
       this->ComputeInternalFileName(this->DataExtent[4]);
       vtkDebugMacro("Adding file " << this->InternalFileName);
       this->AddInternalFileName(this->InternalFileName);
    }
    else
    {
-      //stack of 2D dicom case:
+      // Multi file loading (as given with ::SetFilePattern()):
       for (int idx = this->DataExtent[4]; idx <= this->DataExtent[5]; ++idx)
       {
          this->ComputeInternalFileName(idx);
@@ -422,7 +440,6 @@ int vtkGdcmReader::CheckFileCoherence()
       }
       fclose(fp);
 
-      cout << " Try to gdcmHeader ... " << endl;   
       // Stage 1.2: check for Gdcm parsability
       gdcmHeaderHelper GdcmHeader(FileName->c_str(), false, true);
       //                             true : for enableSequences
@@ -513,8 +530,9 @@ int vtkGdcmReader::CheckFileCoherence()
          this->ImageType = type;
          this->PixelSize = GdcmHeader.GetPixelSize();
 
-         if( GdcmHeader.HasLUT() )
+         if( GdcmHeader.HasLUT() && this->AllowLookupTable )
          {
+            // I could raise an error is AllowLookupTable is on and HasLUT() off
             this->NumComponents = GdcmHeader.GetNumberOfScalarComponentsRaw();
          }
          else
@@ -608,7 +626,7 @@ size_t vtkGdcmReader::LoadImageInMemory(
 
    unsigned char * Source;
    
-   if( GdcmFile.GetHeader()->HasLUT() )
+   if( GdcmFile.GetHeader()->HasLUT() && this->AllowLookupTable )
    {
       size               = GdcmFile.GetImageDataSizeRaw();
       Source             = (unsigned char*) GdcmFile.GetImageDataRaw();
@@ -635,7 +653,8 @@ size_t vtkGdcmReader::LoadImageInMemory(
    {
       size        = GdcmFile.GetImageDataSize();
       Source      = (unsigned char*)GdcmFile.GetImageData();
-   }
+   } 
+   
    unsigned char * pSource     = Source; //pointer for later deletion
    unsigned char * Destination = Dest + size - LineSize;
 
@@ -655,6 +674,16 @@ size_t vtkGdcmReader::LoadImageInMemory(
          UpdateProgressCount++;
       }
    }
+   
+// DO NOT remove this commented out code .
+// Nobody knows what's expecting you ...
+// Just to 'see' what was actually read on disk :-(
+
+//   FILE * f2;
+//   f2 = fopen("SpuriousFile.RAW","wb");
+//   fwrite(Dest,size,1,f2);
+//   fclose(f2); 
+   
    //GetImageData allocate a (void*)malloc, remove it:
    free(pSource);
    return size;