Program: gdcm
Module: $RCSfile: gdcmDocument.cxx,v $
Language: C++
- Date: $Date: 2006/01/31 11:32:06 $
- Version: $Revision: 1.337 $
+ Date: $Date: 2006/02/07 12:37:19 $
+ Version: $Revision: 1.338 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
Group0002Parsed = false;
gdcmDebugMacro( "Starting parsing of file: " << Filename.c_str());
-
- Fp->seekg(0, std::ios::end);
- long lgt = Fp->tellg(); // total length of the file
-
- Fp->seekg(0, std::ios::beg);
+
+ // Computes the total length of the file
+ Fp->seekg(0, std::ios::end); // Once for a given Document !
+ long lgt = Fp->tellg(); // Once for a given Document !
+ Fp->seekg(0, std::ios::beg); // Once for a given Document !
// CheckSwap returns a boolean
// (false if no swap info of any kind was found)
}
IsDocumentAlreadyLoaded = true;
- Fp->seekg( 0, std::ios::beg);
+ Fp->seekg( 0, std::ios::beg); // Once per Document
// Load 'non string' values
// The entry might be present but not loaded (parsing and loading
// happen at different stages): try loading and proceed with check...
- LoadDocEntrySafe(entry);
+
+ // Well ...
+ // (parsing and loading happen at the very same stage!)
+ //LoadDocEntrySafe(entry); //JPRx
if (DataEntry *dataEntry = dynamic_cast<DataEntry *>(entry) )
{
std::string transfer = dataEntry->GetString();
}
//-- DICOM --
- Fp->seekg(126L, std::ios::cur);
+ Fp->seekg(126L, std::ios::cur); // Once for a given Document
char dicm[4]; // = {' ',' ',' ',' '};
Fp->read(dicm, (size_t)4);
if ( Fp->eof() )
{
if( entry->GetBinArea() )
return;
+// to be coherent with LoadEntryBinArea(uint16_t group, uint16_t elem)
+// (and save time !)
+// :-(
+// TestAllReadCompareDicom hangs on rle16sti.dcm
bool openFile = !Fp;
if ( openFile )
OpenFile();
-
+// -------
size_t o =(size_t)entry->GetOffset();
- Fp->seekg(o, std::ios::beg);
+ Fp->seekg(o, std::ios::beg); // FIXME : for each BinEntry LoadEntryBinArea
size_t l = entry->GetLength();
uint8_t *data = new uint8_t[l];
}
entry->SetBinArea(data);
+
+// to be coherent with LoadEntryBinArea(uint16_t group, uint16_t elem)
+// (and save time !)
if ( openFile )
CloseFile();
+// ---------------
}
/**
* \brief Loads the element while preserving the current
* underlying file position indicator as opposed to
- * LoadDocEntry that modifies it.
+ * LoadDocEntry that modifies it
+ * \note seems to be unused!.
* @param entry DocEntry whose value will be loaded.
*/
void Document::LoadDocEntrySafe(DocEntry *entry)
{
if ( Fp )
{
- long PositionOnEntry = Fp->tellg();
+ long PositionOnEntry = Fp->tellg(); // LoadDocEntrySafe is not used
LoadDocEntry(entry);
- Fp->seekg(PositionOnEntry, std::ios::beg);
+ Fp->seekg(PositionOnEntry, std::ios::beg); // LoadDocEntrySafe is not used
}
}
return g;
}
-/**
- * \brief skips bytes inside the source file
- * @return
- */
-void Document::SkipBytes(uint32_t nBytes)
-{
- //FIXME don't dump the returned value
- Fp->seekg((long)nBytes, std::ios::cur);
-}
-
/**
* \brief Re-computes the length of the Dicom group 0002.
*/
<< " at offset " << std::hex << "0x(" << offset << ")" );
while (true)
{
- if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max)
+ if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) // Once per DocEntry
{
break;
}
//if ( newDataEntry->IsUnfound() ) /?!? JPR
{
lgrGroup = atoi(strLgrGroup.c_str());
- Fp->seekg(lgrGroup, std::ios::cur);
+ Fp->seekg(lgrGroup, std::ios::cur); // Only when NOSHADOW
//used = false; // never used
RemoveEntry( newDocEntry ); // Remove and delete
// bcc 5.5 is right "assigned a value that's never used"
bool delimitor = newDataEntry->IsItemDelimitor();
if ( (delimitor) ||
- (!delim_mode && ((long)(Fp->tellg())-offset) >= l_max) )
+ (!delim_mode && ((long)(Fp->tellg())-offset) >= l_max) ) // Once per DataEntry
{
if ( !used )
newDocEntry->Delete();
// User asked to skip SeQuences *only* if they belong to Shadow Group
if ( newDocEntry->GetGroup()%2 != 0 )
{
- Fp->seekg( l, std::ios::cur);
+ Fp->seekg( l, std::ios::cur); // once per SQITEM, when NOSHADOWSEQ
newDocEntry->Delete(); // Delete, not in the set
continue;
}
if ( (LoadMode & LD_NOSEQ) && ! delim_mode_intern )
{
// User asked to skip *any* SeQuence
- Fp->seekg( l, std::ios::cur);
+ Fp->seekg( l, std::ios::cur); // Once per SQ, when NOSEQ
newDocEntry->Delete(); // Delete, not in the set
continue;
}
newDocEntry->Delete();
}
- if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max)
+ if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) // Once per SeqEntry
{
if ( !used )
newDocEntry->Delete();
break;
}
}
- if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max)
+ if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) // Once per SQItem
{
newDocEntry->Delete();
break;
}
// remove fff0,e000, created out of the SQItem
- Fp->seekg(offsetStartCurrentSQItem, std::ios::beg);
+
+ //Fp->seekg(offsetStartCurrentSQItem, std::ios::beg); //JPRx
+
// fill up the current SQItem, starting at the beginning of fff0,e000
ParseDES(itemSQ, offsetStartCurrentSQItem, l+8, dlm_mod);
- offsetStartCurrentSQItem = Fp->tellg();
+ offsetStartCurrentSQItem = Fp->tellg(); // Once per SQItem
seqEntry->AddSQItem( itemSQ, SQItemNumber );
itemSQ->Delete();
newDocEntry->Delete();
SQItemNumber++;
- if ( !delim_mode && ((long)(Fp->tellg())-offset ) >= l_max )
+ //if ( !delim_mode && ((long)(Fp->tellg())-offset ) >= l_max ) //JPRx
+ if ( !delim_mode && (offsetStartCurrentSQItem-offset ) >= l_max )
{
break;
}
newEntry->SetOffset(offset);
// Move back to the beginning of the Sequence
- Fp->seekg( 0, std::ios::beg);
- Fp->seekg(offset, std::ios::cur);
+ Fp->seekg( 0, std::ios::beg); // Only for Shadow Implicit VR SQ
+ Fp->seekg(offset, std::ios::cur); // Only for Shadow Implicit VR SQ
return newEntry;
}
const VRKey &vr = entry->GetVR();
uint32_t length = entry->GetLength();
- Fp->seekg((long)entry->GetOffset(), std::ios::beg);
+ // Fp->seekg((long)entry->GetOffset(), std::ios::beg); // JPRx
// A SeQuence "contains" a set of Elements.
// (fffe e000) tells us an Element is beginning
dataEntryPtr->SetState(DataEntry::STATE_NOTLOADED);
// to be sure we are at the end of the value ...
- Fp->seekg((long)entry->GetOffset()+(long)entry->GetLength(),
- std::ios::beg);
+ // Fp->seekg((long)entry->GetOffset()+(long)entry->GetLength(),
+ // std::ios::beg); //JPRx
return;
}
}
// The following reserved two bytes (see PS 3.5-2003, section
// "7.1.2 Data element structure with explicit vr", p 27) must be
// skipped before proceeding on reading the length on 4 bytes.
- Fp->seekg( 2L, std::ios::cur);
+
+ Fp->seekg( 2L, std::ios::cur); // Once per OW,OB,SQ DocEntry
uint32_t length32 = ReadInt32();
if ( (vr == "OB" || vr == "OW") && length32 == 0xffffffff )
uint32_t lengthOB;
try
{
- lengthOB = FindDocEntryLengthOBOrOW();
+ lengthOB = FindDocEntryLengthOBOrOW();// for encapsulation of encoded pixel
}
catch ( FormatUnexpected )
{
gdcmWarningMacro( " Computing the length failed for " <<
entry->GetKey() <<" in " <<GetFileName());
- long currentPosition = Fp->tellg();
- Fp->seekg(0L,std::ios::end);
+ long currentPosition = Fp->tellg(); // Only for gdcm-JPEG-LossLess3a.dcm-like
+ Fp->seekg(0L,std::ios::end); // Only for gdcm-JPEG-LossLess3a.dcm-like
- long lengthUntilEOF = (long)(Fp->tellg())-currentPosition;
- Fp->seekg(currentPosition, std::ios::beg);
+ long lengthUntilEOF = (long)(Fp->tellg())-currentPosition; // Only for gdcm-JPEG-LossLess3a.dcm-like
+ Fp->seekg(currentPosition, std::ios::beg); // Only for gdcm-JPEG-LossLess3a.dcm-like
entry->SetReadLength(lengthUntilEOF);
entry->SetLength(lengthUntilEOF);
throw( FormatUnexpected )
{
// See PS 3.5-2001, section A.4 p. 49 on encapsulation of encoded pixel data.
- long positionOnEntry = Fp->tellg();
+ long positionOnEntry = Fp->tellg(); // Only for OB,OW DataElements
+
bool foundSequenceDelimiter = false;
uint32_t totalLength = 0;
totalLength += 4;
if ( group != 0xfffe || ( ( elem != 0xe0dd ) && ( elem != 0xe000 ) ) )
{
- long filePosition = Fp->tellg();
+ // long filePosition = Fp->tellg(); JPRx
gdcmWarningMacro(
"Neither an Item tag nor a Sequence delimiter tag on :"
<< std::hex << group << " , " << elem
- << ") -before- position x(" << filePosition << ")" );
+ //<< ") -before- position x(" << filePosition // JPRx
+ << ")" );
- Fp->seekg(positionOnEntry, std::ios::beg);
+ Fp->seekg(positionOnEntry, std::ios::beg); // Oncd per fragment (if any) of OB,OW DataElements
throw FormatUnexpected(
"Neither an Item tag nor a Sequence delimiter tag.");
}
break;
}
}
- Fp->seekg( positionOnEntry, std::ios::beg);
+ Fp->seekg( positionOnEntry, std::ios::beg); // Only for OB,OW DataElements
return totalLength;
}
if ( Filetype != ExplicitVR )
return GDCM_VRUNKNOWN;
- long positionOnEntry = Fp->tellg();
+ long positionOnEntry = Fp->tellg(); // FIXME : for each VR !
// Warning: we believe this is explicit VR (Value Representation) because
// we used a heuristic that found "UL" in the first tag and/or
// 'Transfer Syntax' told us it is.
// Alas this doesn't guarantee that all the tags will be in explicit VR.
- // In some cases one finds implicit VR tags mixed within an explicit VR file.
+ // In some cases one finds implicit VR tags mixed within an explicit VR file
+ // Well...
+ // 'Normaly' the only case is : group 0002 Explicit, and other groups Implicit
+ //
// Hence we make sure the present tag is in explicit VR and try to fix things
// if it happens not to be the case.
gdcmWarningMacro( "Unknown VR " << std::hex << "0x("
<< (unsigned int)vr[0] << "|" << (unsigned int)vr[1]
<< ") at offset : 0x(" << positionOnEntry<< ")" );
- Fp->seekg(positionOnEntry, std::ios::beg);
+ Fp->seekg(positionOnEntry, std::ios::beg); // FIXME : for each VR !
return GDCM_VRUNKNOWN;
}
return vr;
// test is useless (and might even look a bit paranoid), when we
// encounter such an ill-formed image, we simply display a warning
// message and proceed on parsing (while crossing fingers).
- long filePosition = Fp->tellg();
+ long filePosition = Fp->tellg(); // Only when elem 0x0000 length is not 0 (?!?)
gdcmWarningMacro( "Erroneous Group Length element length on : ("
<< std::hex << group << " , " << elem
<< ") -before- position x(" << filePosition << ")"
// Position the file position indicator at first tag
// (i.e. after the file preamble and the "DICM" string).
- Fp->seekg(0, std::ios::beg); // FIXME : Is it usefull?
+ //Fp->seekg(0, std::ios::beg); // FIXME : Is it usefull?
- Fp->seekg ( 132L, std::ios::beg);
+ Fp->seekg ( 132L, std::ios::beg); // Once per Document
return true;
} // ------------------------------- End of DicomV3 ----------------
gdcmWarningMacro( "Not a Kosher DICOM Version3 file (no preamble)");
- Fp->seekg(0, std::ios::beg);
+ Fp->seekg(0, std::ios::beg); // Once per ACR-NEMA Document
// Let's check 'No Preamble Dicom File' :
// Should start with group 0x0002
void Document::SwitchByteSwapCode()
{
gdcmDebugMacro( "Switching Byte Swap code from "<< SwapCode
- << " at: 0x" << std::hex << Fp->tellg() );
+ << " at: 0x" << std::hex << Fp->tellg() ); // Only when DEBUG
if ( SwapCode == 1234 )
{
SwapCode = 4321;
if ( newEntry->GetGroup() != 0xfffe )
{
std::string msg;
- int offset = Fp->tellg();
+ int offset = Fp->tellg(); // FIXME : Only when heuristic for Explicit/Implicit was wrong
msg = Util::Format(
"Entry (%04x,%04x) at x(%x) should be Explicit VR\n",
newEntry->GetGroup(), newEntry->GetElement(), offset );
return 0;
}
- newEntry->SetOffset(Fp->tellg());
+ newEntry->SetOffset(Fp->tellg()); // for each DocEntry
return newEntry;
}
Program: gdcm
Module: $RCSfile: gdcmFile.cxx,v $
Language: C++
- Date: $Date: 2005/12/21 14:52:12 $
- Version: $Revision: 1.313 $
+ Date: $Date: 2006/02/07 12:37:19 $
+ Version: $Revision: 1.314 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
// Offset Table information on fragments of this current Frame.
// Note that the fragment pixels themselves are not loaded
// (but just skipped).
- long frameOffset = Fp->tellg();
+ long frameOffset = Fp->tellg(); // once per fragment
uint32_t nbRleSegments = ReadInt32();
if ( nbRleSegments > 16 )
// Make sure that we encounter a 'Sequence Delimiter Item'
// at the end of the item :
- if ( !ReadTag(0xfffe, 0xe0dd) )
+ if ( !ReadTag(0xfffe, 0xe0dd) ) // once per RLE File
{
gdcmWarningMacro( "No sequence delimiter item at end of RLE item sequence");
}
long fragmentLength;
int i=0;
uint32_t sum = 0;
- while ( (fragmentLength = ReadTagLength(0xfffe, 0xe000)) != 0 )
+ while ( (fragmentLength = ReadTagLength(0xfffe, 0xe000)) != 0 )
{
// Since we have read the basic offset table, let's check the value were correct
// or else produce a warning:
i++;
}
- long fragmentOffset = Fp->tellg();
+ long fragmentOffset = Fp->tellg(); // Once per fragment
// Store the collected info
JPEGFragment *newFragment = new JPEGFragment;
newFragment->SetOffset(fragmentOffset);
*/
bool File::ReadTag(uint16_t testGroup, uint16_t testElem)
{
- long positionOnEntry = Fp->tellg();
- long currentPosition = Fp->tellg(); // On debugging purposes
+ long positionOnEntry = Fp->tellg(); // Only when reading fragments
+ //long currentPosition = positionOnEntry; // On debugging purposes
// Read the Item Tag group and element, and make
// sure they are what we expected:
<< " but instead we encountered tag ("
<< DictEntry::TranslateToKey(itemTagGroup,itemTagElem) << ")"
<< " at address: " << " 0x(" << std::hex
- << (unsigned int)currentPosition << std::dec << ")"
+ << (unsigned int)positionOnEntry << std::dec << ")"
) ;
Fp->seekg(positionOnEntry, std::ios::beg);
}
//// Then read the associated Item Length
- long currentPosition = Fp->tellg();
+
+ // long currentPosition = Fp->tellg(); // save time // JPRx
uint32_t itemLength = ReadInt32();
gdcmDebugMacro( "Basic Item Length is: " << itemLength
- << " at address: " << std::hex << (unsigned int)currentPosition);
+// << " at address: " << std::hex << (unsigned int)currentPosition
+ );
return itemLength;
}