- // 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;
- size_t stack_size = StackNumPixels * this->PixelSize;
- // Allocate pixel data space itself.
- unsigned char *mem = new unsigned char [stack_size];
-
- // Variables for the UpdateProgress. We shall use 50 steps to signify
- // the advance of the process:
- unsigned long UpdateProgressTarget = (unsigned long) ceil (this->NumLines
- * this->TotalNumberOfPlanes
- / 50.0);
- // The actual advance measure:
- unsigned long UpdateProgressCount = 0;
-
- // Feeling the allocated memory space with each image/volume:
- unsigned char * Dest = mem;
- for (std::list<std::string>::iterator FileName = FileNameList.begin();
- FileName != FileNameList.end();
- ++FileName)
- {
- // Images that were tagged as unreadable in CheckFileCoherence()
- // are substituted with a black image to let the caller visually
- // notice something wrong is going on:
- if (*FileName != "GDCM_UNREADABLE")
- {
- Dest += this->LoadImageInMemory(*FileName, Dest,
- UpdateProgressTarget,
- UpdateProgressCount);
- } else {
- // We insert a black image in the stack for the user to be aware that
- // this image/volume couldn't be loaded. We simply skip one image
- // size:
- Dest += this->NumColumns * this->NumLines * this->PixelSize;
- } // Else, file not loadable
-
- // Update progress related:
- UpdateProgressCount += this->NumLines;
- if (!(UpdateProgressCount%UpdateProgressTarget))
- {
- this->UpdateProgress(UpdateProgressCount/(50.0*UpdateProgressTarget));
- }
- } // Loop on files
-
- // The "size" of the vtkScalars data is expressed in number of points,
- // and is not the memory size representing those points:
- data->GetPointData()->GetScalars()->SetVoidArray(mem, StackNumPixels, 0);
- this->Modified();
+ // Test if output has valid extent
+ // Prevent memory errors
+ if((this->DataExtent[1]-this->DataExtent[0]>0) &&
+ (this->DataExtent[3]-this->DataExtent[2]>0) &&
+ (this->DataExtent[5]-this->DataExtent[4]>0))
+ {
+ // 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;
+ size_t stack_size = StackNumPixels * this->PixelSize;
+ // Allocate pixel data space itself.
+ unsigned char *mem = new unsigned char [stack_size];
+
+ // Variables for the UpdateProgress. We shall use 50 steps to signify
+ // the advance of the process:
+ unsigned long UpdateProgressTarget = (unsigned long) ceil (this->NumLines
+ * this->TotalNumberOfPlanes
+ / 50.0);
+ // The actual advance measure:
+ unsigned long UpdateProgressCount = 0;
+
+ // Feeling the allocated memory space with each image/volume:
+ unsigned char * Dest = mem;
+ for (std::list<std::string>::iterator FileName = InternalFileNameList.begin();
+ FileName != InternalFileNameList.end();
+ ++FileName)
+ {
+ // Images that were tagged as unreadable in CheckFileCoherence()
+ // are substituted with a black image to let the caller visually
+ // notice something wrong is going on:
+ if (*FileName != "GDCM_UNREADABLE")
+ {
+ // Update progress related for good files is made in LoadImageInMemory
+ Dest += this->LoadImageInMemory(*FileName, Dest,
+ UpdateProgressTarget,
+ UpdateProgressCount);
+ } else {
+ // We insert a black image in the stack for the user to be aware that
+ // this image/volume couldn't be loaded. We simply skip one image
+ // size:
+ Dest += this->NumColumns * this->NumLines * this->PixelSize;
+
+ // Update progress related for bad files:
+ UpdateProgressCount += this->NumLines;
+ if (UpdateProgressTarget > 0)
+ {
+ if (!(UpdateProgressCount%UpdateProgressTarget))
+ {
+ this->UpdateProgress(UpdateProgressCount/(50.0*UpdateProgressTarget));
+ }
+ }
+ } // Else, file not loadable
+
+ } // Loop on files
+
+ // The "size" of the vtkScalars data is expressed in number of points,
+ // and is not the memory size representing those points:
+ data->GetPointData()->GetScalars()->SetVoidArray(mem, StackNumPixels, 0);
+ this->Modified();
+ }