// gdcmFile.cxx
//-----------------------------------------------------------------------------
#include "gdcmFile.h"
-#include "gdcmUtil.h"
+#include "gdcmDebug.h"
#include "jpeg/ljpg/jpegless.h"
typedef std::pair<TagHeaderEntryHT::iterator,TagHeaderEntryHT::iterator> IterHT;
* @param header file to be opened for reading datas
* @return
*/
-
gdcmFile::gdcmFile(gdcmHeader *header) {
Header=header;
SelfHeader=false;
* 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.
/**
* \ingroup gdcmFile
* \brief canonical destructor
- * \Note If the gdcmHeader is created by the gdcmFile, it is destroyed
+ * \note If the gdcmHeader is created by the gdcmFile, it is destroyed
* by the gdcmFile
*/
gdcmFile::~gdcmFile(void) {
* 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
std::string rgb= "MONOCHROME1 "; // Photometric Interpretation
Header->SetEntryByNumber(rgb,0x0028,0x0004);
}
- // TODO : Drop Palette Color out of the Header?
+ /// \todo Drop Palette Color out of the Header?
return lgrTotale;
}
*/
void * gdcmFile::GetImageDataRaw (void) {
if (Header->HasLUT())
- lgrTotale /= 3; // TODO Let gdcmHeadar user a chance
- // to get the right value
- // Create a member lgrTotaleRaw ???
- PixelData = (void *) malloc(lgrTotale);
+ /// \todo Let gdcmHeadar user a chance to get the right value
+ /// Create a member lgrTotaleRaw ???
+ lgrTotale /= 3;
+ 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;
unsigned char * c = b + l;
double R,G,B;
- // TODO : Replace by the 'well known'
- // integer computation counterpart
- // see http://lestourtereaux.free.fr/papers/data/yuvrgb.pdf
- // for code optimisation
+ /// \todo : Replace by the 'well known' integer computation
+ /// counterpart
+ /// see http://lestourtereaux.free.fr/papers/data/yuvrgb.pdf
+ /// for code optimisation
for (int i=0;i<nbFrames;i++) {
for (int j=0;j<l; j++) {
}
}
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;
}
std::string planConfig = "0"; // Planar Configuration
Header->SetEntryByNumber(planConfig,0x0028,0x0006);
- // TODO : Drop Palette Color out of the Header?
+ /// \todo Drop Palette Color out of the Header?
return lgrTotale;
}
* (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;
}
// --------------------------------------------------------------
// we reproduce on disk the switch between lineNumber and columnNumber
// just before writting ...
- // TODO : the best trick would be *change* the recognition code
- // but pb expected if user deals with, e.g. COMPLEX images
+ /// \todo the best trick would be *change* the recognition code
+ /// but pb expected if user deals with, e.g. COMPLEX images
std::string rows, columns;
if ( Header->GetFileType() == ACR_LIBIDO){
}
// ----------------- End of Special Patch ----------------
- // TODO : get the grPixel, numPixel values (for some ACR-NEMA images only)
+ /// \todo get the grPixel, numPixel values (for some ACR-NEMA images only)
guint16 grPixel =Header->GetGrPixel();
guint16 numPixel=Header->GetNumPixel();;
//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);
}