X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=08c874a7a0a4fd4f7c51832d03ad787aedf71e1d;hb=31c93581b706e9e198b3cf1c4959b344c895087a;hp=489be6e66a311f6da09e77bb529ec16e6bd8d7ed;hpb=2ee201a59464bbbd6d97c04b29746971567439d3;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 489be6e6..08c874a7 100644 --- a/src/gdcmDocument.cxx +++ b/src/gdcmDocument.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocument.cxx,v $ Language: C++ - Date: $Date: 2005/10/27 16:52:44 $ - Version: $Revision: 1.316 $ + Date: $Date: 2005/11/14 14:23:44 $ + Version: $Revision: 1.327 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -76,7 +76,6 @@ Document::~Document () //----------------------------------------------------------------------------- // Public - /** * \brief Loader. use SetLoadMode(), SetFileName() before ! * @return false if file cannot be open or no swap info was found, @@ -187,7 +186,7 @@ bool Document::DoTheLoadingDocumentJob( ) /// In order to fix things "Quick and Dirty" the dictionary was /// altered on PURPOSE but now contains a WRONG value. /// In order to fix things and restore the dictionary to its - /// correct value, one needs to decided of the semantics by deciding + /// correct value, one needs to decide of the semantics by deciding /// whether the following tags are either : /// - multivaluated US, and hence loaded as ValEntry, but afterwards /// also used as BinEntry, which requires the proper conversion, @@ -342,7 +341,7 @@ bool Document::IsReadable() { if ( Filetype == Unknown ) { - gdcmErrorMacro( "Wrong filetype"); + gdcmErrorMacro( "Wrong filetype for " << GetFileName()); return false; } @@ -531,6 +530,7 @@ double Document::SwapDouble(double a) case 1234 : break; case 4321 : + { char *beg = (char *)&a; char *end = beg + 7; char t; @@ -542,6 +542,7 @@ double Document::SwapDouble(double a) beg++, end--; } + } break; default : gdcmErrorMacro( "Unexpected swap code:" << SwapCode ); @@ -598,7 +599,10 @@ std::ifstream *Document::OpenFile() return 0; } - //-- ACR or DICOM with no Preamble; may start with a Shadow Group -- + //-- Broken ACR or DICOM with no Preamble; may start with a Shadow Group -- + + // FIXME : We cannot be sure the preable is only zeroes.. + // (see ACUSON-24-YBR_FULL-RLE.dcm ) if ( zero == 0x0001 || zero == 0x0100 || zero == 0x0002 || zero == 0x0200 || zero == 0x0003 || zero == 0x0300 || zero == 0x0004 || zero == 0x0400 || @@ -704,15 +708,15 @@ void Document::LoadEntryBinArea(uint16_t group, uint16_t elem) DocEntry *docEntry = GetDocEntry(group, elem); if ( !docEntry ) { - gdcmWarningMacro(std::hex << group << "|" << elem - << "doesn't exist" ); + gdcmDebugMacro(std::hex << group << "|" << elem + << " doesn't exist" ); return; } DataEntry *dataEntry = dynamic_cast(docEntry); if ( !dataEntry ) { gdcmWarningMacro(std::hex << group << "|" << elem - << "is NOT a DataEntry"); + << " is NOT a DataEntry"); return; } LoadEntryBinArea(dataEntry); @@ -760,14 +764,13 @@ void Document::LoadEntryBinArea(DataEntry *entry) Global::GetVR()->GetAtomicElementLength(entry->GetVR()); // FIXME : trouble expected if we read an ... OW Entry (LUT, etc ..) - if( entry->GetVR() == "OW" ) - vrLgth = 1; +// if( entry->GetVR() == "OW" ) +// vrLgth = 1; switch(vrLgth) { case 1: { - std::cout << "Atomic lgt = 1 ; NO swap at reading" << std::endl; break; } case 2: @@ -928,7 +931,6 @@ uint32_t Document::ReadInt32() /** * \brief skips bytes inside the source file - * \warning NOT end user intended method ! * @return */ void Document::SkipBytes(uint32_t nBytes) @@ -938,7 +940,7 @@ void Document::SkipBytes(uint32_t nBytes) } /** - * \brief Re-computes the length of a ACR-NEMA/Dicom group from a DcmHeader + * \brief Re-computes the length of the Dicom group 0002. */ int Document::ComputeGroup0002Length( ) { @@ -962,11 +964,6 @@ int Document::ComputeGroup0002Length( ) { vr = entry->GetVR(); - // FIXME : group 0x0002 is *always* Explicit VR! - // --> Except for Implicit VR Transfer Syntax (GE Private) !! - - //if ( filetype == ExplicitVR ) - //{ //if ( (vr == "OB")||(vr == "OW")||(vr == "UT")||(vr == "SQ")) // (no SQ, OW, UT in group 0x0002;) if ( vr == "OB" ) @@ -974,7 +971,7 @@ int Document::ComputeGroup0002Length( ) // explicit VR AND (OB, OW, SQ, UT) : 4 more bytes groupLength += 4; } - //} + groupLength += 2 + 2 + 4 + entry->GetLength(); } } @@ -990,7 +987,6 @@ int Document::ComputeGroup0002Length( ) // Private /** * \brief Loads all the needed Dictionaries - * \warning NOT end user intended method ! */ void Document::Initialize() { @@ -1467,7 +1463,6 @@ void Document::FindDocEntryLength( DocEntry *entry ) /** * \brief Find the Length till the next sequence delimiter - * \warning NOT end user intended method ! * @return */ uint32_t Document::FindDocEntryLengthOBOrOW() @@ -1547,7 +1542,10 @@ VRKey Document::FindDocEntryVR() if ( !CheckDocEntryVR(vr) ) { - gdcmWarningMacro( "Unknown VR " << std::hex << "0x(" + // Don't warn user with useless messages + // Often, delimiters (0xfffe), are not explicit VR ... + if ( CurrentGroup != 0xfffe ) + gdcmWarningMacro( "Unknown VR " << std::hex << "0x(" << (unsigned int)vr[0] << "|" << (unsigned int)vr[1] << ") at offset :" << positionOnEntry ); Fp->seekg(positionOnEntry, std::ios::beg); @@ -1571,7 +1569,6 @@ bool Document::CheckDocEntryVR(const VRKey &vr) /** * \brief Skip a given Header Entry - * \warning NOT end user intended method ! * @param entry entry to skip */ void Document::SkipDocEntry(DocEntry *entry) @@ -1581,7 +1578,6 @@ void Document::SkipDocEntry(DocEntry *entry) /** * \brief Skips to the beginning of the next Header Entry - * \warning NOT end user intended method ! * @param currentDocEntry entry to skip */ void Document::SkipToNextDocEntry(DocEntry *currentDocEntry) @@ -1978,13 +1974,10 @@ void Document::SetMaxSizeLoadEntry(long newSize) */ DocEntry *Document::ReadNextDocEntry() { - uint16_t group; - uint16_t elem; - try { - group = ReadInt16(); - elem = ReadInt16(); + CurrentGroup = ReadInt16(); + CurrentElem = ReadInt16(); } catch ( FormatError ) { @@ -1994,11 +1987,11 @@ DocEntry *Document::ReadNextDocEntry() } // Sometimes file contains groups of tags with reversed endianess. - HandleBrokenEndian(group, elem); + HandleBrokenEndian(CurrentGroup, CurrentElem); // In 'true DICOM' files Group 0002 is always little endian if ( HasDCMPreamble ) - HandleOutOfGroup0002(group, elem); + HandleOutOfGroup0002(CurrentGroup, CurrentElem); VRKey vr = FindDocEntryVR(); @@ -2006,11 +1999,12 @@ DocEntry *Document::ReadNextDocEntry() if ( vr == GDCM_VRUNKNOWN ) { - if ( elem == 0x0000 ) // Group Length + if ( CurrentElem == 0x0000 ) // Group Length { realVR = "UL"; // must be UL } - else if (group%2 == 1 && (elem >= 0x0010 && elem <=0x00ff )) + else if (CurrentGroup%2 == 1 && + (CurrentElem >= 0x0010 && CurrentElem <=0x00ff )) { // DICOM PS 3-5 7.8.1 a) states that those // (gggg-0010->00FF where gggg is odd) attributes have to be LO @@ -2018,7 +2012,7 @@ DocEntry *Document::ReadNextDocEntry() } else { - DictEntry *dictEntry = GetDictEntry(group,elem); + DictEntry *dictEntry = GetDictEntry(CurrentGroup,CurrentElem); if ( dictEntry ) { realVR = dictEntry->GetVR(); @@ -2030,10 +2024,10 @@ DocEntry *Document::ReadNextDocEntry() DocEntry *newEntry; if ( Global::GetVR()->IsVROfSequence(realVR) ) - newEntry = NewSeqEntry(group, elem); + newEntry = NewSeqEntry(CurrentGroup, CurrentElem); else { - newEntry = NewDataEntry(group, elem, realVR); + newEntry = NewDataEntry(CurrentGroup, CurrentElem, realVR); static_cast(newEntry)->SetState(DataEntry::STATE_NOTLOADED); } @@ -2087,6 +2081,7 @@ void Document::HandleBrokenEndian(uint16_t &group, uint16_t &elem) if ((group == 0xfeff) && (elem == 0x00e0)) { // start endian swap mark for group found + gdcmDebugMacro( "Start endian swap mark found." ); reversedEndian++; SwitchByteSwapCode(); // fix the tag @@ -2096,6 +2091,7 @@ void Document::HandleBrokenEndian(uint16_t &group, uint16_t &elem) else if (group == 0xfffe && elem == 0xe00d && reversedEndian) { // end of reversed endian group + gdcmDebugMacro( "End of reversed endian." ); reversedEndian--; SwitchByteSwapCode(); }