1 use integral_geometry::{Rect, Size}; |
1 use integral_geometry::{Rect, Size}; |
2 use std::cmp::{max, min, Ordering}; |
2 use std::cmp::{max, min, Ordering}; |
3 |
3 |
4 #[derive(PartialEq, Eq, PartialOrd, Ord, Clone)] |
4 #[derive(PartialEq, Eq, PartialOrd, Ord, Clone)] |
5 struct Fit { |
5 struct Fit { |
6 short_size: u32, |
6 short_side: u32, |
7 long_size: u32, |
7 long_side: u32, |
8 } |
8 } |
9 |
9 |
10 impl Fit { |
10 impl Fit { |
11 fn new() -> Self { |
11 fn new() -> Self { |
12 Self { |
12 Self { |
13 short_size: u32::max_value(), |
13 short_side: u32::max_value(), |
14 long_size: u32::max_value(), |
14 long_side: u32::max_value(), |
15 } |
15 } |
16 } |
16 } |
17 |
17 |
18 fn measure(container: Size, size: Size) -> Option<Self> { |
18 fn measure(container: Size, size: Size) -> Option<Self> { |
19 if container.contains(size) { |
19 if container.contains(size) { |
20 let x_leftover = container.width - size.width; |
20 let x_leftover = container.width - size.width; |
21 let y_leftover = container.height - size.height; |
21 let y_leftover = container.height - size.height; |
22 Some(Self { |
22 Some(Self { |
23 short_size: min(x_leftover, y_leftover) as u32, |
23 short_side: min(x_leftover, y_leftover) as u32, |
24 long_size: max(x_leftover, y_leftover) as u32, |
24 long_side: max(x_leftover, y_leftover) as u32, |
25 }) |
25 }) |
26 } else { |
26 } else { |
27 None |
27 None |
28 } |
28 } |
29 } |
29 } |
276 fn prop_insert(rects in Vec::<TestRect>::arbitrary()) { |
276 fn prop_insert(rects in Vec::<TestRect>::arbitrary()) { |
277 let container = Rect::at_origin(Size::square(2048)); |
277 let container = Rect::at_origin(Size::square(2048)); |
278 let mut atlas = Atlas::new(container.size()); |
278 let mut atlas = Atlas::new(container.size()); |
279 let inserted: Vec<_> = rects.iter().filter_map(|TestRect(size)| atlas.insert(*size)).collect(); |
279 let inserted: Vec<_> = rects.iter().filter_map(|TestRect(size)| atlas.insert(*size)).collect(); |
280 |
280 |
|
281 let mut inserted_pairs = inserted.iter().zip(&inserted); |
|
282 |
281 assert!(inserted.iter().all(|r| container.contains_rect(r))); |
283 assert!(inserted.iter().all(|r| container.contains_rect(r))); |
282 |
284 assert!(inserted_pairs.all(|(r1, r2)| r1 == r2 || r1 != r2 && r1.intersects(r2))); |
283 assert_eq!(inserted.len(), rects.len()); |
285 |
|
286 assert(inserted.len(), rects.len()); |
284 assert_eq!(sum_area(&inserted), sum_area(&rects)); |
287 assert_eq!(sum_area(&inserted), sum_area(&rects)); |
285 } |
288 } |
286 } |
289 } |
287 } |
290 } |