1 //This is needed when compiling in debug mode
3 // 'identifier' : class 'type' needs to have dll-interface to be used by
4 // clients of class 'type2'
5 #pragma warning ( disable : 4251 )
6 // 'identifier' : identifier was truncated to 'number' characters in the
8 #pragma warning ( disable : 4786 )
13 #include <ctype.h> /* to declare isprint() */
15 #define str2num(str, typeNum) *((typeNum *)(str))
17 static int _gdcm_read_RLE_fragment (char ** image_buffer,
19 long uncompressedSegmentSize,
21 // static because nothing but gdcm_read_RLE_file may call it
23 // ----------------------------------------------------------------------------
26 * \brief Reads a 'Run Length Encoded' Dicom encapsulated file
27 * @param image_buffer destination Address (in caller's memory space)
29 * pixel data should be copied
30 * @return int acts as a Boolean
33 // This is a debug version.
34 // Forget the printf as they will be removed
35 // as soon as the last Heuristics are checked
38 gdcmFile::gdcm_read_RLE_file (void * image_buffer) {
39 char * im = (char *)image_buffer;
40 cout << "RLE image" << std::endl;
42 long RleSegmentLength[15],fragmentLength,uncompressedSegmentSize;;
44 guint32 nbRleSegments;
45 guint32 RleSegmentOffsetTable[15];
46 guint16 ItemTagGr,ItemTagEl;
47 uncompressedSegmentSize=GetXSize()*GetYSize();
48 printf("uncompressedSegmentSize %d\n",uncompressedSegmentSize);
50 // Basic Offset Table with Item Value
52 fread(&ItemTagGr,2,1,fp); // Reading (fffe):Basic Offset Table Item Tag Gr
53 fread(&ItemTagEl,2,1,fp); // Reading (e000):Basic Offset Table Item Tag El
55 ItemTagGr=SwapShort(ItemTagGr);
56 ItemTagEl=SwapShort(ItemTagEl);
58 printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
59 ftellRes,ItemTagGr,ItemTagEl );
64 ln=SwapLong(ln); // Basic Offset Table Item Lentgh
65 printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n",
68 // What is it used for ??
69 char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
70 fread(BasicOffsetTableItemValue,ln,1,fp);
72 for (int i=0;i<ln;i+=4){
73 a=str2num(&BasicOffsetTableItemValue[i],guint32);
74 printf(" x(%08x) %d\n",a,a);
79 fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
80 fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
82 ItemTagGr=SwapShort(ItemTagGr);
83 ItemTagEl=SwapShort(ItemTagEl);
85 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
86 ftellRes,ItemTagGr,ItemTagEl );
88 // while 'Sequence Delimiter Item' (fffe,e0dd) not found
89 while ( ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) {
90 // Parse fragments of the current Fragment (Frame)
92 fread(&fragmentLength,4,1,fp);
94 fragmentLength=SwapLong(fragmentLength); // length
95 printf(" at %x : fragment length %d x(%08x)\n",
96 ftellRes, fragmentLength,fragmentLength);
98 // scanning fragment pixels
100 fread(&nbRleSegments,4,1,fp); // Reading : Number of RLE Segments
102 nbRleSegments=SwapLong(nbRleSegments);
103 printf(" Nb of RLE Segments : %d\n",nbRleSegments);
105 for(int k=1; k<=15; k++) { // Reading RLE Segments Offset Table
107 fread(&RleSegmentOffsetTable[k],4,1,fp);
109 RleSegmentOffsetTable[k]=SwapLong(RleSegmentOffsetTable[k]);
110 printf(" at : %x Offset Segment %d : %d (%x)\n",
111 ftellRes,k,RleSegmentOffsetTable[k],RleSegmentOffsetTable[k]);
114 if (nbRleSegments>1) {
115 for(int k=1; k<=nbRleSegments-1; k++) { // reading RLE Segments
116 RleSegmentLength[k]=RleSegmentOffsetTable[k+1]-RleSegmentOffsetTable[k];
118 printf (" Segment %d : Length = %d Start at %x\n",
119 k,RleSegmentLength[k], ftellRes);
120 _gdcm_read_RLE_fragment (&im, RleSegmentLength[k],uncompressedSegmentSize,fp);
121 //fseek(fp,RleSegmentLength[k],SEEK_CUR);
125 RleSegmentLength[nbRleSegments] = fragmentLength - RleSegmentOffsetTable[nbRleSegments]; // + 4;
126 // 4 : bytes for number of RLE Segments (WHY ???);
127 // TODO : Check the value
129 printf (" Segment %d : Length = %d Start at %x\n",
130 nbRleSegments,RleSegmentLength[nbRleSegments],ftellRes);
131 _gdcm_read_RLE_fragment (&im, RleSegmentLength[nbRleSegments],uncompressedSegmentSize, fp);
132 //fseek(fp,RleSegmentLength[nbRleSegments],SEEK_CUR);
135 // end of scanning fragment pixels
138 fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
139 fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
141 ItemTagGr=SwapShort(ItemTagGr);
142 ItemTagEl=SwapShort(ItemTagEl);
144 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
145 ftellRes,ItemTagGr,ItemTagEl );
151 /* -------------------------------------------------------------------- */
153 // RLE LossLess Fragment
155 /* -------------------------------------------------------------------- */
157 // static because nothing but gdcm_read_RLE_file can call it
161 _gdcm_read_RLE_fragment (char ** areaToRead,
163 long uncompressedSegmentSize,
167 long numberOfOutputBytes=0;
170 printf ("Fragment begin : %x lengthToDecode %d\n",ftellRes,lengthToDecode);
172 while(numberOfOutputBytes<uncompressedSegmentSize) {
175 fread(&n,sizeof(char),1,fp);
177 //printf (" Piece begin : %x count : %d x(%x)\n",ftellRes, count, count);
178 if (count >= 0 && count <= 127) {
179 fread(*areaToRead,(count+1)*sizeof(char),1,fp);
180 *areaToRead+=count+1;
181 numberOfOutputBytes+=count+1;
183 if (count <= -1 && count >= -127) {
184 fread(&car,sizeof(char),1,fp);
185 for(int i=0; i<-count+1; i++) {
186 (*areaToRead)[i]=car;
188 *areaToRead+=(-count+1);
189 numberOfOutputBytes+=(-count+1);
192 // if count = 128 output nothing (See : PS 3.5-2003 Page 86)