X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2Fjdatasrc.cxx;h=cfb526abd8593898d18c825923ecb1f799227669;hb=224876ca6cbe71952f2a1d66d9853eca7745d3a0;hp=e6c644307dd4b8840ba28903a23c4637b90cef67;hpb=fea9426f960497d2d9124ab532d2097f2915678f;p=gdcm.git diff --git a/src/jdatasrc.cxx b/src/jdatasrc.cxx index e6c64430..cfb526ab 100644 --- a/src/jdatasrc.cxx +++ b/src/jdatasrc.cxx @@ -1,5 +1,5 @@ /* - * jdatasrc.c + * jdatasrc.cxx * * Copyright (C) 1994-1996, Thomas G. Lane. * This file is part of the Independent JPEG Group's software. @@ -18,12 +18,21 @@ /* Expanded data source object for stdio input */ +extern "C" { + typedef boolean(*boolean_jpeg_decompress_struct)(jpeg_decompress_struct*); + typedef void(*void_jpeg_decompress_struct)(jpeg_decompress_struct*); + typedef void(*void_jpeg_decompress_struct_long)(jpeg_decompress_struct*,long); +} + typedef struct { struct jpeg_source_mgr pub; /* public fields */ - std::ifstream *infile; /* source stream */ + std::istream *infile; /* source stream */ JOCTET * buffer; /* start of buffer */ boolean start_of_file; /* have we gotten any data yet? */ + + GDCM_NAME_SPACE::JPEGFragment *frag; + size_t bytes_read; } my_source_mgr; typedef my_source_mgr * my_src_ptr; @@ -87,7 +96,19 @@ fill_input_buffer (j_decompress_ptr cinfo) { my_src_ptr src = (my_src_ptr) cinfo->src; - src->infile->read( (char*)src->buffer, INPUT_BUF_SIZE); + if( src->bytes_read == src->frag->GetLength() ) + { + // Start the I/O suspension simply by returning false here: + return FALSE; + } + + size_t input_buf_size = INPUT_BUF_SIZE; + if( (src->bytes_read + INPUT_BUF_SIZE) > src->frag->GetLength() ) + { + input_buf_size = src->frag->GetLength() - src->bytes_read; + } + + src->infile->read( (char*)src->buffer, input_buf_size); size_t nbytes = src->infile->gcount(); if (nbytes <= 0) { @@ -103,6 +124,7 @@ fill_input_buffer (j_decompress_ptr cinfo) src->pub.next_input_byte = src->buffer; src->pub.bytes_in_buffer = nbytes; src->start_of_file = FALSE; + src->bytes_read += nbytes; return TRUE; } @@ -176,7 +198,7 @@ term_source (j_decompress_ptr cinfo) */ GLOBAL(void) -jpeg_stdio_src (j_decompress_ptr cinfo, std::ifstream * infile) +jpeg_stdio_src (j_decompress_ptr cinfo, std::istream * infile, GDCM_NAME_SPACE::JPEGFragment *frag, int flag) { my_src_ptr src; @@ -198,12 +220,20 @@ jpeg_stdio_src (j_decompress_ptr cinfo, std::ifstream * infile) } src = (my_src_ptr) cinfo->src; - src->pub.init_source = init_source; - src->pub.fill_input_buffer = fill_input_buffer; - src->pub.skip_input_data = skip_input_data; + src->pub.init_source = reinterpret_cast(init_source); + src->pub.fill_input_buffer = reinterpret_cast(fill_input_buffer); + src->pub.skip_input_data = reinterpret_cast(skip_input_data); src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ - src->pub.term_source = term_source; + src->pub.term_source = reinterpret_cast(term_source); src->infile = infile; - src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ - src->pub.next_input_byte = NULL; /* until buffer loaded */ + + // Need to setup a new buffer, clean bytes_in_buffer and next_input_byte + if( flag ) + { + src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ + src->pub.next_input_byte = NULL; /* until buffer loaded */ + } + //only upate the new fragment, valid for both 'flag' value + src->frag = frag; + src->bytes_read = 0; }