//! Dump a record's parent keyframes and its nested `.rat` leaf's, for any entry. //! //! cargo run -p sylpheed-formats --example leaf_dump -- use sylpheed_formats::{pak, ui_layout}; fn a(k: &ui_layout::Keyframe) -> u32 { k.fade >> 24 } fn t(k: &ui_layout::Keyframe) -> i64 { k.time.map(|v| v as i64).unwrap_or(-1) } fn show(tag: &str, els: &[ui_layout::Element]) { for e in els { println!( " {tag} {:?} pivot=({},{}) kind={:#x}", e.name, e.pivot_x, e.pivot_y, e.kind ); for k in &e.keyframes { println!( " t={:<5} a={:<4} scale=({},{}) rot={:<5} pos=({},{}) tint={:#010x}", t(k), a(k), k.scale_x, k.scale_y, k.rotation_deg, k.x, k.y, k.tint ); } } } fn main() { let mut it = std::env::args().skip(1); let path = it.next().expect("pak"); let entry: usize = it.next().expect("entry").parse().expect("entry"); let want = it.next().expect("name"); let ar = pak::PakArchive::open(&path).expect("open"); let bytes = ar.read(&ar.entries()[entry]).expect("read"); let b = ui_layout::parse_build(&bytes).expect("build"); println!( "entry {entry}: {} elements, design {}x{}", b.elements.len(), b.design_w, b.design_h ); let els: Vec<_> = b .elements .iter() .filter(|e| e.name.contains(&want)) .cloned() .collect(); show("PARENT", &els); for e in &els { match b.records.get(&e.name) { Some(&(off, size)) => { println!(" -- leaf of {:?}: {size} B at {off}", e.name); match ui_layout::parse_build(&bytes[off..off + size]) { Some(lb) => show(" LEAF", &lb.elements), None => println!(" leaf did not parse"), } } None => println!(" -- {:?} has NO leaf record", e.name), } } }