From f993cfb940405a04bd8a5595b2aafdc9bdf02caa Mon Sep 17 00:00:00 2001 From: "A. Molzer" <5550310+197g@users.noreply.github.com> Date: Mon, 14 Jul 2025 10:40:41 +0200 Subject: [PATCH] Check full subsubifds structure --- tests/subsubifds.rs | 56 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/tests/subsubifds.rs b/tests/subsubifds.rs index 4e0237c..9933ba0 100644 --- a/tests/subsubifds.rs +++ b/tests/subsubifds.rs @@ -114,3 +114,59 @@ fn decode_seek_directory() { let img0_try2 = decoder.read_image().unwrap(); assert_eq!(img0, img0_try2); } + +#[test] +fn decode_subifds() { + let explore_chain = |decoder: &mut Decoder<_>, subifds: &mut Vec<_>| { + let mut len = 0usize; + + loop { + len += 1; + + let position = decoder.ifd_pointer().unwrap(); + let ifd = decoder.read_directory(position).unwrap(); + + if let Ok(subifd) = decoder.read_directory_tags(&ifd).get_tag(Tag::SubIfd) { + let prelen = subifds.len(); + subifds.extend(subifd.into_ifd_vec().expect("Failed to decode SubIfd tag")); + eprintln!("New roots: {:?}", &subifds[prelen..]); + } else { + eprintln!("No roots"); + } + + if !decoder.more_images() { + break; + } + + decoder.next_image().unwrap(); + } + + len + }; + + let file = File::open(TEST_IMAGE_SUBIFD).expect("Cannot open test image"); + let mut decoder = Decoder::new(file).expect("Invalid format to create decoder"); + + let mut subifds = vec![]; + let mut chain_lengths = vec![]; + chain_lengths.push(explore_chain(&mut decoder, &mut subifds)); + + while !subifds.is_empty() { + let root = subifds.remove(0); + let manual_directory = decoder.read_directory(root).unwrap(); + eprintln!("Manual directory: {:?}", manual_directory); + + decoder.restart_at_directory(root).unwrap(); + let prelen = subifds.len(); + chain_lengths.push(explore_chain(&mut decoder, &mut subifds)); + eprintln!("Chains roots: {:?}", &subifds[prelen..]); + } + + // Traversal Order in this graph: + // Image 0 -> Image 1 -> Image 2 + // |-> Image 3 + // |-> Image 4 -> Image 5 + // | \-> Image 7 -> Image 8 + // \-> Image 6 + assert_eq!(chain_lengths, [3, 1, 2, 1, 2]); +}