This branch predates CI on `main`. `cargo fmt --all` only; no behaviour. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
69 lines
2.1 KiB
Rust
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),
|
|
}
|
|
}
|
|
}
|