+ pImage = (uint8_t*)image_buffer;
+ // This struct contains the JPEG decompression parameters and pointers to
+ // working space (which is allocated as needed by the JPEG library).
+
+ static struct jpeg_decompress_struct cinfo;
+
+ // -------------- inside, we found :
+ // JDIMENSION image_width; // input image width
+ // JDIMENSION image_height; // input image height
+ // int input_components; // nb of color components in input image
+ // J_COLOR_SPACE in_color_space; // colorspace of input image
+ // double input_gamma; // image gamma of input image
+
+ // We use our private extension JPEG error handler.
+ // Note that this struct must live as long as the main JPEG parameter
+ // struct, to avoid dangling-pointer problems.
+
+ struct my_error_mgr jerr;
+
+ JSAMPARRAY buffer;// Output row buffer
+
+ // rappel :
+ // ------
+ // typedef unsigned char JSAMPLE;
+ // typedef JSAMPLE FAR *JSAMPROW;/* ptr to one image row of pixel samples. */
+ // typedef JSAMPROW *JSAMPARRAY;/* ptr to some rows (a 2-D sample array) */
+ // typedef JSAMPARRAY *JSAMPIMAGE;/* a 3-D sample array: top index is color */
+
+ int row_stride;// physical row width in output buffer
+
+ // We set up the normal JPEG error routines, then override error_exit.
+
+ cinfo.err = jpeg_std_error(&jerr.pub);
+ // for any jpeg error call my_error_exit
+ jerr.pub.error_exit = my_error_exit;
+ // for any output message call my_output_message
+ //jerr.pub.output_message = my_output_message;
+
+ // Establish the setjmp return context for my_error_exit to use.
+ if (setjmp(jerr.setjmp_buffer))
+ {
+ // If we get here, the JPEG code has signaled an error.
+ // We need to clean up the JPEG object, close the input file, and return.
+
+ gdcmErrorMacro( "Serious Problem !" );
+ jpeg_destroy_decompress(&cinfo);
+ return 0;
+ }
+ // Now we can initialize the JPEG decompression object.
+ if ( statesuspension == 0 )
+ {
+ jpeg_create_decompress(&cinfo);
+ jpeg_stdio_src(&cinfo, fp, this, 1);
+ }
+ else
+ {
+ jpeg_stdio_src(&cinfo, fp, this, 0);
+ }
+ // Step 3: read file parameters with jpeg_read_header()
+
+ if ( statesuspension < 2 )
+ {
+ if ( jpeg_read_header(&cinfo, TRUE) == JPEG_SUSPENDED )
+ {
+ // Suspension in jpeg_read_header
+ statesuspension = 2;
+ }
+
+ // Step 4: set parameters for decompression
+ // prevent the library from performing any color space conversion
+ if ( cinfo.process == JPROC_LOSSLESS )
+ {
+ cinfo.jpeg_color_space = JCS_UNKNOWN;
+ cinfo.out_color_space = JCS_UNKNOWN;
+ }
+ }
+
+ // Step 5: Start decompressor
+ if (statesuspension < 3 )
+ {
+ if ( jpeg_start_decompress(&cinfo) == FALSE )
+ {
+ // Suspension: jpeg_start_decompress
+ statesuspension = 3;
+ }
+
+ // JSAMPLEs per row in output buffer
+ row_stride = cinfo.output_width * cinfo.output_components*2;
+
+ // Make a one-row-high sample array that will go away when done with image
+ buffer = (*cinfo.mem->alloc_sarray)
+ ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
+
+ // Step 6: while (scan lines remain to be read)
+
+ // Save the buffer in case of suspension to be able to reuse it later:
+ SampBuffer = buffer;
+ }
+ else
+ {
+ // Suspension: re-use the buffer:
+ buffer = (JSAMPARRAY)SampBuffer;
+ }
+ int bufsize = cinfo.output_width * cinfo.output_components;
+ size_t rowsize = bufsize * sizeof(JSAMPLE);
+
+ while (cinfo.output_scanline < cinfo.output_height)
+ {
+ if ( jpeg_read_scanlines(&cinfo, buffer, 1) == 0 )
+ {
+ // Suspension in jpeg_read_scanlines
+ statesuspension = 3;
+ return true;
+ }
+// The ijg has no notion of big endian, therefore always swap the jpeg stream
+#if (defined(GDCM_WORDS_BIGENDIAN) || defined(GDCM_FORCE_BIGENDIAN_EMULATION)) && (CMAKE_BITS_IN_JSAMPLE != 8)
+ uint16_t *buffer16 = (uint16_t*)*buffer;
+ uint16_t *pimage16 = (uint16_t*)pImage;
+ for(unsigned int i=0;i<rowsize/2;i++)
+ pimage16[i] = (buffer16[i] >> 8) | (buffer16[i] << 8 );
+#else
+ memcpy( pImage, *buffer,rowsize);
+#endif //GDCM_WORDS_BIGENDIAN
+ pImage+=rowsize;
+ }
+
+ // Step 7: Finish decompression
+ if ( jpeg_finish_decompress(&cinfo) == FALSE )
+ {
+ // Suspension: jpeg_finish_decompress
+ statesuspension = 4;
+ }
+
+ // Step 8: Release JPEG decompression object
+ jpeg_destroy_decompress(&cinfo);
+
+ // At this point you may want to check to see whether any corrupt-data
+ // warnings occurred (test whether jerr.pub.num_warnings is nonzero).
+
+ return true;