+ std::string lutDescriptionB = GetEntryByNumber(0x0028,0x1103);
+ if ( lutDescriptionB == GDCM_UNFOUND )
+ {
+ return NULL;
+ }
+
+ // lengthR: Red LUT length in Bytes
+ // debR: subscript of the first Lut Value
+ // nbitsR: Lut item size (in Bits)
+ int nbRead = sscanf( lutDescriptionR.c_str(), "%d\\%d\\%d",
+ &lengthR, &debR, &nbitsR );
+ if( nbRead != 3 )
+ {
+ dbg.Verbose(0, "gdcmHeader::GetLUTRGBA: trouble reading red LUT");
+ }
+
+ // lengthG: Green LUT length in Bytes
+ // debG: subscript of the first Lut Value
+ // nbitsG: Lut item size (in Bits)
+ nbRead = sscanf( lutDescriptionG.c_str(), "%d\\%d\\%d",
+ &lengthG, &debG, &nbitsG );
+ if( nbRead != 3 )
+ {
+ dbg.Verbose(0, "gdcmHeader::GetLUTRGBA: trouble reading green LUT");
+ }
+
+ // lengthB: Blue LUT length in Bytes
+ // debB: subscript of the first Lut Value
+ // nbitsB: Lut item size (in Bits)
+ nbRead = sscanf( lutDescriptionB.c_str(), "%d\\%d\\%d",
+ &lengthB, &debB, &nbitsB );
+ if( nbRead != 3 )
+ {
+ dbg.Verbose(0, "gdcmHeader::GetLUTRGBA: trouble reading blue LUT");
+ }
+
+ // Load LUTs into memory, (as they were stored on disk)
+ uint8_t* lutR = (uint8_t*) GetEntryVoidAreaByNumber(0x0028,0x1201);
+ uint8_t* lutG = (uint8_t*) GetEntryVoidAreaByNumber(0x0028,0x1202);
+ uint8_t* lutB = (uint8_t*) GetEntryVoidAreaByNumber(0x0028,0x1203);
+
+ if ( !lutR || !lutG || !lutB )
+ {
+ dbg.Verbose(0, "gdcmHeader::GetLUTRGBA: trouble with one of the LUT");
+ return NULL;
+ }
+ // forge the 4 * 8 Bits Red/Green/Blue/Alpha LUT
+
+ uint8_t* LUTRGBA = new uint8_t[1024]; // 256 * 4 (R, G, B, Alpha)
+ if ( !LUTRGBA )
+ {
+ return NULL;
+ }
+ memset(LUTRGBA, 0, 1024);
+
+ // Bits Allocated
+ int nb;
+ std::string str_nb = GetEntryByNumber(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 (useless ?)overhead
+ // (optimistic asumption)
+ uint8_t* a;
+ int i;
+
+ a = LUTRGBA + 0;
+ for( i=0; i < lengthR; ++i)
+ {
+ *a = lutR[i*mult+1];
+ a += 4;
+ }
+
+ a = LUTRGBA + 1;
+ for( i=0; i < lengthG; ++i)
+ {
+ *a = lutG[i*mult+1];
+ a += 4;
+ }
+
+ a = LUTRGBA + 2;
+ for(i=0; i < lengthB; ++i)
+ {
+ *a = lutB[i*mult+1];
+ a += 4;
+ }
+
+ a = LUTRGBA + 3;
+ for(i=0; i < 256; ++i)
+ {
+ *a = 1; // Alpha component
+ a += 4;
+ }
+
+ return LUTRGBA;
+}