use crate::compositor::layer::Layer;
pub fn find_cuts(layers: &[Layer], row: u16, screen_width: u16) -> Vec<u16> {
let mut cuts = Vec::new();
cuts.push(0);
if screen_width > 0 {
cuts.push(screen_width);
}
for layer in layers {
if layer.contains_row(row) {
let left = layer.region.position.x;
let right = left.saturating_add(layer.region.size.width);
if left < screen_width {
cuts.push(left);
}
if right <= screen_width {
cuts.push(right);
} else if right > screen_width {
}
}
}
cuts.sort_unstable();
cuts.dedup();
cuts
}
#[cfg(test)]
mod tests {
use super::*;
use crate::geometry::Rect;
#[test]
fn no_layers_returns_screen_bounds() {
let layers: Vec<Layer> = vec![];
let cuts = find_cuts(&layers, 0, 80);
assert!(cuts == vec![0, 80]);
}
#[test]
fn single_layer_full_width() {
let layers = vec![Layer::new(1, Rect::new(0, 0, 80, 24), 0, vec![])];
let cuts = find_cuts(&layers, 0, 80);
assert!(cuts == vec![0, 80]);
}
#[test]
fn single_layer_centered() {
let layers = vec![Layer::new(1, Rect::new(10, 0, 20, 5), 0, vec![])];
let cuts = find_cuts(&layers, 0, 80);
assert!(cuts == vec![0, 10, 30, 80]);
}
#[test]
fn two_non_overlapping() {
let layers = vec![
Layer::new(1, Rect::new(0, 0, 10, 5), 0, vec![]),
Layer::new(2, Rect::new(20, 0, 10, 5), 1, vec![]),
];
let cuts = find_cuts(&layers, 0, 80);
assert!(cuts == vec![0, 10, 20, 30, 80]);
}
#[test]
fn two_overlapping() {
let layers = vec![
Layer::new(1, Rect::new(0, 0, 20, 5), 0, vec![]),
Layer::new(2, Rect::new(10, 0, 20, 5), 1, vec![]),
];
let cuts = find_cuts(&layers, 0, 80);
assert!(cuts == vec![0, 10, 20, 30, 80]);
}
#[test]
fn layer_at_screen_edge() {
let layers = vec![Layer::new(1, Rect::new(70, 0, 10, 5), 0, vec![])];
let cuts = find_cuts(&layers, 0, 80);
assert!(cuts == vec![0, 70, 80]);
}
#[test]
fn layer_on_different_row() {
let layers = vec![Layer::new(1, Rect::new(10, 5, 20, 5), 0, vec![])];
let cuts = find_cuts(&layers, 0, 80);
assert!(cuts == vec![0, 80]);
}
#[test]
fn zero_width_screen() {
let layers = vec![Layer::new(1, Rect::new(0, 0, 10, 5), 0, vec![])];
let cuts = find_cuts(&layers, 0, 0);
assert!(cuts == vec![0]);
}
#[test]
fn layer_extends_beyond_screen() {
let layers = vec![Layer::new(1, Rect::new(70, 0, 20, 5), 0, vec![])];
let cuts = find_cuts(&layers, 0, 80);
assert!(cuts == vec![0, 70, 80]);
}
}