hdim_core/transform/
mod.rs1use crate::state::TransformState;
2use image::{DynamicImage, GenericImageView};
3
4pub fn apply_transform(image: &DynamicImage, transform: &TransformState) -> DynamicImage {
5 let mut transformed = image.clone();
6
7 match transform.rotation {
9 90 => transformed = transformed.rotate90(),
10 180 => transformed = transformed.rotate180(),
11 270 => transformed = transformed.rotate270(),
12 _ => {}
13 }
14
15 if transform.flip_horizontal {
17 transformed = transformed.fliph();
18 }
19 if transform.flip_vertical {
20 transformed = transformed.flipv();
21 }
22
23 let (width, height) = transformed.dimensions();
25
26 let left = transform.left.min(width);
42 let right = transform.right.min(width - left);
43 let top = transform.top.min(height);
44 let bottom = transform.bottom.min(height - top);
45
46 if left > 0 || right > 0 || top > 0 || bottom > 0 {
47 let crop_width = width.saturating_sub(left).saturating_sub(right);
48 let crop_height = height.saturating_sub(top).saturating_sub(bottom);
49 if crop_width > 0 && crop_height > 0 {
50 transformed = transformed.crop_imm(left, top, crop_width, crop_height);
51 }
52 }
53
54 transformed
55}
56
57pub fn calculate_absolute_crop(value_str: &str, total: u32) -> u32 {
58 if let Some(stripped) = value_str.strip_suffix('%')
59 && let Ok(percent) = stripped.parse::<f32>()
60 {
61 return ((percent / 100.0) * total as f32).round() as u32;
62 }
63 value_str.parse::<u32>().unwrap_or(0)
64}
65
66pub fn flip_horizontal(image: &DynamicImage) -> DynamicImage {
68 image.fliph()
69}
70
71pub fn flip_vertical(image: &DynamicImage) -> DynamicImage {
73 image.flipv()
74}
75
76pub fn rotate_90(image: &DynamicImage) -> DynamicImage {
78 image.rotate90()
79}
80
81pub fn rotate_270(image: &DynamicImage) -> DynamicImage {
83 image.rotate270()
84}