Skip to content

Commit 0884082

Browse files
authored
Read SignedByte as i8, handle casting of Byte (u8) into unsigned types (#95)
* Handle casting of Byte (u8) into other unsigned types Adapted from image-rs/image-tiff@9fee8f6 * Cast SignedByte to i8 instead of i32 Adapted from image-rs/image-tiff@dd783c3
1 parent b13d259 commit 0884082

File tree

2 files changed

+23
-21
lines changed

2 files changed

+23
-21
lines changed

src/metadata/reader.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ async fn read_tag_value<F: MetadataFetch>(
343343
// 2b: the value is at most 4 bytes or doesn't fit in the offset field.
344344
return Ok(match tag_type {
345345
Type::BYTE | Type::UNDEFINED => Value::Byte(data.read_u8()?),
346-
Type::SBYTE => Value::Signed(data.read_i8()? as i32),
346+
Type::SBYTE => Value::SignedByte(data.read_i8()?),
347347
Type::SHORT => Value::Short(data.read_u16()?),
348348
Type::SSHORT => Value::SignedShort(data.read_i16()?),
349349
Type::LONG => Value::Unsigned(data.read_u32()?),
@@ -418,7 +418,7 @@ async fn read_tag_value<F: MetadataFetch>(
418418
return {
419419
Ok(Value::List(
420420
(0..count)
421-
.map(|_| Value::Signed(data.read_i8().unwrap() as i32))
421+
.map(|_| Value::SignedByte(data.read_i8().unwrap()))
422422
.collect(),
423423
))
424424
}
@@ -511,7 +511,7 @@ async fn read_tag_value<F: MetadataFetch>(
511511
Type::SBYTE => {
512512
let mut v = Vec::with_capacity(count as _);
513513
for _ in 0..count {
514-
v.push(Value::Signed(cursor.read_i8().await? as i32))
514+
v.push(Value::SignedByte(cursor.read_i8().await?))
515515
}
516516
Ok(Value::List(v))
517517
}
@@ -651,8 +651,8 @@ mod test {
651651
// /\ / \ / \ / \
652652
([1,1, 1, 0, 1,0,0,0, 42, 0, 0, 0], Endianness::LittleEndian, Value::Byte (42 )),
653653
([1,1, 0, 1, 0,0,0,1, 42, 0, 0, 0], Endianness::BigEndian, Value::Byte (42 )),
654-
([1,1, 6, 0, 1,0,0,0, 42, 0, 0, 0], Endianness::LittleEndian, Value::Signed (42 )), // sbyte
655-
([1,1, 0, 6, 0,0,0,1, 42, 0, 0, 0], Endianness::BigEndian, Value::Signed (42 )), // sbyte
654+
([1,1, 6, 0, 1,0,0,0, 42, 0, 0, 0], Endianness::LittleEndian, Value::SignedByte(42 )),
655+
([1,1, 0, 6, 0,0,0,1, 42, 0, 0, 0], Endianness::BigEndian, Value::SignedByte(42 )),
656656
([1,1, 7, 0, 1,0,0,0, 42, 0, 0, 0], Endianness::LittleEndian, Value::Byte (42 )), // undefined
657657
([1,1, 0, 7, 0,0,0,1, 42, 0, 0, 0], Endianness::BigEndian, Value::Byte (42 )), // undefined
658658
([1,1, 2, 0, 1,0,0,0, 0, 0, 0, 0], Endianness::LittleEndian, Value::Ascii ("".into() )),
@@ -694,8 +694,8 @@ mod test {
694694
// / \ 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
695695
([1,1, 1, 0, 1,0,0,0,0,0,0,0, 42, 0, 0, 0, 0, 0, 0, 0], Endianness::LittleEndian, Value::Byte (42) ),
696696
([1,1, 0, 1, 0,0,0,0,0,0,0,1, 42, 0, 0, 0, 0, 0, 0, 0], Endianness::BigEndian, Value::Byte (42) ),
697-
([1,1, 6, 0, 1,0,0,0,0,0,0,0, 42, 0, 0, 0, 0, 0, 0, 0], Endianness::LittleEndian, Value::Signed (42) ), // sbyte
698-
([1,1, 0, 6, 0,0,0,0,0,0,0,1, 42, 0, 0, 0, 0, 0, 0, 0], Endianness::BigEndian, Value::Signed (42) ), // sbyte
697+
([1,1, 6, 0, 1,0,0,0,0,0,0,0, 42, 0, 0, 0, 0, 0, 0, 0], Endianness::LittleEndian, Value::SignedByte (42) ),
698+
([1,1, 0, 6, 0,0,0,0,0,0,0,1, 42, 0, 0, 0, 0, 0, 0, 0], Endianness::BigEndian, Value::SignedByte (42) ),
699699
([1,1, 7, 0, 1,0,0,0,0,0,0,0, 42, 0, 0, 0, 0, 0, 0, 0], Endianness::LittleEndian, Value::Byte (42) ), // undefined
700700
([1,1, 0, 7, 0,0,0,0,0,0,0,1, 42, 0, 0, 0, 0, 0, 0, 0], Endianness::BigEndian, Value::Byte (42) ), // undefined
701701
([1,1, 2, 0, 1,0,0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0, 0], Endianness::LittleEndian, Value::Ascii ("".into()) ),
@@ -747,10 +747,10 @@ mod test {
747747
let cases = [
748748
// tag type count offset
749749
// // / \ / \ / \
750-
([1,1, 1, 0, 4,0,0,0, 42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Byte (42); 4]) ),
751-
([1,1, 0, 1, 0,0,0,4, 42,42,42,42], Endianness::BigEndian, Value::List(vec![Value::Byte (42); 4]) ),
752-
([1,1, 6, 0, 4,0,0,0, 42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Signed (42); 4]) ), //sbyte i8
753-
([1,1, 0, 6, 0,0,0,4, 42,42,42,42], Endianness::BigEndian, Value::List(vec![Value::Signed (42); 4]) ), //sbyte i8
750+
([1,1, 1, 0, 4,0,0,0, 42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Byte (42); 4]) ),
751+
([1,1, 0, 1, 0,0,0,4, 42,42,42,42], Endianness::BigEndian, Value::List(vec![Value::Byte (42); 4]) ),
752+
([1,1, 6, 0, 4,0,0,0, 42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::SignedByte (42); 4]) ),
753+
([1,1, 0, 6, 0,0,0,4, 42,42,42,42], Endianness::BigEndian, Value::List(vec![Value::SignedByte (42); 4]) ),
754754
([1,1, 7, 0, 4,0,0,0, 42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Byte (42); 4]) ), // undefined
755755
([1,1, 0, 7, 0,0,0,4, 42,42,42,42], Endianness::BigEndian, Value::List(vec![Value::Byte (42); 4]) ), // undefined
756756
([1,1, 2, 0, 4,0,0,0, 42,42,42, 0], Endianness::LittleEndian, Value::Ascii("***".into())),
@@ -786,8 +786,8 @@ mod test {
786786
// / \ 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
787787
([1,1, 1, 0, 8,0,0,0,0,0,0,0, 42,42,42,42,42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Byte (42) ; 8])),
788788
([1,1, 0, 1, 0,0,0,0,0,0,0,8, 42,42,42,42,42,42,42,42], Endianness::BigEndian, Value::List(vec![Value::Byte (42) ; 8])),
789-
([1,1, 6, 0, 8,0,0,0,0,0,0,0, 42,42,42,42,42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Signed (42) ; 8])), //sbyte i8
790-
([1,1, 0, 6, 0,0,0,0,0,0,0,8, 42,42,42,42,42,42,42,42], Endianness::BigEndian, Value::List(vec![Value::Signed (42) ; 8])), //sbyte i8
789+
([1,1, 6, 0, 8,0,0,0,0,0,0,0, 42,42,42,42,42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::SignedByte(42) ; 8])),
790+
([1,1, 0, 6, 0,0,0,0,0,0,0,8, 42,42,42,42,42,42,42,42], Endianness::BigEndian, Value::List(vec![Value::SignedByte(42) ; 8])),
791791
([1,1, 7, 0, 8,0,0,0,0,0,0,0, 42,42,42,42,42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Byte (42) ; 8])), //undefined u8
792792
([1,1, 0, 7, 0,0,0,0,0,0,0,8, 42,42,42,42,42,42,42,42], Endianness::BigEndian, Value::List(vec![Value::Byte (42) ; 8])), //undefined u8
793793
([1,1, 2, 0, 8,0,0,0,0,0,0,0, 42,42,42,42,42,42,42, 0], Endianness::LittleEndian, Value::Ascii ("*******".into() )),
@@ -829,8 +829,8 @@ mod test {
829829
// /\ / \ / \
830830
(vec![1,1, 1, 0, 5,0,0,0, 12, 0, 0, 0, 42,42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Byte (42 );5])),
831831
(vec![1,1, 0, 1, 0,0,0,5, 0, 0, 0,12, 42,42,42,42,42], Endianness::BigEndian , Value::List(vec![Value::Byte (42 );5])),
832-
(vec![1,1, 6, 0, 5,0,0,0, 12, 0, 0, 0, 42,42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Signed (42 );5])), // Type::SBYTE ),
833-
(vec![1,1, 0, 6, 0,0,0,5, 0, 0, 0,12, 42,42,42,42,42], Endianness::BigEndian , Value::List(vec![Value::Signed (42 );5])), // Type::SBYTE ),
832+
(vec![1,1, 6, 0, 5,0,0,0, 12, 0, 0, 0, 42,42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::SignedByte (42 );5])),
833+
(vec![1,1, 0, 6, 0,0,0,5, 0, 0, 0,12, 42,42,42,42,42], Endianness::BigEndian , Value::List(vec![Value::SignedByte (42 );5])),
834834
(vec![1,1, 7, 0, 5,0,0,0, 12, 0, 0, 0, 42,42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Byte (42 );5])), // Type::UNDEFINED ),
835835
(vec![1,1, 0, 7, 0,0,0,5, 0, 0, 0,12, 42,42,42,42,42], Endianness::BigEndian , Value::List(vec![Value::Byte (42 );5])), // Type::UNDEFINED ),
836836
(vec![1,1, 2, 0, 5,0,0,0, 12, 0, 0, 0, 42,42,42,42, 0], Endianness::LittleEndian, Value::Ascii ("****".into() ) ),
@@ -883,8 +883,8 @@ mod test {
883883
// / \ 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
884884
(vec![1,1, 1, 0, 9,0,0,0,0,0,0,0, 20, 0, 0, 0, 0, 0, 0, 0, 42,42,42,42,42,42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Byte (42 );9])),
885885
(vec![1,1, 0, 1, 0,0,0,0,0,0,0,9, 0, 0, 0, 0, 0, 0, 0,20, 42,42,42,42,42,42,42,42,42], Endianness::BigEndian , Value::List(vec![Value::Byte (42 );9])),
886-
(vec![1,1, 6, 0, 9,0,0,0,0,0,0,0, 20, 0, 0, 0, 0, 0, 0, 0, 42,42,42,42,42,42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Signed (42 );9])), //TagType::SBYTE ),
887-
(vec![1,1, 0, 6, 0,0,0,0,0,0,0,9, 0, 0, 0, 0, 0, 0, 0,20, 42,42,42,42,42,42,42,42,42], Endianness::BigEndian , Value::List(vec![Value::Signed (42 );9])), //TagType::SBYTE ),
886+
(vec![1,1, 6, 0, 9,0,0,0,0,0,0,0, 20, 0, 0, 0, 0, 0, 0, 0, 42,42,42,42,42,42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::SignedByte (42 );9])),
887+
(vec![1,1, 0, 6, 0,0,0,0,0,0,0,9, 0, 0, 0, 0, 0, 0, 0,20, 42,42,42,42,42,42,42,42,42], Endianness::BigEndian , Value::List(vec![Value::SignedByte (42 );9])),
888888
(vec![1,1, 7, 0, 9,0,0,0,0,0,0,0, 20, 0, 0, 0, 0, 0, 0, 0, 42,42,42,42,42,42,42,42,42], Endianness::LittleEndian, Value::List(vec![Value::Byte (42 );9])), //TagType::UNDEFINED ),
889889
(vec![1,1, 0, 7, 0,0,0,0,0,0,0,9, 0, 0, 0, 0, 0, 0, 0,20, 42,42,42,42,42,42,42,42,42], Endianness::BigEndian , Value::List(vec![Value::Byte (42 );9])), //TagType::UNDEFINED ),
890890
(vec![1,1, 2, 0, 9,0,0,0,0,0,0,0, 20, 0, 0, 0, 0, 0, 0, 0, 42,42,42,42,42,42,42,42, 0], Endianness::LittleEndian, Value::Ascii ("********".into() ) ),

src/tiff/ifd.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ impl Value {
5252

5353
pub fn into_u16(self) -> TiffResult<u16> {
5454
match self {
55+
Byte(val) => Ok(val.into()),
5556
Short(val) => Ok(val),
5657
Unsigned(val) => Ok(u16::try_from(val)?),
5758
UnsignedBig(val) => Ok(u16::try_from(val)?),
@@ -73,6 +74,7 @@ impl Value {
7374

7475
pub fn into_u32(self) -> TiffResult<u32> {
7576
match self {
77+
Byte(val) => Ok(val.into()),
7678
Short(val) => Ok(val.into()),
7779
Unsigned(val) => Ok(val),
7880
UnsignedBig(val) => Ok(u32::try_from(val)?),
@@ -98,6 +100,7 @@ impl Value {
98100

99101
pub fn into_u64(self) -> TiffResult<u64> {
100102
match self {
103+
Byte(val) => Ok(val.into()),
101104
Short(val) => Ok(val.into()),
102105
Unsigned(val) => Ok(val.into()),
103106
UnsignedBig(val) => Ok(val),
@@ -157,6 +160,7 @@ impl Value {
157160
}
158161
Ok(new_vec)
159162
}
163+
Byte(val) => Ok(vec![val.into()]),
160164
Short(val) => Ok(vec![val.into()]),
161165
Unsigned(val) => Ok(vec![val]),
162166
UnsignedBig(val) => Ok(vec![u32::try_from(val)?]),
@@ -183,10 +187,7 @@ impl Value {
183187
Ok(new_vec)
184188
}
185189
Byte(val) => Ok(vec![val]),
186-
187-
val => Err(TiffError::FormatError(
188-
TiffFormatError::UnsignedIntegerExpected(val),
189-
)),
190+
val => Err(TiffError::FormatError(TiffFormatError::ByteExpected(val))),
190191
}
191192
}
192193

@@ -199,6 +200,7 @@ impl Value {
199200
}
200201
Ok(new_vec)
201202
}
203+
Byte(val) => Ok(vec![val.into()]),
202204
Short(val) => Ok(vec![val]),
203205
val => Err(TiffError::FormatError(TiffFormatError::ShortExpected(val))),
204206
}

0 commit comments

Comments
 (0)