Skip to content
Snippets Groups Projects
flip.rs 790 B
Newer Older
Louis's avatar
Louis committed
use clap::ArgEnum;
Louis's avatar
Louis committed
use image::{imageops, GenericImage, Pixel};
Louis's avatar
Louis committed
use serde::{Deserialize, Serialize};

Louis's avatar
Louis committed
use crate::TypedOutputFormat;

Louis's avatar
Louis committed
#[derive(Copy, Clone, Serialize, Deserialize, ArgEnum, Debug)]
pub enum FlipDirection {
	#[serde(rename = "vertical")]
	Vertical,
	#[serde(rename = "horizontal")]
	Horizontal,
	#[serde(rename = "both")]
	Both,
}

Louis's avatar
Louis committed
pub fn flip<T: GenericImage>(image: &T, dir: FlipDirection) -> anyhow::Result<TypedOutputFormat<T>>
Louis's avatar
Louis committed
where
	T::Pixel: 'static,
	<T::Pixel as Pixel>::Subpixel: 'static,
{
	use FlipDirection::*;
	match dir {
		Vertical => Ok(imageops::flip_vertical(image)),
		Horizontal => Ok(imageops::flip_horizontal(image)),
		Both => {
			let mut image = imageops::flip_horizontal(image);
			imageops::flip_vertical_in_place(&mut image);
			Ok(image)
		}
	}
}