X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=fbc717435e6030132b576b6619da0410fc71ded7;hb=fa44ba5d9d541ae25e7902515483124d6251b777;hp=8ac4b2296ae0d43209ef487b7bfed0319bf1e90c;hpb=880f6dfe2e061712fafbf75ab9547aadf170fc40;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 8ac4b229..fbc71743 100644 --- a/src/gdcmDocument.cxx +++ b/src/gdcmDocument.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocument.cxx,v $ Language: C++ - Date: $Date: 2006/05/05 22:13:55 $ - Version: $Revision: 1.347 $ + Date: $Date: 2006/06/21 14:06:56 $ + Version: $Revision: 1.351 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -95,19 +95,22 @@ bool Document::Load( ) return DoTheLoadingDocumentJob( ); } -#ifndef GDCM_LEGACY_REMOVE + +//#ifndef GDCM_LEGACY_REMOVE /** * \brief Loader. (DEPRECATED : not to break the API) * @param fileName 'Document' (File or DicomDir) to be open for parsing * @return false if file cannot be open or no swap info was found, * or no tag was found. */ + /* bool Document::Load( std::string const &fileName ) { Filename = fileName; return DoTheLoadingDocumentJob( ); } -#endif +*/ +//#endif /** * \brief Performs the Loading Job (internal use only) @@ -260,7 +263,7 @@ bool Document::DoTheLoadingDocumentJob( ) LoadDocEntry(d, true); } - CloseFile(); + CloseFile(); // ---------------------------- // Specific code to allow gdcm to read ACR-LibIDO formated images @@ -621,7 +624,6 @@ std::ifstream *Document::OpenFile() } //-- 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 ( @@ -1046,7 +1048,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, DocEntry *newDocEntry; DataEntry *newDataEntry; SeqEntry *newSeqEntry; - VRKey vr; + //VRKey vr; bool used; // will be set to false when something wrong happens to an Entry. // (Entry will then be deleted) bool delim_mode_intern = delim_mode; @@ -1064,7 +1066,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, if( Debug::GetDebugFlag() ) std::cout << std::dec <<"(long)(Fp->tellg()) " << (long)(Fp->tellg()) // in Debug mode << std::hex << " 0x(" <<(long)(Fp->tellg()) << ")" << std::endl; -*/ + */ // if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) // Once per DocEntry if ( !delim_mode ) // 'and then' doesn't exist in C++ :-( @@ -1072,19 +1074,20 @@ void Document::ParseDES(DocEntrySet *set, long offset, { break; } - newDocEntry = ReadNextDocEntry( ); - // Uncoment this cerr line to be able to 'follow' the DocEntries - // when something *very* strange happens - if( Debug::GetDebugFlag() ) - std::cerr<GetKey()<<" "<GetVR()<GetKey()<<" "<GetVR()<GetVR(); + //vr = newDocEntry->GetVR(); // useless ? if ( !set->AddEntry( newDataEntry ) ) { @@ -1377,10 +1380,10 @@ DocEntry *Document::Backtrack(DocEntry *docEntry) */ void Document::LoadDocEntry(DocEntry *entry, bool forceLoad) { - uint16_t group = entry->GetGroup(); - uint16_t elem = entry->GetElement(); + uint16_t group = entry->GetGroup(); + uint16_t elem = entry->GetElement(); const VRKey &vr = entry->GetVR(); - uint32_t length = entry->GetLength(); + uint32_t length = entry->GetLength(); // Fp->seekg((long)entry->GetOffset(), std::ios::beg); // JPRx @@ -1803,6 +1806,7 @@ bool Document::IsDocEntryAnInteger(DocEntry *entry) // encounter such an ill-formed image, we simply display a warning // message and proceed on parsing (while crossing fingers). long filePosition = Fp->tellg(); // Only when elem 0x0000 length is not 4 (?!?) + (void)filePosition; gdcmWarningMacro( "Erroneous Group Length element length on : (" << std::hex << group << " , " << elem << ") -before- position x(" << filePosition << ")" @@ -1989,6 +1993,9 @@ bool Document::CheckSwap() // Find a trick to tell it the caller... s16 = *((uint16_t *)(deb)); + + gdcmDebugMacro("not a DicomV3 nor a 'clean' ACR/NEMA;" + << " (->despaired wild guesses !)"); switch ( s16 ) { @@ -2153,8 +2160,8 @@ DocEntry *Document::ReadNextDocEntry() // We thought this was explicit VR, but we end up with an // implicit VR tag. Let's backtrack. - //if ( newEntry->GetGroup() != 0xfffe ) - if (CurrentGroup != 0xfffe ) + //if ( newEntry->GetGroup() != 0xfffe ) + if (CurrentGroup != 0xfffe) { int offset = Fp->tellg();//Only when heuristic for Explicit/Implicit was wrong @@ -2177,7 +2184,6 @@ DocEntry *Document::ReadNextDocEntry() } newEntry->SetOffset(Fp->tellg()); // for each DocEntry - return newEntry; } @@ -2189,6 +2195,23 @@ DocEntry *Document::ReadNextDocEntry() */ void Document::HandleBrokenEndian(uint16_t &group, uint16_t &elem) { + // for strange PMS Gyroscan Intera images + // Item 'starter' has a tag : 0x3f3f,0x3f00, for no apparent reason + + // --- Feel free to remove this test *on your own coy of gdcm* + // if you are sure you'll never face this problem. + + if ((group == 0x3f3f) && (elem == 0x3f00)) + { + // start endian swap mark for group found + gdcmDebugMacro( " delimiter 0x3f3f found." ); + // fix the tag + group = 0xfffe; + elem = 0xe000; + return; + } + // --- End of removable code + // Endian reversion. // Some files contain groups of tags with reversed endianess. static int reversedEndian = 0;