+#include <ctype.h> // to declare isprint()
+
+#define str2num(str, typeNum) *((typeNum *)(str))
+
+//-----------------------------------------------------------------------------
+/**
+ * \ingroup gdcmFile
+ * \brief Reads a 'Run Length Encoded' Dicom encapsulated file
+ * @param fp already open File Pointer
+ * @param image_buffer destination Address (in caller's memory space)
+ * at which the pixel data should be copied
+ * @return Boolean
+ */
+bool gdcmFile::gdcm_read_RLE_file (FILE *fp,void * image_buffer) {
+ long fragmentBegining; // for ftell, fseek
+ char * im = (char *)image_buffer;
+
+ long RleSegmentLength[15],fragmentLength,uncompressedSegmentSize;;
+ long ftellRes, ln;
+ guint32 nbRleSegments;
+ guint32 RleSegmentOffsetTable[15];
+ guint16 ItemTagGr,ItemTagEl;
+ uncompressedSegmentSize=Header->GetXSize()*Header->GetYSize();
+ ftellRes=ftell(fp);
+ // Basic Offset Table with Item Value
+ // Item Tag
+ fread(&ItemTagGr,2,1,fp); // Reading (fffe):Basic Offset Table Item Tag Gr
+ fread(&ItemTagEl,2,1,fp); // Reading (e000):Basic Offset Table Item Tag El
+ if(Header->GetSwapCode()) {
+ ItemTagGr=Header->SwapShort(ItemTagGr);
+ ItemTagEl=Header->SwapShort(ItemTagEl);
+ }
+ // Item Length
+ ftellRes=ftell(fp);
+ fread(&ln,4,1,fp);
+ if(Header->GetSwapCode())
+ ln=Header->SwapLong(ln); // Basic Offset Table Item Lentgh
+ if (ln != 0) {
+ // What is it used for ??
+ char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
+ fread(BasicOffsetTableItemValue,ln,1,fp);
+ guint32 a;
+ for (int i=0;i<ln;i+=4){
+ a=str2num(&BasicOffsetTableItemValue[i],guint32);
+ }
+ }
+
+ ftellRes=ftell(fp);
+ fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
+ fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
+ if(Header->GetSwapCode()) {
+ ItemTagGr=Header->SwapShort(ItemTagGr);
+ ItemTagEl=Header->SwapShort(ItemTagEl);
+ }
+
+ // while 'Sequence Delimiter Item' (fffe,e0dd) not found
+ while ( ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) {
+ // Parse fragments of the current Fragment (Frame)
+ ftellRes=ftell(fp);
+ fread(&fragmentLength,4,1,fp);
+ if(Header->GetSwapCode())
+ fragmentLength=Header->SwapLong(fragmentLength); // length
+
+ //------------------ scanning (not reading) fragment pixels