use crate::settings::model::LocalPreviewScale;
#[must_use]
pub fn effective_dimensions(
width: u32,
height: u32,
scale: LocalPreviewScale,
moving: bool,
) -> (u32, u32) {
if !moving {
return (width, height);
}
let divisor = scale.divisor();
if divisor <= 1 {
return (width, height);
}
((width / divisor).max(1), (height / divisor).max(1))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn off_never_reduces_regardless_of_movement() {
assert_eq!(
effective_dimensions(1920, 1080, LocalPreviewScale::Off, true),
(1920, 1080)
);
assert_eq!(
effective_dimensions(1920, 1080, LocalPreviewScale::Off, false),
(1920, 1080)
);
}
#[test]
fn settled_always_returns_the_full_configured_resolution() {
for scale in [
LocalPreviewScale::Off,
LocalPreviewScale::Half,
LocalPreviewScale::Quarter,
] {
assert_eq!(
effective_dimensions(1280, 720, scale, false),
(1280, 720),
"scale={scale:?}"
);
}
}
#[test]
fn half_scale_halves_only_while_moving() {
assert_eq!(
effective_dimensions(1280, 720, LocalPreviewScale::Half, true),
(640, 360)
);
assert_eq!(
effective_dimensions(1280, 720, LocalPreviewScale::Half, false),
(1280, 720)
);
}
#[test]
fn quarter_scale_quarters_only_while_moving() {
assert_eq!(
effective_dimensions(1280, 720, LocalPreviewScale::Quarter, true),
(320, 180)
);
assert_eq!(
effective_dimensions(1280, 720, LocalPreviewScale::Quarter, false),
(1280, 720)
);
}
#[test]
fn tiny_configured_dimensions_floor_at_one_by_one_while_moving() {
assert_eq!(
effective_dimensions(2, 2, LocalPreviewScale::Quarter, true),
(1, 1)
);
assert_eq!(
effective_dimensions(1, 1, LocalPreviewScale::Half, true),
(1, 1)
);
}
#[test]
fn odd_configured_dimensions_floor_divide() {
assert_eq!(
effective_dimensions(801, 601, LocalPreviewScale::Half, true),
(400, 300)
);
}
}