use clap::Parser; use std::{ collections::HashMap, fs::File, io::{BufWriter, Write}, path::PathBuf, process::exit, }; #[derive(Parser)] struct Args { input: PathBuf, output: PathBuf, } fn main() { let Args { input, output } = Args::parse(); let palette = include_str!("../../../textures/palette.csv") .split('\n') .filter(|l| !l.is_empty()) .map(|s| { let (c, s) = s.split_once(",").unwrap(); let (r, s) = s.split_once(",").unwrap(); let (g, s) = s.split_once(",").unwrap(); let (b, a) = s.split_once(",").unwrap(); ( [ r.parse().unwrap(), g.parse().unwrap(), b.parse().unwrap(), a.parse().unwrap(), ], c.chars().next().unwrap(), ) }) .collect::>(); let input = image::open(input).unwrap().to_rgba8(); let mut output = BufWriter::new(File::create(output).unwrap()); for y in 0..input.height() { for x in 0..input.width() { let mut c = input.get_pixel(x, y).0; if c[3] == 0 { c = [0, 0, 0, 0]; } let Some(char) = palette.get(&c) else { eprintln!("color at {x},{y} not in palette: {c:?}"); exit(1); }; write!(output, "{char}").unwrap(); } writeln!(output).unwrap(); } output.flush().unwrap(); output.into_inner().unwrap().flush().unwrap() }