* one sets an a posteriori shadow dictionary (efficiency can be
* seen as a side effect).
* @param filename file to be opened for parsing
+ * @param exception_on_error whether we throw an exception or not
+ * @param enable_sequences = true to allow the header
+ * to be parsed *inside* the SeQuences,
+ * when they have an actual length
+ * \warning enable_sequences *has to be* true for reading PAPYRUS 3.0 files
+ * @param ignore_shadow to allow skipping the shadow elements,
+ * to save memory space.
+ * \warning The TRUE value for this param has to be used
+ * with a FALSE value for the 'enable_sequence' param.
+ * ('public elements' may be embedded in 'shadow Sequences')
*/
-gdcmFile::gdcmFile(std::string & filename) {
- Header=new gdcmHeader(filename.c_str());
+gdcmFile::gdcmFile(std::string & filename,
+ bool exception_on_error,
+ bool enable_sequences,
+ bool ignore_shadow) {
+ Header=new gdcmHeader(filename.c_str(),
+ exception_on_error,
+ enable_sequences,
+ ignore_shadow);
SelfHeader=true;
PixelRead=-1; // no ImageData read yet.
* one sets an a posteriori shadow dictionary (efficiency can be
* seen as a side effect).
* @param filename file to be opened for parsing
+ * @param exception_on_error whether we throw an exception or not
+ * @param enable_sequences = true to allow the header
+ * to be parsed *inside* the SeQuences,
+ * when they have an actual length
+ * \warning enable_sequences *has to be* true for reading PAPYRUS 3.0 files
+ * @param ignore_shadow to allow skipping the shadow elements,
+ * to save memory space.
+ * \warning The TRUE value for this param has to be used
+ * with a FALSE value for the 'enable_sequence' param.
+ * ('public elements' may be embedded in 'shadow Sequences')
*/
- gdcmFile::gdcmFile(const char * filename) {
- Header=new gdcmHeader(filename);
+ gdcmFile::gdcmFile(const char * filename,
+ bool exception_on_error,
+ bool enable_sequences,
+ bool ignore_shadow) {
+ Header=new gdcmHeader(filename,
+ exception_on_error,
+ enable_sequences,
+ ignore_shadow);
SelfHeader=true;
PixelRead=-1; // no ImageData read yet.
* NULL if alloc fails
*/
void * gdcmFile::GetImageData (void) {
- PixelData = (void *) malloc(lgrTotale);
+ PixelData = new char[lgrTotale];
if (PixelData)
GetImageDataIntoVector(PixelData, lgrTotale);
* failure e.g. MaxSize is lower than necessary.
*/
size_t gdcmFile::GetImageDataIntoVector (void* destination, size_t MaxSize) {
- size_t l = GetImageDataIntoVectorRaw (destination, MaxSize);
+ //size_t l = GetImageDataIntoVectorRaw (destination, MaxSize);
+ GetImageDataIntoVectorRaw (destination, MaxSize);
PixelRead=0 ; // no PixelRaw
if (!Header->HasLUT())
return lgrTotale;
// from Lut R + Lut G + Lut B
- unsigned char * newDest = (unsigned char *)malloc(lgrTotale);
+ unsigned char * newDest = new (unsigned char)[lgrTotale];
unsigned char * a = (unsigned char *)destination;
unsigned char * lutRGBA = Header->GetLUTRGBA();
if (lutRGBA) {
*a++ = lutRGBA[j+1];
*a++ = lutRGBA[j+2];
}
- free(newDest);
+ delete[] newDest;
// now, it's an RGB image
// Lets's write it in the Header
lgrTotale /= 3; // TODO Let gdcmHeadar user a chance
// to get the right value
// Create a member lgrTotaleRaw ???
- PixelData = (void *) malloc(lgrTotale);
+ PixelData = new char[lgrTotale];
if (PixelData)
GetImageDataIntoVectorRaw(PixelData, lgrTotale);
PixelRead=1; // PixelRaw
int l = Header->GetXSize()*Header->GetYSize();
int nbFrames = Header->GetZSize();
- unsigned char * newDest = (unsigned char*) malloc(lgrTotale);
+ unsigned char * newDest = new (unsigned char)[lgrTotale];
unsigned char *x = newDest;
unsigned char * a = (unsigned char *)destination;
unsigned char * b = a + l;
}
}
memmove(destination,newDest,lgrTotale);
- free(newDest);
+ delete[] newDest;
} else {
int l = Header->GetXSize()*Header->GetYSize()*Header->GetZSize();
- char * newDest = (char*) malloc(lgrTotale);
+ char * newDest = new char[lgrTotale];
char * x = newDest;
char * a = (char *)destination;
char * b = a + l;
*(x++) = *(c++);
}
memmove(destination,newDest,lgrTotale);
- free(newDest);
+ delete[] newDest;
}
break;
}
* (used by WriteDcmExplVR, WriteDcmImplVR, WriteAcr, etc)
* @param fileName name of the file to be created
* (any already existing file is overwritten)
- * @param type file type (ExplicitVR, ImplicitVR, DICOMDIR, ...)
+ * @param type file type (ExplicitVR, ImplicitVR, ...)
* @return false if write fails
*/
bool gdcmFile::WriteBase (std::string fileName, FileType type) {
FILE * fp1;
- if (PixelRead==-1 && type != DICOMDIR) {
-/* std::cout << "U never Read the pixels; U cannot write the file"
- << std::endl;*/
+ if (PixelRead==-1 && type != ExplicitVR) {
return false;
}
if ( (type == ImplicitVR) || (type == ExplicitVR) ) {
char * filePreamble;
// writing Dicom File Preamble
- filePreamble=(char*)calloc(128,1);
+ filePreamble=new char[128];
fwrite(filePreamble,128,1,fp1);
fwrite("DICM",4,1,fp1);
- free (filePreamble);
+ delete[] filePreamble;
}
// --------------------------------------------------------------
//PixelElement->SetPrintLevel(2);
//PixelElement->Print();
-
Header->Write(fp1, type);
// --------------------------------------------------------------
if (ln != 0) {
// What is it used for ?!?
- char *BasicOffsetTableItemValue = (char *)malloc(ln+1);
+ char *BasicOffsetTableItemValue = new char[ln+1];
fread(BasicOffsetTableItemValue,ln,1,fp);
}