X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmHeader.cxx;h=a3e31d31131425a27f34d2315656f5e5539d2142;hb=4aa1b564dbc367ea47737eaac09b39fa3ec3edf6;hp=f8aaef2a6a346ad7a61661490e05f31937f8e83f;hpb=b6e445adae1963909952eeef10ea7c1d2e0d3e0d;p=gdcm.git diff --git a/src/gdcmHeader.cxx b/src/gdcmHeader.cxx index f8aaef2a..a3e31d31 100644 --- a/src/gdcmHeader.cxx +++ b/src/gdcmHeader.cxx @@ -1,16 +1,6 @@ -// $Header: /cvs/public/gdcm/src/Attic/gdcmHeader.cxx,v 1.85 2003/09/24 11:37:10 jpr Exp $ +// $Header: /cvs/public/gdcm/src/Attic/gdcmHeader.cxx,v 1.95 2003/10/06 13:37:25 jpr Exp $ -//This is needed when compiling in debug mode -#ifdef _MSC_VER -//'identifier' : not all control paths return a value -//#pragma warning ( disable : 4715 ) -// 'identifier' : class 'type' needs to have dll-interface to be used by -// clients of class 'type2' -#pragma warning ( disable : 4251 ) -// 'identifier' : identifier was truncated to 'number' characters in the -// debug information -#pragma warning ( disable : 4786 ) -#endif //_MSC_VER +#include "gdcmHeader.h" #include #include @@ -23,7 +13,6 @@ #include // for isalpha #include #include "gdcmUtil.h" -#include "gdcmHeader.h" #include "gdcmTS.h" // Refer to gdcmHeader::CheckSwap() @@ -38,7 +27,7 @@ void gdcmHeader::Initialise(void) { dicom_vr = gdcmGlobal::GetVR(); dicom_ts = gdcmGlobal::GetTS(); - Dicts = gdcmGlobal::GetDicts(); + Dicts = gdcmGlobal::GetDicts(); RefPubDict = Dicts->GetDefaultPubDict(); RefShaDict = (gdcmDict*)0; } @@ -115,6 +104,13 @@ gdcmHeader::~gdcmHeader (void) { } // Fourth semantics: +// +// ---> Warning : This fourth fiels is NOT part +// of the 'official' Dicom Dictionnary +// and should NOT be used. +// (Not defined for all the groups +// may be removed in a future release) +// // CMD Command // META Meta Information // DIR Directory @@ -375,7 +371,8 @@ void gdcmHeader::FindVR( gdcmElValue *ElVal) { // We thought this was explicit VR, but we end up with an // implicit VR tag. Let's backtrack. - sprintf(msg,"Falsely explicit vr file (%04x,%04x)\n", ElVal->GetGroup(),ElVal->GetElement()); + sprintf(msg,"Falsely explicit vr file (%04x,%04x)\n", + ElVal->GetGroup(),ElVal->GetElement()); dbg.Verbose(1, "gdcmHeader::FindVR: ",msg); fseek(fp, PositionOnEntry, SEEK_SET); @@ -494,6 +491,8 @@ bool gdcmHeader::IsJPEGLossless(void) { const char * Transfert = Element->GetValue().c_str(); if ( memcmp(Transfert+strlen(Transfert)-2 ,"70",2)==0) return true; if ( memcmp(Transfert+strlen(Transfert)-2 ,"55",2)==0) return true; + if (Element->GetValue() == "1.2.840.10008.1.2.4.57") return true; + return false; } @@ -613,6 +612,11 @@ bool gdcmHeader::IsDicomV3(void) { void gdcmHeader::FixFoundLength(gdcmElValue * ElVal, guint32 FoundLength) { if ( FoundLength == 0xffffffff) FoundLength = 0; + // Sorry for the patch! + // XMedCom did the trick to read some nasty GE images ... + if (FoundLength == 13) + FoundLength =10; + ElVal->SetLength(FoundLength); } @@ -653,7 +657,8 @@ void gdcmHeader::FixFoundLength(gdcmElValue * ElVal, guint32 FoundLength) { FoundSequenceDelimiter = true; else if ( n != 0xe000 ){ char msg[100]; // for sprintf. Sorry - sprintf(msg,"wrong element (%04x) for an item sequence (%04x,%04x)\n",n, g,n); + sprintf(msg,"wrong element (%04x) for an item sequence (%04x,%04x)\n", + n, g,n); dbg.Verbose(1, "gdcmHeader::FindLengthOB: ",msg); errno = 1; return 0; @@ -677,12 +682,12 @@ void gdcmHeader::FixFoundLength(gdcmElValue * ElVal, guint32 FoundLength) { void gdcmHeader::FindLength (gdcmElValue * ElVal) { guint16 element = ElVal->GetElement(); guint16 group = ElVal->GetGroup(); - std::string vr = ElVal->GetVR(); + std::string vr = ElVal->GetVR(); guint16 length16; if( (element == 0x0010) && (group == 0x7fe0) ) { dbg.SetDebug(0); dbg.Verbose(2, "gdcmHeader::FindLength: ", - "on est sur 7fe0 0010"); + "we reached 7fe0 0010"); } if ( (filetype == ExplicitVR) && ! ElVal->IsImplicitVr() ) { @@ -694,6 +699,7 @@ void gdcmHeader::FixFoundLength(gdcmElValue * ElVal, guint32 FoundLength) { fseek(fp, 2L, SEEK_CUR); guint32 length32 = ReadInt32(); + if ( (vr == "OB") && (length32 == 0xffffffff) ) { ElVal->SetLength(FindLengthOB()); return; @@ -758,9 +764,12 @@ void gdcmHeader::FixFoundLength(gdcmElValue * ElVal, guint32 FoundLength) { // Heuristic: well some files are really ill-formed. if ( length16 == 0xffff) { length16 = 0; - dbg.Verbose(0, "gdcmHeader::FindLength", - "Erroneous element length fixed."); + //dbg.Verbose(0, "gdcmHeader::FindLength", + // "Erroneous element length fixed."); + // Actually, length= 0xffff means that we deal with + // Unknown Sequence Length } + FixFoundLength(ElVal, (guint32)length16); return; } @@ -861,7 +870,7 @@ guint16 gdcmHeader::SwapShort(guint16 a) { void gdcmHeader::LoadElementValue(gdcmElValue * ElVal) { size_t item_read; guint16 group = ElVal->GetGroup(); - std::string vr = ElVal->GetVR(); + std::string vr= ElVal->GetVR(); guint32 length = ElVal->GetLength(); bool SkipLoad = false; @@ -905,7 +914,7 @@ void gdcmHeader::LoadElementValue(gdcmElValue * ElVal) { // are not loaded. Instead we leave a short notice of the offset of // the element content and it's length. if (length > MaxSizeLoadElementValue) { - ostringstream s; + std::ostringstream s; s << "gdcm::NotLoaded."; s << " Address:" << (long)ElVal->GetOffset(); s << " Length:" << ElVal->GetLength(); @@ -922,7 +931,7 @@ void gdcmHeader::LoadElementValue(gdcmElValue * ElVal) { if ( IsAnInteger(ElVal) ) { guint32 NewInt; - ostringstream s; + std::ostringstream s; int nbInt; if (vr == "US" || vr == "SS") { nbInt = length / 2; @@ -1083,7 +1092,8 @@ gdcmElValue* gdcmHeader::NewElValueByNumber(guint16 Group, guint16 Elem) { * @param Elem * \return integer acts as a boolean */ -int gdcmHeader::ReplaceOrCreateByNumber(std::string Value, guint16 Group, guint16 Elem ) { +int gdcmHeader::ReplaceOrCreateByNumber(std::string Value, + guint16 Group, guint16 Elem ) { // TODO : FIXME JPRx // curieux, non ? @@ -1101,7 +1111,7 @@ int gdcmHeader::ReplaceOrCreateByNumber(std::string Value, guint16 Group, guint1 /** * \ingroup gdcmHeader - * \brief Modify or (Creates if not found) an element + * \brief Modify (or Creates if not found) an element * @param Value new value * @param Group * @param Elem @@ -1182,9 +1192,7 @@ gdcmElValue * gdcmHeader::ReadNextElement(void) { g = ReadInt16(); n = ReadInt16(); - - if ( (g==0x7fe0) && (n==0x0010) ) - + if (errno == 1) // We reached the EOF (or an error occured) and header parsing // has to be considered as finished. @@ -1198,7 +1206,7 @@ gdcmElValue * gdcmHeader::ReadNextElement(void) { return (gdcmElValue *)0; } NewElVal->SetOffset(ftell(fp)); - if ( (g==0x7fe0) && (n==0x0010) ) + //if ( (g==0x7fe0) && (n==0x0010) ) return NewElVal; } @@ -1543,7 +1551,8 @@ std::string gdcmHeader::GetElValRepByName(std::string TagName) { int gdcmHeader::SetPubElValByNumber(std::string content, guint16 group, guint16 element) -//TODO : homogeneiser les noms : SetPubElValByNumber qui appelle PubElValSet.SetElValueByNumber +//TODO : homogeneiser les noms : SetPubElValByNumber +// qui appelle PubElValSet.SetElValueByNumber // pourquoi pas SetPubElValueByNumber ?? { @@ -1654,7 +1663,8 @@ bool gdcmHeader::IsReadable(void) { * @param VR The Value Representation to be given to this new tag. * @ return The newly hand crafted Element Value. */ -gdcmElValue* gdcmHeader::NewManualElValToPubDict(std::string NewTagName, std::string VR) { +gdcmElValue* gdcmHeader::NewManualElValToPubDict(std::string NewTagName, + std::string VR) { gdcmElValue* NewElVal = (gdcmElValue*)0; guint32 StuffGroup = 0xffff; // Group to be stuffed with additional info guint32 FreeElem = 0; @@ -1763,16 +1773,16 @@ void * gdcmHeader::LoadElementVoidArea(guint16 Group, guint16 Elem) { int l=Element->GetLength(); void * a = malloc(l); if(!a) { - cout << "Big Broblem (LoadElementVoidArea, malloc) " - << hex << Group << " " << Elem << "\n"; + std::cout << "Big Broblem (LoadElementVoidArea, malloc) " + << std::hex << Group << " " << Elem << std::endl; return NULL; } int res = PubElValSet.SetVoidAreaByNumber(a, Group, Elem); // TODO check the result size_t l2 = fread(a, 1, l ,fp); if(l != l2) { - cout << "Big Broblem (LoadElementVoidArea, fread) " - << hex << Group << " " << Elem << "\n"; + std::cout << "Big Broblem (LoadElementVoidArea, fread) " + << std::hex << Group << " " << Elem << std::endl; free(a); return NULL; } @@ -1790,7 +1800,7 @@ void * gdcmHeader::LoadElementVoidArea(guint16 Group, guint16 Elem) { gdcmElValue* elValue = PubElValSet.GetElementByNumber(Group, Elem); if (!elValue) { dbg.Verbose(1, "gdcmHeader::GetElValueByNumber", - "failed to Locate gdcmElValue"); + "failed to Locate gdcmElValue"); return (size_t)0; } return elValue->GetOffset(); @@ -2012,7 +2022,7 @@ std::string gdcmHeader::GetTransferSyntaxName(void) { */ int gdcmHeader::GetLUTLength(void) { - vector tokens; + std::vector tokens; int LutLength; //int LutDepth; //int LutNbits; @@ -2030,7 +2040,7 @@ int gdcmHeader::GetLUTLength(void) { dbg.Verbose(0, "gdcmHeader::GetLUTLength: The CLUT R,G,B are not equal"); return 0; } - cout << "Lut Description " << LutDescriptionR <<"\n"; + std::cout << "Lut Description " << LutDescriptionR < tokens; + std::vector tokens; //int LutLength; //int LutDepth; int LutNbits; - // Just hope Lookup Table Desc-Red = Lookup Table Desc-Red = Lookup Table Desc-Blue + //Just hope Lookup Table Desc-Red = Lookup Table Desc-Red = Lookup Table Desc-Blue // Consistency already checked in GetLUTLength std::string LutDescription = GetPubElValByNumber(0x0028,0x1101); if (LutDescription == GDCM_UNFOUND) @@ -2129,9 +2139,10 @@ void * gdcmHeader::GetLUTRGB(void) { if(l==0) return (NULL); int nBits=GetLUTNbits(); + // a virer quand on aura trouve UNE image // qui correspond VRAIMENT à la definition ! - cout << "l " << l << " nBits " << nBits; + std::cout << "l " << l << " nBits " << nBits; l= l/(nBits/8); @@ -2167,7 +2178,8 @@ void * gdcmHeader::GetLUTRGB(void) { unsigned char * g = (unsigned char *)LutG; unsigned char * b = (unsigned char *)LutB; for(int i=0;i tokens; + tokens.erase(tokens.begin(),tokens.end()); // clean any previous value + Tokenize ((const std::string)x, tokens, "\\"); + for (unsigned int i=0; i