From 5808cd0b0651b7b9b866a2eb57a464386811ba3e Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Mon, 22 Jul 2024 15:59:01 +1200 Subject: [PATCH 1/3] Add TiffFormatError::ShortExpected enum variant For values expected to be u16. --- src/decoder/ifd.rs | 4 +--- src/error.rs | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/decoder/ifd.rs b/src/decoder/ifd.rs index 9be0d35..2e6c321 100644 --- a/src/decoder/ifd.rs +++ b/src/decoder/ifd.rs @@ -59,9 +59,7 @@ impl Value { Short(val) => Ok(val), Unsigned(val) => Ok(u16::try_from(val)?), UnsignedBig(val) => Ok(u16::try_from(val)?), - val => Err(TiffError::FormatError( - TiffFormatError::UnsignedIntegerExpected(val), - )), + val => Err(TiffError::FormatError(TiffFormatError::ShortExpected(val))), } } diff --git a/src/error.rs b/src/error.rs index 71fd972..1d53c35 100644 --- a/src/error.rs +++ b/src/error.rs @@ -69,6 +69,7 @@ pub enum TiffFormatError { UnknownPlanarConfiguration(u16), ByteExpected(Value), SignedByteExpected(Value), + ShortExpected(Value), SignedShortExpected(Value), UnsignedIntegerExpected(Value), SignedIntegerExpected(Value), @@ -122,6 +123,7 @@ impl fmt::Display for TiffFormatError { } ByteExpected(ref val) => write!(fmt, "Expected byte, {:?} found.", val), SignedByteExpected(ref val) => write!(fmt, "Expected signed byte, {:?} found.", val), + ShortExpected(ref val) => write!(fmt, "Expected short, {:?} found.", val), SignedShortExpected(ref val) => write!(fmt, "Expected signed short, {:?} found.", val), UnsignedIntegerExpected(ref val) => { write!(fmt, "Expected unsigned integer, {:?} found.", val) From 36f8ee051eef03c20c8c4b568ccc397f6baa1df9 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Mon, 22 Jul 2024 16:31:12 +1200 Subject: [PATCH 2/3] Cast Short to u16 instead of u32 Adapted from https://github.com/image-rs/image-tiff/commit/84ff6795e0400305ce86478d5b200b2350457479 --- src/decoder/ifd.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/decoder/ifd.rs b/src/decoder/ifd.rs index 2e6c321..1680099 100644 --- a/src/decoder/ifd.rs +++ b/src/decoder/ifd.rs @@ -161,6 +161,7 @@ impl Value { } Ok(new_vec) } + Short(val) => Ok(vec![val.into()]), Unsigned(val) => Ok(vec![val]), UnsignedBig(val) => Ok(vec![u32::try_from(val)?]), Rational(numerator, denominator) => Ok(vec![numerator, denominator]), @@ -283,6 +284,7 @@ impl Value { } Ok(new_vec) } + Short(val) => Ok(vec![val.into()]), Unsigned(val) => Ok(vec![val.into()]), UnsignedBig(val) => Ok(vec![val]), Rational(numerator, denominator) => Ok(vec![numerator.into(), denominator.into()]), @@ -431,7 +433,7 @@ impl Entry { Type::BYTE => Unsigned(u32::from(self.offset[0])), Type::SBYTE => Signed(i32::from(self.offset[0] as i8)), Type::UNDEFINED => Byte(self.offset[0]), - Type::SHORT => Unsigned(u32::from(self.r(bo).read_u16()?)), + Type::SHORT => Short(self.r(bo).read_u16()?), Type::SSHORT => Signed(i32::from(self.r(bo).read_i16()?)), Type::LONG => Unsigned(self.r(bo).read_u32()?), Type::SLONG => Signed(self.r(bo).read_i32()?), From 1e3bcf2ec22571456367c5c5be436261f7aa57c7 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Mon, 22 Jul 2024 17:06:05 +1200 Subject: [PATCH 3/3] Cast SignedShort to i16 instead of i32 --- src/decoder/ifd.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/decoder/ifd.rs b/src/decoder/ifd.rs index 1680099..66ecaee 100644 --- a/src/decoder/ifd.rs +++ b/src/decoder/ifd.rs @@ -434,7 +434,7 @@ impl Entry { Type::SBYTE => Signed(i32::from(self.offset[0] as i8)), Type::UNDEFINED => Byte(self.offset[0]), Type::SHORT => Short(self.r(bo).read_u16()?), - Type::SSHORT => Signed(i32::from(self.r(bo).read_i16()?)), + Type::SSHORT => SignedShort(self.r(bo).read_i16()?), Type::LONG => Unsigned(self.r(bo).read_u32()?), Type::SLONG => Signed(self.r(bo).read_i32()?), Type::FLOAT => Float(self.r(bo).read_f32()?), @@ -509,7 +509,7 @@ impl Entry { let mut r = self.r(bo); let mut v = Vec::new(); for _ in 0..self.count { - v.push(Signed(i32::from(r.read_i16()?))); + v.push(SignedShort(r.read_i16()?)); } return Ok(List(v)); }