From 3198e50822aadbf3272ad0e3e042e73ae88fb810 Mon Sep 17 00:00:00 2001 From: Jared Roberts Date: Tue, 15 Mar 2016 05:32:11 -0700 Subject: [PATCH] tile converter --- Cargo.toml | 3 +++ src/bin/tileview.rs | 66 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/bin/tileview.rs diff --git a/Cargo.toml b/Cargo.toml index 0d3c581..52d570f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,6 @@ authors = ["Jared Roberts "] [dependencies] itertools = ">=0.4" memmap = "~0.2" + +sdl2 = "0.15" +sdl2_image = "1.0" diff --git a/src/bin/tileview.rs b/src/bin/tileview.rs new file mode 100644 index 0000000..0e174a5 --- /dev/null +++ b/src/bin/tileview.rs @@ -0,0 +1,66 @@ +extern crate itertools; +extern crate sdl2; +extern crate sdl2_image; + +use std::env; +use std::io::Read; +use std::path::Path; + +use itertools::Itertools; +use sdl2::surface::Surface; +use sdl2::pixels::PixelFormatEnum; +use sdl2_image::SaveSurface; + +static EGA_PALETTE: [[u8; 4]; 16] = [[0x00u8, 0x00, 0x00, 0x00], + [0x00, 0xAA, 0x00, 0x00], + [0x00, 0x00, 0xAA, 0x00], + [0x00, 0xAA, 0xAA, 0x00], + [0x00, 0x00, 0x00, 0xAA], + [0x00, 0xAA, 0x00, 0xAA], + [0x00, 0x00, 0x55, 0xAA], + [0x00, 0xAA, 0xAA, 0xAA], + [0x00, 0x55, 0x55, 0x55], + [0x00, 0xFF, 0x55, 0x55], + [0x00, 0x55, 0xFF, 0x55], + [0x00, 0xFF, 0xFF, 0x55], + [0x00, 0x55, 0x55, 0xFF], + [0x00, 0xFF, 0x55, 0xFF], + [0x00, 0x55, 0xFF, 0xFF], + [0x00, 0xFF, 0xFF, 0xFF]]; + + + +pub fn main() { + let args: Vec = env::args().collect(); + let filename; + if args.len() > 1 { + filename = &args[1] as &str; + } else { + filename = "data/SHAPES.EGA"; + } + + let _sdl_context = ::sdl2::init().unwrap(); + let _image_context = ::sdl2_image::init(::sdl2_image::INIT_PNG).unwrap(); + + let mut file = std::fs::File::open(Path::new(filename)).unwrap(); + let mut tile_buf = [0u8; 128]; + let mut surface = Surface::new(16, 16, PixelFormatEnum::RGBX8888).unwrap(); + let mut i = 0; + while file.read_exact(&mut tile_buf).is_ok() { + surface.with_lock_mut(|pixel_bytes| { + pixel_bytes.iter_mut().set_from(tile_buf.iter() + .flat_map(|tile_byte| { + EGA_PALETTE[(tile_byte >> 4u8 & 0xF) as usize] + .into_iter() + .chain(EGA_PALETTE[(tile_byte & 0xF) as usize] + .into_iter()) + }) + .map(|x| *x)); + + + }); + let out_name = format!("out/{}.png", i); + surface.save(Path::new(&out_name)).ok(); + i += 1; + } +}