52 lines
1.2 KiB
Rust
52 lines
1.2 KiB
Rust
extern crate memmap;
|
|
extern crate generic_array;
|
|
|
|
pub mod durandal;
|
|
pub mod marathon;
|
|
|
|
use std::{io, fs, env};
|
|
use std::io::Write;
|
|
|
|
use memmap::Mmap;
|
|
|
|
use marathon::wad;
|
|
use durandal::pict::load_pict;
|
|
|
|
fn main() -> io::Result<()>
|
|
{
|
|
let arg = env::args().nth(1).expect("need at least 1 argument");
|
|
let fp = fs::File::open(arg)?;
|
|
let mm = unsafe{Mmap::map(&fp)?};
|
|
let wad = wad::Wad::new(&mm);
|
|
|
|
println!("{:?}", wad);
|
|
|
|
for (id, ent) in wad.ent
|
|
{
|
|
if let Some(c) = ent.map.get(b"PICT")
|
|
{
|
|
let im = load_pict(c);
|
|
match im {
|
|
Ok(im) => {
|
|
let out = fs::File::create(format!("out_{}.ppm", id))?;
|
|
let mut out = io::BufWriter::new(out);
|
|
println!("entry {} has PICT {}x{}", id, im.w(), im.h());
|
|
write!(&mut out, "P3\n{} {}\n255\n", im.w(), im.h())?;
|
|
for y in 0..im.h() {
|
|
for x in 0..im.w()
|
|
{
|
|
let cr = &im[(x, y)];
|
|
write!(&mut out, "{} {} {} ", cr.r, cr.g, cr.b)?;
|
|
}
|
|
}
|
|
},
|
|
Err(e) => println!("entry {} has PICT (invalid: {:?})", id, e),
|
|
}
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
// EOF
|