X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vtk%2FvtkGdcmReader.cxx;h=11d9f68076f835e9ec4a2a770822ae1ffe973d20;hb=967978854b861e9b06fbd89b93e77d9ed984cce2;hp=0b240f61ba8e7ef5e19fab6276d5a34b6dce8031;hpb=c11dce1faf0053eb984aed57f01e6b7d29cbd1ab;p=gdcm.git diff --git a/vtk/vtkGdcmReader.cxx b/vtk/vtkGdcmReader.cxx index 0b240f61..11d9f680 100644 --- a/vtk/vtkGdcmReader.cxx +++ b/vtk/vtkGdcmReader.cxx @@ -58,11 +58,15 @@ #include #include +vtkCxxRevisionMacro(vtkGdcmReader, "$Revision: 1.46 $"); +vtkStandardNewMacro(vtkGdcmReader); + //----------------------------------------------------------------------------- // Constructor / Destructor vtkGdcmReader::vtkGdcmReader() { this->LookupTable = NULL; + this->AllowLookupTable = 0; } vtkGdcmReader::~vtkGdcmReader() @@ -122,6 +126,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(); } @@ -259,9 +264,9 @@ void vtkGdcmReader::ExecuteData(vtkDataObject *output) { // The memory size for a full stack of images of course depends // on the number of planes and the size of each image: - size_t StackNumPixels = this->NumColumns * this->NumLines - * this->TotalNumberOfPlanes * this->NumComponents; - size_t stack_size = StackNumPixels * this->PixelSize; + //size_t StackNumPixels = this->NumColumns * this->NumLines + // * this->TotalNumberOfPlanes * this->NumComponents; + //size_t stack_size = StackNumPixels * this->PixelSize; //not used // Allocate pixel data space itself. // Variables for the UpdateProgress. We shall use 50 steps to signify @@ -319,10 +324,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 +354,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,9 +443,8 @@ int vtkGdcmReader::CheckFileCoherence() } fclose(fp); - cout << " Try to gdcmHeader ... " << endl; // Stage 1.2: check for Gdcm parsability - gdcmHeaderHelper GdcmHeader(FileName->c_str(), false, true); + gdcmHeader GdcmHeader(FileName->c_str(), false, true); // true : for enableSequences if (!GdcmHeader.IsReadable()) { @@ -513,8 +533,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 +629,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 +656,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,8 +677,18 @@ 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); + delete[] pSource; return size; }