-/**
- * \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) {
- std::vector<std::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
- std::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 builts Red/Green/Blue/Alpha LUT from Header
- * \ when (0028,0004),Photometric Interpretation = [PALETTE COLOR ]
- * \ and (0028,1101),(0028,1102),(0028,1102)
- * \ - xxx Palette Color Lookup Table Descriptor - are found
- * \ and (0028,1201),(0028,1202),(0028,1202)
- * \ - xxx Palette Color Lookup Table Data - are found
- * \warning does NOT deal with :
- * \ 0028 1100 Gray Lookup Table Descriptor (Retired)
- * \ 0028 1221 Segmented Red Palette Color Lookup Table Data
- * \ 0028 1222 Segmented Green Palette Color Lookup Table Data
- * \ 0028 1223 Segmented Blue Palette Color Lookup Table Data
- * \ no known Dicom reader deails with them :-(
- * @return Lookup Table RGBA
- */
-
-void * gdcmHeader::GetLUTRGBA(void) {
-// Not so easy : see
-// http://www.barre.nom.fr/medical/dicom2/limitations.html#Color%20Lookup%20Tables
-// and OT-PAL-8-face.dcm
-
-// if Photometric Interpretation # PALETTE COLOR, no LUT to be done
-
- if (gdcmHeader::GetPubElValByNumber(0x0028,0x0004) != "PALETTE COLOR ") {
- return NULL;
- }
-
- void * LutR,*LutG,*LutB;
- int l;
- int lengthR, debR, nbitsR;
- int lengthG, debG, nbitsG;
- int lengthB, debB, nbitsB;
-
-// Get info from Lut Descriptors
-// (the 3 LUT descriptors may be different)
-
- std::string LutDescriptionR = GetPubElValByNumber(0x0028,0x1101);
- if (LutDescriptionR == GDCM_UNFOUND)
- return NULL;
- std::string LutDescriptionG = GetPubElValByNumber(0x0028,0x1102);
- if (LutDescriptionG == GDCM_UNFOUND)
- return NULL;
- std::string LutDescriptionB = GetPubElValByNumber(0x0028,0x1103);
- if (LutDescriptionB == GDCM_UNFOUND)
- return NULL;
-
- std::vector<std::string> tokens;
-
- tokens.erase(tokens.begin(),tokens.end()); // clean any previous value
- Tokenize (LutDescriptionR, tokens, "\\");
- lengthR=atoi(tokens[0].c_str()); // Red LUT length in Bytes
- debR =atoi(tokens[1].c_str()); // subscript of the first Lut Value
- nbitsR =atoi(tokens[2].c_str()); // Lut item size (in Bits)
- tokens.clear();
-
- tokens.erase(tokens.begin(),tokens.end()); // clean any previous value
- Tokenize (LutDescriptionG, tokens, "\\");
- lengthG=atoi(tokens[0].c_str()); // Green LUT length in Bytes
- debG =atoi(tokens[1].c_str());
- nbitsG =atoi(tokens[2].c_str());
- tokens.clear();
-
- tokens.erase(tokens.begin(),tokens.end()); // clean any previous value
- Tokenize (LutDescriptionB, tokens, "\\");
- lengthB=atoi(tokens[0].c_str()); // Blue LUT length in Bytes
- debB =atoi(tokens[1].c_str());
- nbitsB =atoi(tokens[2].c_str());
- tokens.clear();
-
-// Load LUTs into memory, (as they were stored on disk)
-
- unsigned char *lutR =(unsigned char *)
- GetPubElValVoidAreaByNumber(0x0028,0x1201);
- unsigned char *lutG =(unsigned char *)
- GetPubElValVoidAreaByNumber(0x0028,0x1202);
- unsigned char *lutB =(unsigned char *)
- GetPubElValVoidAreaByNumber(0x0028,0x1203);
-
- if (!lutR || !lutG || !lutB ) {
- return NULL;
- }
- // forge the 4 * 8 Bits Red/Green/Blue/Alpha LUT
-
- char *LUTRGBA = (char *)calloc(1024,1); // 256 * 4 (R, G, B, Alpha)
- if (!LUTRGBA) {
- return NULL;
- }
- // Bits Allocated
- int nb;
- std::string str_nb = GetPubElValByNumber(0x0028,0x0100);
- if (str_nb == GDCM_UNFOUND ) {
- nb = 16;
- } else {
- nb = atoi(str_nb.c_str() );
- }
- int mult;
-
- if (nbitsR==16 && nb==8) // when LUT item size is different than pixel size
- mult=2; // high byte must be = low byte
- else // See PS 3.3-2003 C.11.1.1.2 p 619
- mult=1;
-
-
- // if we get a black image, let's just remove the '+1'
- // from 'i*mult+1' and check again
- // if it works, we shall have to check the 3 Palettes
- // to see which byte is ==0 (first one, or second one)
- // and fix the code
- // We give up the checking to avoid some overhead
- char *a;
- a= LUTRGBA+debR;
- for(int i=0;i<lengthR;i++) {
- *a = lutR[i*mult+1];
- a+=4;
- }
- a= LUTRGBA+debG;
- for(int i=0;i<lengthG;i++) {
- *(a+1) = lutG[i*mult+1];
- a+=4;
- }
- a= LUTRGBA+debB;
- for(int i=0;i<lengthB;i++) {
- *(a+2) = lutB[i*mult+1];
- a+=4;
- }
- for(int i=0;i<255;i++) {
- *(a+3) = 1; // Alpha component
- a+=4;
- }
-
-for (int i=0;i<255;i++)
- printf ( "%d %02x %02x %02x %02x \n",
- i,(LUTRGBA+i*4)[0],(LUTRGBA+i*4)[1],(LUTRGBA+i*4)[2],(LUTRGBA+i*4)[3]);
-
-// WHY does it seg fault ?!?
-//free(LutR); free(LutB); free(LutG); printf ("libere\n");
-
- return(LUTRGBA);
-}
-