Skip to content
Snippets Groups Projects
remap.rs 996 B
Newer Older
Louis's avatar
Louis committed
use image::{GenericImage, Pixel, Rgba};
use num_traits::ToPrimitive;

use crate::commands::ColourMapping;
use crate::utils::{new_image, BasicRgba};
use crate::OutputFormat;

pub fn remap_image(
	image: impl GenericImage,
	mappings: ColourMapping,
) -> anyhow::Result<OutputFormat> {
	let mut output = new_image(image.width(), image.height());
Louis's avatar
Louis committed
	for (x, y, pixel) in image.pixels() {
Louis's avatar
Louis committed
		let pixel = pixel.to_rgba();

		if pixel.0[3].to_u8().unwrap() == 0 {
			output.put_pixel(x, y, Rgba::from(BasicRgba::transparent()));
			continue;
		}

		let data = Rgba::from([
			pixel.0[0].to_u8().unwrap(),
			pixel.0[1].to_u8().unwrap(),
			pixel.0[2].to_u8().unwrap(),
			pixel.0[3].to_u8().unwrap(),
		]);
		let basic = BasicRgba::from(data);

		match mappings.get(&basic) {
			Some(mapped_data) => output.put_pixel(
				x,
				y,
				Rgba::from(BasicRgba {
					a: basic.a,
Louis's avatar
Louis committed
					..*mapped_data
Louis's avatar
Louis committed
				}),
			),
			None => output.put_pixel(x, y, Rgba::from(BasicRgba::transparent())),
		};
	}

	Ok(output)
}