Files
Sylpheed/crates/sylpheed-formats/examples/leaf_dump.rs
MechaCat02 d394ba6aed style: rustfmt sweep — 107 files the lint gate never saw
This branch predates CI on `main`. `cargo fmt --all` only; no behaviour.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 16:34:40 +02:00

69 lines
2.1 KiB
Rust

//! Dump a record's parent keyframes and its nested `.rat` leaf's, for any entry.
//!
//! cargo run -p sylpheed-formats --example leaf_dump -- <pak> <entry> <name>
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),
}
}
}