Implement missing tag types and signed 64-bit support
This commit is contained in:
1 parent
2cba04dfe7
commit
d086e289dd
8 files changed
+334
-14
No files matched your search
+86
-5
@@ -1,7 +1,7 @@
|
||||
extern crate tiff;
|
||||
|
||||
use tiff::decoder::{ifd, Decoder, DecodingResult};
|
||||
use tiff::encoder::{colortype, SRational, TiffEncoder};
|
||||
use tiff::encoder::{colortype, Ifd, Ifd8, SRational, TiffEncoder};
|
||||
use tiff::tags::Tag;
|
||||
use tiff::ColorType;
|
||||
|
||||
@@ -48,6 +48,53 @@ fn encode_decode() {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_encode_ifd() {
|
||||
let mut data = Cursor::new(Vec::new());
|
||||
|
||||
{
|
||||
let mut tiff = TiffEncoder::new(&mut data).unwrap();
|
||||
let mut image_encoder = tiff.new_image::<colortype::Gray8>(1, 1).unwrap();
|
||||
let encoder = image_encoder.encoder();
|
||||
|
||||
// Use the "reusable" tags section as per the TIFF6 spec
|
||||
encoder.write_tag(Tag::Unknown(65000), Ifd(42u32)).unwrap();
|
||||
encoder
|
||||
.write_tag(Tag::Unknown(65001), &[Ifd(100u32)][..])
|
||||
.unwrap();
|
||||
encoder
|
||||
.write_tag(Tag::Unknown(65002), &[Ifd(1u32), Ifd(2u32), Ifd(3u32)][..])
|
||||
.unwrap();
|
||||
|
||||
encoder.write_tag(Tag::Unknown(65010), Ifd8(43u64)).unwrap();
|
||||
encoder
|
||||
.write_tag(Tag::Unknown(65011), &[Ifd8(100u64)][..])
|
||||
.unwrap();
|
||||
encoder
|
||||
.write_tag(
|
||||
Tag::Unknown(65012),
|
||||
&[Ifd8(1u64), Ifd8(2u64), Ifd8(3u64)][..],
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
// Rewind the cursor for reading
|
||||
data.set_position(0);
|
||||
{
|
||||
let mut decoder = Decoder::new(&mut data).unwrap();
|
||||
|
||||
assert_eq!(decoder.assert_tag_u32(65000), 42);
|
||||
assert_eq!(decoder.assert_tag_u32_vec(65000), [42]);
|
||||
assert_eq!(decoder.assert_tag_u32_vec(65001), [100]);
|
||||
assert_eq!(decoder.assert_tag_u32_vec(65002), [1, 2, 3]);
|
||||
|
||||
assert_eq!(decoder.assert_tag_u64(65010), 43);
|
||||
assert_eq!(decoder.assert_tag_u64_vec(65010), [43]);
|
||||
assert_eq!(decoder.assert_tag_u64_vec(65011), [100]);
|
||||
assert_eq!(decoder.assert_tag_u64_vec(65012), [1, 2, 3]);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
/// Test that attempting to encode when the input buffer is undersized returns
|
||||
/// an error rather than panicking.
|
||||
@@ -182,6 +229,10 @@ trait AssertDecode {
|
||||
fn assert_tag_u32_vec(&mut self, tag: u16) -> Vec<u32>;
|
||||
fn assert_tag_i32(&mut self, tag: u16) -> i32;
|
||||
fn assert_tag_i32_vec(&mut self, tag: u16) -> Vec<i32>;
|
||||
fn assert_tag_u64(&mut self, tag: u16) -> u64;
|
||||
fn assert_tag_u64_vec(&mut self, tag: u16) -> Vec<u64>;
|
||||
fn assert_tag_i64(&mut self, tag: u16) -> i64;
|
||||
fn assert_tag_i64_vec(&mut self, tag: u16) -> Vec<i64>;
|
||||
}
|
||||
|
||||
impl<R: std::io::Read + std::io::Seek> AssertDecode for Decoder<R> {
|
||||
@@ -203,6 +254,24 @@ impl<R: std::io::Read + std::io::Seek> AssertDecode for Decoder<R> {
|
||||
.into_i32_vec()
|
||||
.unwrap()
|
||||
}
|
||||
fn assert_tag_u64(&mut self, tag: u16) -> u64 {
|
||||
self.get_tag(Tag::Unknown(tag)).unwrap().into_u64().unwrap()
|
||||
}
|
||||
fn assert_tag_u64_vec(&mut self, tag: u16) -> Vec<u64> {
|
||||
self.get_tag(Tag::Unknown(tag))
|
||||
.unwrap()
|
||||
.into_u64_vec()
|
||||
.unwrap()
|
||||
}
|
||||
fn assert_tag_i64(&mut self, tag: u16) -> i64 {
|
||||
self.get_tag(Tag::Unknown(tag)).unwrap().into_i64().unwrap()
|
||||
}
|
||||
fn assert_tag_i64_vec(&mut self, tag: u16) -> Vec<i64> {
|
||||
self.get_tag(Tag::Unknown(tag))
|
||||
.unwrap()
|
||||
.into_i64_vec()
|
||||
.unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -289,12 +358,20 @@ fn test_signed() {
|
||||
.write_tag(Tag::Unknown(65022), &[-1_i32, 2][..])
|
||||
.unwrap();
|
||||
|
||||
encoder.write_tag(Tag::Unknown(65030), -1_i64).unwrap();
|
||||
encoder
|
||||
.write_tag(Tag::Unknown(65030), make_srational(-1))
|
||||
.write_tag(Tag::Unknown(65031), &[-1_i64][..])
|
||||
.unwrap();
|
||||
encoder
|
||||
.write_tag(Tag::Unknown(65032), &[-1_i64, 2][..])
|
||||
.unwrap();
|
||||
|
||||
encoder
|
||||
.write_tag(Tag::Unknown(65040), make_srational(-1))
|
||||
.unwrap();
|
||||
encoder
|
||||
.write_tag(
|
||||
Tag::Unknown(65031),
|
||||
Tag::Unknown(65041),
|
||||
&[make_srational(-1), make_srational(2)][..],
|
||||
)
|
||||
.unwrap();
|
||||
@@ -321,8 +398,12 @@ fn test_signed() {
|
||||
assert_eq!(decoder.assert_tag_i32_vec(65021), [-1]);
|
||||
assert_eq!(decoder.assert_tag_i32_vec(65022), [-1, 2]);
|
||||
|
||||
assert_eq!(decoder.assert_tag_i32_vec(65030), [-1, 100]);
|
||||
assert_eq!(decoder.assert_tag_i32_vec(65031), [-1_i32, 100, 2, 100]);
|
||||
assert_eq!(decoder.assert_tag_i64(65030), -1);
|
||||
assert_eq!(decoder.assert_tag_i64_vec(65031), [-1]);
|
||||
assert_eq!(decoder.assert_tag_i64_vec(65032), [-1, 2]);
|
||||
|
||||
assert_eq!(decoder.assert_tag_i32_vec(65040), [-1, 100]);
|
||||
assert_eq!(decoder.assert_tag_i32_vec(65041), [-1_i32, 100, 2, 100]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user