Maraiah/src/main.rs

66 lines
1.4 KiB
Rust
Raw Normal View History

2018-09-06 09:01:52 -07:00
extern crate memmap;
2018-09-09 15:21:31 -07:00
extern crate generic_array;
2018-09-06 09:01:52 -07:00
pub mod durandal;
pub mod marathon;
2018-09-09 15:21:31 -07:00
use std::{io, fs, env};
use std::io::Write;
2018-09-06 09:01:52 -07:00
2018-09-09 15:21:31 -07:00
use durandal::pict::load_pict;
2018-09-10 07:30:46 -07:00
use durandal::image::Image;
2018-09-11 01:21:36 -07:00
use marathon::{wad, term};
use memmap::Mmap;
2018-09-10 07:30:46 -07:00
fn write_ppm(fname: &str, im: &Image) -> io::Result<()>
{
let out = fs::File::create(fname)?;
let mut out = io::BufWriter::new(out);
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)?;
}
}
Ok(())
}
2018-09-06 09:01:52 -07:00
2018-09-09 15:21:31 -07:00
fn main() -> io::Result<()>
2018-09-06 09:01:52 -07:00
{
2018-09-09 15:21:31 -07:00
let arg = env::args().nth(1).expect("need at least 1 argument");
let fp = fs::File::open(arg)?;
let mm = unsafe{Mmap::map(&fp)?};
2018-09-11 12:07:42 -07:00
let wad = wad::Wad::new(&mm).unwrap();
2018-09-09 15:21:31 -07:00
2018-09-11 01:21:36 -07:00
println!("{:#?}", wad);
2018-09-09 15:21:31 -07:00
for (id, ent) in wad.ent
{
2018-09-11 01:21:36 -07:00
if let Some(b) = ent.map.get(b"PICT")
2018-09-09 15:21:31 -07:00
{
2018-09-11 12:07:42 -07:00
match load_pict(b) {
2018-09-09 15:21:31 -07:00
Ok(im) => {
println!("entry {} has PICT {}x{}", id, im.w(), im.h());
2018-09-10 07:30:46 -07:00
write_ppm(&format!("out_{}.ppm", id), &im)?;
2018-09-09 15:21:31 -07:00
},
Err(e) => println!("entry {} has PICT (invalid: {:?})", id, e),
}
}
2018-09-11 01:21:36 -07:00
else if let Some(b) = ent.map.get(b"term")
{
println!("entry {} has term {:#?}", id, term::Terminal::chunk(b));
}
2018-09-06 09:01:52 -07:00
}
2018-09-09 15:21:31 -07:00
Ok(())
2018-09-06 09:01:52 -07:00
}
// EOF