From 020d769ac045f06318b7061bfdfa0e1adfd9edd5 Mon Sep 17 00:00:00 2001 From: jpr Date: Mon, 13 Sep 2004 07:49:35 +0000 Subject: [PATCH] dealing with 'zero length' integers --- src/gdcmDictSet.cxx | 13 ++--------- src/gdcmDictSet.h | 14 ++++++++---- src/gdcmDocument.cxx | 51 ++++++++++++++++++++++++-------------------- src/gdcmFile.cxx | 46 +++++++-------------------------------- src/gdcmFile.h | 9 ++++---- 5 files changed, 53 insertions(+), 80 deletions(-) diff --git a/src/gdcmDictSet.cxx b/src/gdcmDictSet.cxx index ee8b8cf9..7b7e8da4 100644 --- a/src/gdcmDictSet.cxx +++ b/src/gdcmDictSet.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDictSet.cxx,v $ Language: C++ - Date: $Date: 2004/08/31 14:24:47 $ - Version: $Revision: 1.35 $ + Date: $Date: 2004/09/13 07:49:35 $ + Version: $Revision: 1.36 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -165,15 +165,6 @@ gdcmDict *gdcmDictSet::GetDict(DictKey const & dictName) return NULL; } -/** - * \brief Retrieve the default reference DICOM V3 public dictionary. - * \result The retrieved default dictionary. - */ -gdcmDict *gdcmDictSet::GetDefaultPubDict() -{ - return GetDict(PUB_DICT_NAME); -} - /** * \brief Create a gdcmDictEntry which will be reference * in no dictionnary diff --git a/src/gdcmDictSet.h b/src/gdcmDictSet.h index 1cd5b0d9..4eb4189a 100644 --- a/src/gdcmDictSet.h +++ b/src/gdcmDictSet.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDictSet.h,v $ Language: C++ - Date: $Date: 2004/08/03 17:28:59 $ - Version: $Revision: 1.24 $ + Date: $Date: 2004/09/13 07:49:35 $ + Version: $Revision: 1.25 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -51,7 +51,13 @@ public: DictKey const & name ); gdcmDict* GetDict( DictKey const & DictName ); - gdcmDict* GetDefaultPubDict(); + + /// \brief Retrieve the default reference DICOM V3 public dictionary. + gdcmDict* GetDefaultPubDict() { return GetDict(PUB_DICT_NAME); }; + + // \brief Retrieve the virtual reference DICOM dictionary. + // \warning : not end user intended + // gdcmDict* GetVirtualDict() { return &VirtualEntry; }; gdcmDictEntry* NewVirtualDictEntry(uint16_t group, uint16_t element, std::string vr = "Unknown", @@ -69,7 +75,7 @@ private: /// Directory path to dictionaries std::string DictPath; /// H table for the on the fly created gdcmDictEntries - std::map VirtualEntry; + TagKeyHT VirtualEntry; }; //----------------------------------------------------------------------------- diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 9b5b2ac4..cdcdd9cb 100644 --- a/src/gdcmDocument.cxx +++ b/src/gdcmDocument.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocument.cxx,v $ Language: C++ - Date: $Date: 2004/09/10 18:54:38 $ - Version: $Revision: 1.74 $ + Date: $Date: 2004/09/13 07:49:36 $ + Version: $Revision: 1.75 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -664,7 +664,8 @@ gdcmBinEntry * gdcmDocument::ReplaceOrCreateByNumber( b = new gdcmBinEntry(a); AddEntry(b); b->SetVoidArea(voidArea); - } + } + SetEntryByNumber(voidArea, lgth, group, elem); //b->SetVoidArea(voidArea); //what if b == 0 !! @@ -870,6 +871,9 @@ bool gdcmDocument::SetEntryByNumber(std::string const & content, uint16_t group, uint16_t element) { + int c; + int l; + gdcmValEntry* valEntry = GetValEntryByNumber(group, element); if (!valEntry ) { @@ -878,30 +882,31 @@ bool gdcmDocument::SetEntryByNumber(std::string const & content, return false; } // Non even content must be padded with a space (020H)... - std::string evenContent = content; - if( evenContent.length() % 2 ) + std::string finalContent = content; + if( finalContent.length() % 2 ) { - evenContent += '\0'; // ... therefore we padd with (000H) .!?! + finalContent += '\0'; // ... therefore we padd with (000H) .!?! } - valEntry->SetValue(evenContent); + valEntry->SetValue(finalContent); // Integers have a special treatement for their length: - gdcmVRKey vr = valEntry->GetVR(); - if( vr == "US" || vr == "SS" ) - { - int c = CountSubstring(content, "\\"); // for multivaluated items - valEntry->SetLength((c+1)*2); - } - else if( vr == "UL" || vr == "SL" ) - { - int c = CountSubstring(content, "\\"); // for multivaluated items - valEntry->SetLength((c+1)*4); - } - else - { - valEntry->SetLength(evenContent.length()); - } + l = finalContent.length(); + if ( l != 0) // To avoid to be cheated by 'zero length' integers + { + gdcmVRKey vr = valEntry->GetVR(); + if( vr == "US" || vr == "SS" ) + { + c = CountSubstring(content, "\\") + 1; // for multivaluated items + l = c*2; + } + else if( vr == "UL" || vr == "SL" ) + { + c = CountSubstring(content, "\\") + 1; // for multivaluated items + l = c*4;; + } + } + valEntry->SetLength(l); return true; } @@ -935,7 +940,7 @@ bool gdcmDocument::SetEntryByNumber(void *content, */ gdcmBinEntry* a = (gdcmBinEntry *)TagHT[key]; a->SetVoidArea(content); - //a->SetLength(lgth); // ??? + a->SetLength(lgth); return true; } diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index b3eb62e6..e94cb485 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFile.cxx,v $ Language: C++ - Date: $Date: 2004/09/10 18:54:38 $ - Version: $Revision: 1.124 $ + Date: $Date: 2004/09/13 07:49:36 $ + Version: $Revision: 1.125 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -102,28 +102,15 @@ void gdcmFile::SetInitialValues() InitialPlanConfig = Header->GetEntryByNumber(0x0028,0x0006); InitialBitsAllocated = Header->GetEntryByNumber(0x0028,0x0100); - // the following entries *may* be removed - // by gdcmFile::GetImageDataIntoVectorRaw - // we save them. - - // we SHALL save them ! - // (some troubles, now) - /* + // the following entries *may* be removed from the H table + // (NOT deleted ...) by gdcmFile::GetImageDataIntoVectorRaw + // we keep a pointer on them. InitialRedLUTDescr = Header->GetDocEntryByNumber(0x0028,0x1101); InitialGreenLUTDescr = Header->GetDocEntryByNumber(0x0028,0x1102); InitialBlueLUTDescr = Header->GetDocEntryByNumber(0x0028,0x1103); InitialRedLUTData = Header->GetDocEntryByNumber(0x0028,0x1201); InitialGreenLUTData = Header->GetDocEntryByNumber(0x0028,0x1202); InitialBlueLUTData = Header->GetDocEntryByNumber(0x0028,0x1203); - - if (InitialRedLUTData == NULL) - std::cout << "echec InitialRedLUTData " << std::endl; - else - { - printf("%p\n",InitialRedLUTData); - InitialRedLUTData->Print(); std::cout <