use crate::state::TransformState;
use image::{DynamicImage, GenericImageView};
pub fn apply_transform(image: &DynamicImage, transform: &TransformState) -> DynamicImage {
let mut transformed = image.clone();
match transform.rotation {
90 => transformed = transformed.rotate90(),
180 => transformed = transformed.rotate180(),
270 => transformed = transformed.rotate270(),
_ => {}
}
if transform.flip_horizontal {
transformed = transformed.fliph();
}
if transform.flip_vertical {
transformed = transformed.flipv();
}
let (width, height) = transformed.dimensions();
let left = transform.left.min(width);
let right = transform.right.min(width - left);
let top = transform.top.min(height);
let bottom = transform.bottom.min(height - top);
if left > 0 || right > 0 || top > 0 || bottom > 0 {
let crop_width = width.saturating_sub(left).saturating_sub(right);
let crop_height = height.saturating_sub(top).saturating_sub(bottom);
if crop_width > 0 && crop_height > 0 {
transformed = transformed.crop_imm(left, top, crop_width, crop_height);
}
}
transformed
}
pub fn calculate_absolute_crop(value_str: &str, total: u32) -> u32 {
if let Some(stripped) = value_str.strip_suffix('%')
&& let Ok(percent) = stripped.parse::<f32>()
{
return ((percent / 100.0) * total as f32).round() as u32;
}
value_str.parse::<u32>().unwrap_or(0)
}
pub fn flip_horizontal(image: &DynamicImage) -> DynamicImage {
image.fliph()
}
pub fn flip_vertical(image: &DynamicImage) -> DynamicImage {
image.flipv()
}
pub fn rotate_90(image: &DynamicImage) -> DynamicImage {
image.rotate90()
}
pub fn rotate_270(image: &DynamicImage) -> DynamicImage {
image.rotate270()
}