+ }
+
+ // ----------------------------- JPEG Compressed File .
+
+ int nb;
+ string str_nb=gdcmHeader::GetPubElValByNumber(0x0028,0x0100);
+ if (str_nb == GDCM_UNFOUND ) {
+ nb = 16;
+ } else {
+ nb = atoi(str_nb.c_str() );
+ if (nb == 12) nb =16;
+ }
+ int nBytes= nb/8;
+
+ //int taille = GetXSize() * GetYSize() * GetZSize() * GetSamplesPerPixel();
+ int taille = GetXSize() * GetYSize() * GetSamplesPerPixel();
+
+
+ // ------------------------------- JPEG LossLess : call to Jpeg Libido
+
+ if (IsJPEGLossless() && GetZSize() == 1) {
+
+ int ln; // Position on begining of Jpeg Pixels
+ fseek(fp,4,SEEK_CUR); // skipping (fffe,e000) : Basic Offset Table Item
+ fread(&ln,4,1,fp);
+ if(GetSwapCode())
+ ln=SwapLong(ln); // Item length
+ fseek(fp,ln,SEEK_CUR); // skipping Basic Offset Table ('ln' bytes)
+ fseek(fp,4,SEEK_CUR); // skipping (fffe,e000) : First fragment Item Tag
+ fread(&ln,4,1,fp); // First fragment length (just to know)
+ if(GetSwapCode())
+ ln=SwapLong(ln);
+
+ ClbJpeg* jpg = _IdDcmJpegRead(fp); // TODO : find a 'full' one.
+ // (We use the LibIDO one :-(
+ if(jpg == NULL) {
+ CloseFile();
+ return false;
+ }
+ int * dataJpg = jpg->DataImg;
+
+ switch (nBytes) {
+ case 1:
+ {
+ unsigned short *dest = (unsigned short *)destination;
+ for (int i=0; i<taille; i++) {
+ *((unsigned char *)dest+i) = *(dataJpg +i);
+ }
+ }
+ break;
+
+ case 2:
+ {
+ unsigned short *dest = (unsigned short *)destination;
+ for (int i=0; i<taille; i++) {
+ *((unsigned short *)dest+i) = *(dataJpg +i);
+ }
+ }
+ break;
+ }
+ _IdDcmJpegFree (jpg);
+ return true;
+ }
+
+ // ------------------------------- JPEG Lossy : call to IJG 6b
+
+ long fragmentBegining; // for ftell, fseek
+
+ bool a=0, b=0;
+
+ a = gdcmHeader::IsRLELossLessTransferSyntax();
+ if (!a)
+ bool b = gdcmHeader::IsJPEG2000();
+
+ bool res;
+ guint16 ItemTagGr,ItemTagEl;
+ int ln; // Position on begining of Jpeg Pixels
+
+ fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
+ fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
+ if(GetSwapCode()) {
+ ItemTagGr=SwapShort(ItemTagGr);
+ ItemTagEl=SwapShort(ItemTagEl);
+ }
+ fread(&ln,4,1,fp);
+ if(GetSwapCode())
+ ln=SwapLong(ln); // Basic Offset Table Item length
+
+ if (ln != 0) {
+ // What is it used for ?!?
+ char *BasicOffsetTableItemValue = (char *)malloc(ln+1);
+ fread(BasicOffsetTableItemValue,ln,1,fp);
+ }
+
+ // first Fragment initialisation
+ fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
+ fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
+ if(GetSwapCode()) {
+ ItemTagGr=SwapShort(ItemTagGr);
+ ItemTagEl=SwapShort(ItemTagEl);
+ }
+
+ // parsing fragments until Sequence Delim. Tag found
+ //unsigned short *dest = (unsigned short *)destination;
+
+ while ( ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) {
+ fread(&ln,4,1,fp);
+ if(GetSwapCode())
+ ln=SwapLong(ln); // Fragment Item length
+
+ // FIXME : multi fragments
+ fragmentBegining=ftell(fp);
+
+ if (a)
+ res = (bool)gdcm_read_RLE_file (destination); // Reading Fragment pixels
+ else if (b)
+ res = (bool)gdcm_read_JPEG2000_file (destination); // Reading Fragment pixels
+
+ else if (IsJPEGLossless()) { // ------------- call to LibIDO Jpeg for each Frame/fragment
+
+ // Warning : Works only if there is one fragment per frame
+ // (Or a single fragment for the multiframe file)
+ ClbJpeg* jpg = _IdDcmJpegRead(fp); // TODO : find a 'full' one.
+ // (We use the LibIDO one :-(
+ if(jpg == NULL) {
+ CloseFile();
+ return false;
+ }
+ int * dataJpg = jpg->DataImg;
+ unsigned short *dest = (unsigned short *)destination;
+ switch (nBytes) {
+ case 1:
+ {
+ for (int i=0; i<taille; i++) {
+ *((unsigned char *)dest+i) = *(dataJpg +i);
+ }
+ break;
+ }
+
+ case 2:
+ {
+ for (int i=0; i<taille; i++) {
+ *((unsigned short *)dest+i) = *(dataJpg +i);
+ }
+ break;
+ }
+ }
+ _IdDcmJpegFree (jpg);
+
+ } // ------------------------------------- endif (IsJPEGLossless())
+
+ else
+ if (GetBitsStored() == 8) {
+ res = (bool)gdcm_read_JPEG_file (destination); // Reading Fragment pixels
+ } else {
+ res = (bool)gdcm_read_JPEG_file12 (destination);// Reading Fragment pixels
+ }
+
+ if (!res) break;
+
+ // FIXME : will work only when each fragment corresponds to a Frame :-(
+
+ destination = (char *)destination + taille * nBytes; // location in user's memory
+ // for next fragment (if any)
+ // TODO : find a suitable file (multifragment/single Frame Jpeg file) to check
+
+ fseek(fp,fragmentBegining,SEEK_SET); // To be sure we start
+ fseek(fp,ln,SEEK_CUR); // at the begining of next fragment
+
+ ItemTagGr = ItemTagEl =0;
+ fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
+ fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
+ if(GetSwapCode()) {
+ ItemTagGr=SwapShort(ItemTagGr);
+ ItemTagEl=SwapShort(ItemTagEl);
+ }
+
+ //(char *) destination += taille * nBytes;
+ //cout << "destination" << destination << "\n";
+ }
+
+ return res;