diff --git a/imageflow_core/src/codecs/libpng_decoder.rs b/imageflow_core/src/codecs/libpng_decoder.rs index 88d3a47b7..1dfbe3c63 100644 --- a/imageflow_core/src/codecs/libpng_decoder.rs +++ b/imageflow_core/src/codecs/libpng_decoder.rs @@ -151,9 +151,10 @@ impl PngDec{ let buffer_slice = unsafe{ std::slice::from_raw_parts_mut(buffer, bytes_requested) }; - return match decoder.io.read_exact(buffer_slice) { - Ok(()) => { - *out_bytes_read = buffer_slice.len(); + return match decoder.io.read_maximally(buffer_slice) { + Ok(read_total) => { + assert!(read_total <= bytes_requested); + *out_bytes_read = read_total; true }, Err(err) => { diff --git a/imageflow_core/src/io.rs b/imageflow_core/src/io.rs index 9c77ea201..8a861b327 100644 --- a/imageflow_core/src/io.rs +++ b/imageflow_core/src/io.rs @@ -135,6 +135,22 @@ impl IoProxy { self.backend.get_read().expect("cannot read from writer").read_exact(buf) } + pub fn read(&mut self, buf: &mut [u8]) -> std::io::Result{ + self.backend.get_read().expect("cannot read from writer").read(buf) + } + + pub fn read_maximally(&mut self, buf: &mut [u8]) -> std::io::Result{ + let mut total_read = 0; + while total_read < buf.len(){ + let read = self.read(&mut buf[total_read..])?; + if read == 0{ + break; + } + total_read += read; + } + Ok(total_read) + } + pub fn read_file(context: &Context, filename: PathBuf, io_id: i32) -> Result { IoProxy::file_with_mode(context, io_id, filename,IoDirection::In) }