X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2Fgdcm.h;h=f0b4b91aa624982f0a34f3439a692348f3783a0b;hb=8afb2999a90aefbce7662c43fe19dad237d49331;hp=82df4e543333a60a0015cdfbf0a4f48f6c35df53;hpb=1aa2bb207fb6b9ce78f35e7547dd4c770e516adb;p=gdcm.git diff --git a/src/gdcm.h b/src/gdcm.h index 82df4e54..f0b4b91a 100644 --- a/src/gdcm.h +++ b/src/gdcm.h @@ -17,21 +17,41 @@ #include #include -#include // For size_t -#include -#include +#include // For size_t +#include // FIXME For FILE on GCC only +#include // The requirement for the hash table (or map) that + // we shall use: + // 1/ First, next, last (iterators) + // 2/ should be sortable (i.e. sorted by TagKey). This + // condition shall be droped since the Win32/VC++ + // implementation doesn't look a sorted one. Pffff.... + // 3/ Make sure we can setup some default size value, + // which should be around 4500 entries which is the + // average dictionary size (said JPR) +#define g_malloc malloc +#define g_free free -// The requirement for the hash table (or map) that we shall use: -// 1/ First, next, last (iterators) -// 2/ should be sortable (i.e. sorted by TagKey). This condition -// shall be droped since the Win32/VC++ implementation doesn't look -// a sorted one. Pffff.... -// 3/ Make sure we can setup some default size value, which should be -// around 4500 entries which is the average dictionary size (said JPR) -#include -using namespace std; +#ifdef __GNUC__ +#include +#define guint16 uint16_t +#define guint32 uint32_t +#endif +#ifdef _MSC_VER +typedef unsigned short guint16; +typedef unsigned int guint32; + +#endif + +#ifdef _MSC_VER + using namespace std; // string type lives in the std namespace on VC++ +#endif +#ifdef _MSC_VER #define GDCM_EXPORT __declspec( dllexport ) +#else +#define GDCM_EXPORT +#endif + // Tag based hash tables. // We shall use as keys the strings (as the C++ type) obtained by // concatenating the group value and the element value (both of type @@ -72,12 +92,15 @@ private: public: //CLEANME gdcmDictEntry(); gdcmDictEntry(guint16 group, guint16 element, - string vr, string fourth, string name); + string vr = "Unknown", + string fourth = "Unknown", + string name = "Unknown"); static TagKey TranslateToKey(guint16 group, guint16 element); guint16 GetGroup(void) { return group;}; guint16 GetElement(void){return element;}; string GetVR(void) {return vr; }; - void SetVR(string in){vr = in; }; + void SetVR(string); + bool IsVrUnknown(void); string GetFourth(void) {return fourth;}; string GetName(void) {return name;}; string GetKey(void) {return key;}; @@ -134,19 +157,28 @@ class GDCM_EXPORT ElValue { private: gdcmDictEntry *entry; guint32 LgrElem; + bool ImplicitVr; // Even when reading explicit vr files, some + // elements happen to be implicit. Flag them here + // since we can't use the entry->vr without breaking + // the underlying dictionary. // Might prove of some interest (see _ID_DCM_ELEM) // int Swap; public: string value; // used to be char * valeurElem size_t Offset; // Offset from the begining of file for direct user access ElValue(gdcmDictEntry*); - void SetVR(string); - string GetVR(void); + void SetDictEntry(gdcmDictEntry *NewEntry) { entry = NewEntry; }; + + bool IsVrUnknown(void) { return entry->IsVrUnknown(); }; void SetLength(guint32 l){LgrElem = l; }; void SetValue(string val){ value = val; }; void SetOffset(size_t of){ Offset = of; }; + void SetImplicitVr(void) { ImplicitVr = true; }; + bool IsImplicitVr(void) { return ImplicitVr; }; + void SetVR(string); + string GetVR(void); string GetValue(void) { return value; }; - guint32 GetLength(void) { return LgrElem; }; + guint32 GetLength(void) { return LgrElem; }; size_t GetOffset(void) { return Offset; }; guint16 GetGroup(void) { return entry->GetGroup(); }; guint16 GetElement(void) { return entry->GetElement(); }; @@ -158,7 +190,7 @@ typedef map TagElValueHT; typedef map TagElValueNameHT; // Container for a set of succefully parsed ElValues. class GDCM_EXPORT ElValSet { - // We need both accesses with a TagKey and the Dicentry.Name + // We need both accesses with a TagKey and the Dictentry.Name TagElValueHT tagHt; TagElValueNameHT NameHt; public: @@ -185,21 +217,24 @@ typedef map VRHT; // Value Representation Hash Table // Notes: // * the gdcmHeader::Set*Tag* family members cannot be defined as protected // (Swig limitations for as Has_a dependency between gdcmFile and gdcmHeader) -class GDCM_EXPORT gdcmHeader { +class GDCM_EXPORT gdcmHeader { //FIXME sw should be qn EndianType !!! //enum EndianType { //LittleEndian, //BadLittleEndian, //BigEndian, //BadBigEndian}; + void SkipBytes(guint32); private: - // All instances share the same value representation dictionary + // All instances share the same Value Representation dictionary static VRHT *dicom_vr; + // Dictionaries of data elements: static gdcmDictSet* Dicts; // Global dictionary container gdcmDict* RefPubDict; // Public Dictionary gdcmDict* RefShaDict; // Shadow Dictionary (optional) - ElValSet PubElVals; // Element Values parsed with Public Dictionary - ElValSet ShaElVals; // Element Values parsed with Shadow Dictionary + // Parsed element values: + ElValSet PubElVals; // parsed with Public Dictionary + ElValSet ShaElVals; // parsed with Shadow Dictionary // In order to inspect/navigate through the file string filename; FILE * fp; @@ -209,7 +244,13 @@ private: // outside of the elements: guint16 grPixel; guint16 numPixel; + // Swap code (little, big, big-bad endian): this code is not fixed + // during parsing. int sw; + // Only the elements whose size are below this bound shall be loaded. + // By default, this upper bound is limited to 1024 (which looks reasonable + // when one considers the definition of the various VR contents). + guint32 MaxSizeLoadElementValue; guint16 ReadInt16(void); guint32 ReadInt32(void); @@ -218,12 +259,18 @@ private: void Initialise(void); void CheckSwap(void); void FindLength(ElValue *); + guint32 FindLengthOB(void); void FindVR(ElValue *); void LoadElementValue(ElValue *); + void LoadElementValueSafe(ElValue *); void SkipElementValue(ElValue *); void InitVRDict(void); - bool IsAnInteger(guint16, guint16, string, guint32); - ElValue * ReadNextElement(void); + void SwitchSwapToBigEndian(void); + void FixFoundLength(ElValue*, guint32); + bool IsAnInteger(ElValue *); + bool IsBigEndianTransferSyntax(void); + void SetMaxSizeLoadElementValue(long); + ElValue * ReadNextElement(void); gdcmDictEntry * IsInDicts(guint32, guint32); size_t GetPixelOffset(void); protected: