rust/lib-hedgewars-engine/src/render/atlas.rs
changeset 14730 19d30d96d7d6
parent 14728 766ce87dfdfc
child 14731 75ff5c643004
equal deleted inserted replaced
14729:fbd385a1bcf4 14730:19d30d96d7d6
     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 }