Prepare ImageDecoder split, avoid as_mut|unwrap
This commit is contained in:
1 parent
61867b46f9
commit
97d357d446
1 file changed
+23
-27
+23
-27
@@ -709,14 +709,20 @@ impl<R: Read + Seek> Decoder<R> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::unnecessary_unwrap)] // Lifetimes would overlap due to return.
|
// FIXME: this tuple would be a good candidate for a proxy, like IfdDecoder. That has been
|
||||||
fn ensure_image(&mut self) -> TiffResult<&mut Image> {
|
// requested in some form or another in a number of issues.
|
||||||
|
#[expect(clippy::unnecessary_unwrap)] // Lifetimes would overlap due to return.
|
||||||
|
fn ensure_image_and_reader(&mut self) -> TiffResult<(&mut Image, &mut ValueReader<R>)> {
|
||||||
if self.image.is_some() {
|
if self.image.is_some() {
|
||||||
return Ok(self.image.as_mut().unwrap());
|
return Ok((self.image.as_mut().unwrap(), &mut self.value_reader));
|
||||||
}
|
}
|
||||||
|
|
||||||
let image = Image::from_reader(&mut self.value_reader, &self.directory)?;
|
let image = Image::from_reader(&mut self.value_reader, &self.directory)?;
|
||||||
Ok(self.image.insert(image))
|
Ok((self.image.insert(image), &mut self.value_reader))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ensure_image(&mut self) -> TiffResult<&mut Image> {
|
||||||
|
Ok(self.ensure_image_and_reader()?.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The offset of the directory representing the current image.
|
/// The offset of the directory representing the current image.
|
||||||
@@ -1191,14 +1197,10 @@ impl<R: Read + Seek> Decoder<R> {
|
|||||||
chunk_index: u32,
|
chunk_index: u32,
|
||||||
layout: &image::ReadoutLayout,
|
layout: &image::ReadoutLayout,
|
||||||
) -> TiffResult<()> {
|
) -> TiffResult<()> {
|
||||||
let image = self.ensure_image()?;
|
let (image, value_reader) = self.ensure_image_and_reader()?;
|
||||||
let offset = image.chunk_file_range(chunk_index)?.0;
|
let offset = image.chunk_file_range(chunk_index)?.0;
|
||||||
|
value_reader.reader.goto_offset(offset)?;
|
||||||
self.goto_offset_u64(offset)?;
|
image.expand_chunk(value_reader, buffer, layout, chunk_index)?;
|
||||||
|
|
||||||
let image = self.image.as_mut().unwrap();
|
|
||||||
image.expand_chunk(&mut self.value_reader, buffer, layout, chunk_index)?;
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1350,7 +1352,7 @@ impl<R: Read + Seek> Decoder<R> {
|
|||||||
slice: TiffCodingUnit,
|
slice: TiffCodingUnit,
|
||||||
buffer: &mut [u8],
|
buffer: &mut [u8],
|
||||||
) -> TiffResult<()> {
|
) -> TiffResult<()> {
|
||||||
let image = self.ensure_image()?;
|
let (image, value_reader) = self.ensure_image_and_reader()?;
|
||||||
|
|
||||||
let (width, height) = image.chunk_data_dimensions(slice.0)?;
|
let (width, height) = image.chunk_data_dimensions(slice.0)?;
|
||||||
let readout = image.readout_for_size(width, height)?;
|
let readout = image.readout_for_size(width, height)?;
|
||||||
@@ -1375,16 +1377,9 @@ impl<R: Read + Seek> Decoder<R> {
|
|||||||
|
|
||||||
for (idx, &plane_offset) in plane_offsets[..used_plane_offsets].iter().enumerate() {
|
for (idx, &plane_offset) in plane_offsets[..used_plane_offsets].iter().enumerate() {
|
||||||
let chunk = slice.0 + idx as u32 * readout.chunks_per_plane;
|
let chunk = slice.0 + idx as u32 * readout.chunks_per_plane;
|
||||||
let offset = self.image.as_mut().unwrap().chunk_offsets[chunk as usize];
|
let offset = image.chunk_offsets[chunk as usize];
|
||||||
self.goto_offset_u64(offset)?;
|
value_reader.reader.goto_offset(offset)?;
|
||||||
|
image.expand_chunk(value_reader, &mut buffer[plane_offset..], readout, chunk)?;
|
||||||
let image = self.image.as_mut().unwrap();
|
|
||||||
image.expand_chunk(
|
|
||||||
&mut self.value_reader,
|
|
||||||
&mut buffer[plane_offset..],
|
|
||||||
readout,
|
|
||||||
chunk,
|
|
||||||
)?;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -1555,7 +1550,8 @@ impl<R: Read + Seek> Decoder<R> {
|
|||||||
/// Returns an error if the buffer fits less than one plane. In particular, for non-planar
|
/// Returns an error if the buffer fits less than one plane. In particular, for non-planar
|
||||||
/// images returns an error if the buffer does not fit the required size.
|
/// images returns an error if the buffer does not fit the required size.
|
||||||
pub fn read_image_bytes(&mut self, buffer: &mut [u8]) -> TiffResult<()> {
|
pub fn read_image_bytes(&mut self, buffer: &mut [u8]) -> TiffResult<()> {
|
||||||
let readout = self.ensure_image()?.readout_for_image()?;
|
let (image, value_reader) = self.ensure_image_and_reader()?;
|
||||||
|
let readout = image.readout_for_image()?;
|
||||||
|
|
||||||
let ref layout @ image::PlaneLayout {
|
let ref layout @ image::PlaneLayout {
|
||||||
ref plane_offsets,
|
ref plane_offsets,
|
||||||
@@ -1579,11 +1575,11 @@ impl<R: Read + Seek> Decoder<R> {
|
|||||||
|
|
||||||
for (idx, &plane_offset) in plane_offsets[..used_plane_offsets].iter().enumerate() {
|
for (idx, &plane_offset) in plane_offsets[..used_plane_offsets].iter().enumerate() {
|
||||||
let chunk = chunk + idx as u32 * readout.chunks_per_plane;
|
let chunk = chunk + idx as u32 * readout.chunks_per_plane;
|
||||||
let offset = self.image.as_ref().unwrap().chunk_offsets[chunk as usize];
|
let offset = image.chunk_offsets[chunk as usize];
|
||||||
self.goto_offset_u64(offset)?;
|
value_reader.reader.goto_offset(offset)?;
|
||||||
|
|
||||||
self.image.as_mut().unwrap().expand_chunk(
|
image.expand_chunk(
|
||||||
&mut self.value_reader,
|
value_reader,
|
||||||
&mut buffer[plane_offset..][buffer_offset..],
|
&mut buffer[plane_offset..][buffer_offset..],
|
||||||
readout,
|
readout,
|
||||||
chunk,
|
chunk,
|
||||||
|
|||||||
Reference in new issue
Block a user