X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=src%2FgdcmSegmentedPalette.h;h=2f2c57c99d9045c92f2eb58e03898207ba52c38c;hb=add6c88b334e9cf4ddb0ae1849f1380f9844f99c;hp=1228124f53727f4c601eb2b8d7d0004756401bd1;hpb=a0e787274df9dea65c35940eab80a287a9367620;p=gdcm.git diff --git a/src/gdcmSegmentedPalette.h b/src/gdcmSegmentedPalette.h index 1228124f..2f2c57c9 100644 --- a/src/gdcmSegmentedPalette.h +++ b/src/gdcmSegmentedPalette.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmSegmentedPalette.h,v $ Language: C++ - Date: $Date: 2007/10/03 11:59:27 $ - Version: $Revision: 1.5 $ + Date: $Date: 2007/10/08 15:20:17 $ + Version: $Revision: 1.9 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -16,7 +16,13 @@ =========================================================================*/ -#include +#ifndef _GDCMSEGMENTEDPALETTE_H_ +#define _GDCMSEGMENTEDPALETTE_H_ + +#include "gdcmFile.h" +#include "gdcmTagKey.h" +#include "gdcmDataEntry.h" + // Ref: // http://blog.goo.ne.jp/satomi_takeo/e/3643e5249b2a9650f9e10ef1c830e8b8 // I bet the code was compiled on VS6. Make it compile on other platform: @@ -26,6 +32,8 @@ // * replace all dcmtk code with equivalent gdcm code // * Add extra parameter to ReadPaletteInto to save extracted info +// MM: Over 50000 DICOM files I only found two that had a Segmented Palette LUT +// And both were coming from a ALOKA SSD-4000 station #include #include #include @@ -33,9 +41,17 @@ #include #include -namespace gdcm { +// Hack for VS6 +#if defined(_MSC_VER) && (_MSC_VER < 1310) +#define GDCM_TYPENAME class +#else +#define GDCM_TYPENAME typename +#endif + +namespace GDCM_NAME_SPACE +{ // abstract class for segment. - template + template class Segment { public: typedef std::map SegmentMap; @@ -60,7 +76,7 @@ namespace gdcm { }; // discrete segment (opcode = 0) - template + template class DiscreteSegment : public Segment { public: typedef typename Segment::SegmentMap SegmentMap; @@ -75,7 +91,7 @@ namespace gdcm { }; // linear segment (opcode = 1) - template + template class LinearSegment : public Segment { public: typedef typename Segment::SegmentMap SegmentMap; @@ -104,7 +120,7 @@ namespace gdcm { }; // indirect segment (opcode = 2) - template + template class IndirectSegment : public Segment { public: typedef typename Segment::SegmentMap SegmentMap; @@ -140,7 +156,7 @@ namespace gdcm { } }; - template + template void ExpandPalette(const EntryType* raw_values, uint32_t length, std::vector& palette) { @@ -199,34 +215,42 @@ namespace gdcm { //DcmElement* pe = NULL; GDCM_NAME_SPACE::DataEntry* pe = NULL; - pe = pds->GetDataEntry(segment.GetGroup(), segment.GetElement() ); { + pe = pds->GetDataEntry(segment.GetGroup(), segment.GetElement() ); + { //if ( pds->findAndGetElement(segment, pe).good() ) unsigned long length = pe->GetLength(); - if ( entry_size == 8 ) { + if ( entry_size == 8 ) + { uint8_t* segment_values = NULL; //if ( pe->getUint8Array(segment_values).good() ) - segment_values = (uint8_t*)pe->GetBinArea(); { + segment_values = (uint8_t*)pe->GetBinArea(); + { std::vector palette; palette.reserve(num_entries); ExpandPalette(segment_values, length, palette); memcpy(lut, &palette[0], palette.size() ); - } - } else if ( entry_size == 16 ) { + } + } + else if ( entry_size == 16 ) + { uint16_t* segment_values = NULL; - segment_values = (uint16_t*)pe->GetBinArea(); { + segment_values = (uint16_t*)pe->GetBinArea(); + { //if ( pe->getUint16Array(segment_values).good() ) std::vector palette; palette.reserve(num_entries); ExpandPalette(segment_values, length, palette); memcpy(lut, &palette[0], palette.size()*2 ); -// std::copy(palette.begin(), palette.end(), -// std::ostream_iterator(std::cout, "\n")); + } } } } - } } -} // end namespace +} // end namespace gdcm + +// do not pollute namespace: +#undef GDCM_TYPENAME +#endif