2 //-----------------------------------------------------------------------------
5 #include <ctype.h> /* to declare isprint() */
7 #define str2num(str, typeNum) *((typeNum *)(str))
9 //-----------------------------------------------------------------------------
12 * \brief Reads a 'Run Length Encoded' Dicom encapsulated file
13 * @param fp already open File Pointer
14 * @param image_buffer destination Address (in caller's memory space)
15 * at which the pixel data should be copied
19 bool gdcmFile::gdcm_read_RLE_file (FILE *fp,void * image_buffer) {
20 long fragmentBegining; // for ftell, fseek
21 char * im = (char *)image_buffer;
23 long RleSegmentLength[15],fragmentLength,uncompressedSegmentSize;;
25 guint32 nbRleSegments;
26 guint32 RleSegmentOffsetTable[15];
27 guint16 ItemTagGr,ItemTagEl;
28 uncompressedSegmentSize=Header->GetXSize()*Header->GetYSize();
30 // Basic Offset Table with Item Value
32 fread(&ItemTagGr,2,1,fp); // Reading (fffe):Basic Offset Table Item Tag Gr
33 fread(&ItemTagEl,2,1,fp); // Reading (e000):Basic Offset Table Item Tag El
34 if(Header->GetSwapCode()) {
35 ItemTagGr=Header->SwapShort(ItemTagGr);
36 ItemTagEl=Header->SwapShort(ItemTagEl);
41 if(Header->GetSwapCode())
42 ln=Header->SwapLong(ln); // Basic Offset Table Item Lentgh
44 // What is it used for ??
45 char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
46 fread(BasicOffsetTableItemValue,ln,1,fp);
48 for (int i=0;i<ln;i+=4){
49 a=str2num(&BasicOffsetTableItemValue[i],guint32);
54 fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
55 fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
56 if(Header->GetSwapCode()) {
57 ItemTagGr=Header->SwapShort(ItemTagGr);
58 ItemTagEl=Header->SwapShort(ItemTagEl);
61 // while 'Sequence Delimiter Item' (fffe,e0dd) not found
62 while ( ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) {
63 // Parse fragments of the current Fragment (Frame)
65 fread(&fragmentLength,4,1,fp);
66 if(Header->GetSwapCode())
67 fragmentLength=Header->SwapLong(fragmentLength); // length
69 //------------------ scanning (not reading) fragment pixels
71 fread(&nbRleSegments,4,1,fp); // Reading : Number of RLE Segments
72 if(Header->GetSwapCode())
73 nbRleSegments=Header->SwapLong(nbRleSegments);
75 for(int k=1; k<=15; k++) { // Reading RLE Segments Offset Table
77 fread(&RleSegmentOffsetTable[k],4,1,fp);
78 if(Header->GetSwapCode())
79 RleSegmentOffsetTable[k]=Header->SwapLong(RleSegmentOffsetTable[k]);
82 if (nbRleSegments>1) {
83 for(int k=1; k<=nbRleSegments-1; k++) { // reading RLE Segments
84 RleSegmentLength[k]=RleSegmentOffsetTable[k+1]-RleSegmentOffsetTable[k];
86 fragmentBegining=ftell(fp);
87 gdcm_read_RLE_fragment (&im, RleSegmentLength[k],uncompressedSegmentSize,fp);
88 fseek(fp,fragmentBegining,SEEK_SET);
89 fseek(fp,RleSegmentLength[k],SEEK_CUR);
92 RleSegmentLength[nbRleSegments] = fragmentLength - RleSegmentOffsetTable[nbRleSegments];
94 fragmentBegining=ftell(fp);
95 gdcm_read_RLE_fragment (&im, RleSegmentLength[nbRleSegments],uncompressedSegmentSize, fp);
96 fseek(fp,fragmentBegining,SEEK_SET);
97 fseek(fp,RleSegmentLength[nbRleSegments],SEEK_CUR);
99 // end of scanning fragment pixels
102 fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
103 fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
104 if(Header->GetSwapCode()) {
105 ItemTagGr=Header->SwapShort(ItemTagGr);
106 ItemTagEl=Header->SwapShort(ItemTagEl);
110 if (Header->GetBitsAllocated()==16) { // try to deal with RLE 16 Bits
112 im = (char *)image_buffer;
113 // need to make 16 Bits Pixels from Low Byte and Hight Byte 'Planes'
115 int l = Header->GetXSize()*Header->GetYSize();
116 int nbFrames = Header->GetZSize();
118 char * newDest = (char*) malloc(l*nbFrames*2);
120 char * a = (char *)image_buffer;
123 for (int i=0;i<nbFrames;i++) {
124 for (int j=0;j<l; j++) {
129 memmove(image_buffer,newDest,lgrTotale);
137 // ----------------------------------------------------------------------------
138 // RLE LossLess Fragment
139 int gdcmFile::gdcm_read_RLE_fragment(char **areaToRead, long lengthToDecode,
140 long uncompressedSegmentSize, FILE *fp) {
143 long numberOfOutputBytes=0;
147 while(numberOfOutputBytes<uncompressedSegmentSize) {
149 fread(&n,sizeof(char),1,fp);
151 if (count >= 0 && count <= 127) {
152 fread(*areaToRead,(count+1)*sizeof(char),1,fp);
153 *areaToRead+=count+1;
154 numberOfOutputBytes+=count+1;
156 if (count <= -1 && count >= -127) {
157 fread(&car,sizeof(char),1,fp);
158 for(int i=0; i<-count+1; i++) {
159 (*areaToRead)[i]=car;
161 *areaToRead+=(-count+1);
162 numberOfOutputBytes+=(-count+1);
165 // if count = 128 output nothing (See : PS 3.5-2003 Page 86)
170 // ----------------------------------------------------------------------------