+/**
+ * \ingroup gdcmHeader
+ * \brief gets the info from 0028,1101 : Lookup Table Desc-Red
+ * \ else 0
+ * @return Lookup Table Length
+ * \ when (0028,0004),Photometric Interpretation = [PALETTE COLOR ]
+ */
+
+int gdcmHeader::GetLUTLength(void) {
+ vector<string> tokens;
+ int LutLength;
+ //int LutDepth;
+ //int LutNbits;
+ // Just hope Lookup Table Desc-Red = Lookup Table Desc-Red = Lookup Table Desc-Blue
+ string LutDescriptionR = GetPubElValByNumber(0x0028,0x1101);
+ if (LutDescriptionR == "gdcm::Unfound")
+ return 0;
+ string LutDescriptionG = GetPubElValByNumber(0x0028,0x1102);
+ if (LutDescriptionG == "gdcm::Unfound")
+ return 0;
+ string LutDescriptionB = GetPubElValByNumber(0x0028,0x1103);
+ if (LutDescriptionB == "gdcm::Unfound")
+ return 0;
+ if( (LutDescriptionR != LutDescriptionG) || (LutDescriptionR != LutDescriptionB) ) {
+ dbg.Verbose(0, "gdcmHeader::GetLUTLength: The CLUT R,G,B are not equal");
+ return 0;
+ }
+ cout << "Lut Description " << LutDescriptionR <<"\n";
+ tokens.erase(tokens.begin(),tokens.end()); // clean any previous value
+ Tokenize (LutDescriptionR, tokens, "\\");
+ LutLength=atoi(tokens[0].c_str());
+ //LutDepth=atoi(tokens[1].c_str());
+ //LutNbits=atoi(tokens[2].c_str());
+ tokens.clear();
+ return LutLength;
+}
+
+/**
+ * \ingroup gdcmHeader
+ * \brief gets the info from 0028,1101 : Lookup Table Desc-Red
+ * \ else 0
+ * @return Lookup Table nBit
+ * \ when (0028,0004),Photometric Interpretation = [PALETTE COLOR ]
+ */
+
+int gdcmHeader::GetLUTNbits(void) {
+ vector<string> tokens;
+ //int LutLength;
+ //int LutDepth;
+ int LutNbits;
+ // Just hope Lookup Table Desc-Red = Lookup Table Desc-Red = Lookup Table Desc-Blue
+ // Consistency already checked in GetLUTLength
+ string LutDescription = GetPubElValByNumber(0x0028,0x1101);
+ if (LutDescription == "gdcm::Unfound")
+ return 0;
+ tokens.erase(tokens.begin(),tokens.end()); // clean any previous value
+ Tokenize (LutDescription, tokens, "\\");
+ //LutLength=atoi(tokens[0].c_str());
+ //LutDepth=atoi(tokens[1].c_str());
+ LutNbits=atoi(tokens[2].c_str());
+ tokens.clear();
+ return LutNbits;
+}
+
+
+/**
+ * \ingroup gdcmHeader
+ * \brief gets the info from 0028,1201 : Lookup Table Red
+ * \ else 0
+ * @return Lookup Table Red
+ * \ when (0028,0004),Photometric Interpretation = [PALETTE COLOR ]
+ */
+void * gdcmHeader::GetLUTRed(void) {
+ return GetPubElValVoidAreaByNumber(0x0028,0x1201);
+}
+
+/**
+ * \ingroup gdcmHeader
+ * \brief gets the info from 0028,1202 : Lookup Table Green
+ * \ else 0
+ * @return Lookup Table Red
+ * \ when (0028,0004),Photometric Interpretation = [PALETTE COLOR ]
+ */
+ void * gdcmHeader::GetLUTGreen(void) {
+ return GetPubElValVoidAreaByNumber(0x0028,0x1202);
+}
+
+/**
+ * \ingroup gdcmHeader
+ * \brief gets the info from 0028,1202 : Lookup Table Blue
+ * \ else 0
+ * @return Lookup Table Blue
+ * \ when (0028,0004),Photometric Interpretation = [PALETTE COLOR ]
+ */
+void * gdcmHeader::GetLUTBlue(void) {
+ return GetPubElValVoidAreaByNumber(0x0028,0x1203);
+}
+
+/**
+ * \ingroup gdcmHeader
+ * \brief
+ * @return Lookup Table RGB
+ * \ when (0028,0004),Photometric Interpretation = [PALETTE COLOR ]
+ * \ and (0028,1201),(0028,1202),(0028,1202) are found
+ * \warning : hazardous ! Use better GetPubElValVoidAreaByNumber
+ */
+void * gdcmHeader::GetLUTRGB(void) {
+// Not so easy : see
+// http://www.barre.nom.fr/medical/dicom2/limitations.html#Color%20Lookup%20Tables
+// and OT-PAL-8-face.dcm
+
+ if (GetPubElValByNumber(0x0028,0x0004) == "gdcm::Unfound") {
+ dbg.Verbose(0, "gdcmHeader::GetLUTRGB: unfound Photometric Interpretation");
+ return NULL;
+ }
+ void * LutR,*LutG,*LutB;
+ int l;
+
+ // Maybe, some day we get an image
+ // that respects the definition ...
+ // Let's consider no ones does.
+
+ l= GetLUTLength();
+ if(l==0)
+ return (NULL);
+ int nBits=GetLUTNbits();
+ // a virer quand on aura trouve UNE image
+ // qui correspond VRAIMENT à la definition !
+ cout << "l " << l << " nBits " << nBits;
+
+ l= l/(nBits/8);
+
+ LutR =GetPubElValVoidAreaByNumber(0x0028,0x1201);
+ LutG =GetPubElValVoidAreaByNumber(0x0028,0x1202);
+ LutB =GetPubElValVoidAreaByNumber(0x0028,0x1203);
+
+ // Warning : Any value for nBits as to be considered as 8
+ // Any value for Length as to be considered as 256
+ // That's DICOM ...
+
+ // Just wait before removing the following code
+ /*
+ if (nBits == 16) {
+ guint16 * LUTRGB, *rgb;
+ LUTRGB = rgb = (guint16 *) malloc(3*l*sizeof( guint16));
+ guint16 * r = (guint16 *)LutR;
+ guint16 * g = (guint16 *)LutG;
+ guint16 * b = (guint16 *)LutB;
+ for(int i=0;i<l;i++) {
+ *rgb++ = *r++;
+ *rgb++ = *g++;
+ *rgb++ = *b++;
+ }
+ return(LUTRGB);
+ } else
+
+ */ { // we assume it's always 8 Bits
+ l=256; // we assume ...
+ unsigned char * LUTRGB, *rgb;
+ LUTRGB = rgb = (unsigned char *) malloc(3*l*sizeof( char));
+ unsigned char * r = (unsigned char *)LutR;
+ unsigned char * g = (unsigned char *)LutG;
+ unsigned char * b = (unsigned char *)LutB;
+ for(int i=0;i<l;i++) {
+ //cout << "lut16 " << i << " : " << *r << " " << *g << " " << *b << "\n";
+ printf("lut 8 %d : %d %d %d \n",i,*r,*g,*b);
+ *rgb++ = *r++;
+ *rgb++ = *g++;
+ *rgb++ = *b++;
+ }
+ free(LutR); free(LutB); free(LutG);
+ return(LUTRGB);
+ }
+}
+