# HG changeset patch # User alfadur # Date 1553721193 -10800 # Node ID 2cc36cb1c25827847a69a1a183a8d4c05aff12dc # Parent 75ff5c6430045dc9010fc9b9b20534a66d46460e fix atlas.insert for real this time diff -r 75ff5c643004 -r 2cc36cb1c258 rust/lib-hedgewars-engine/src/render/atlas.rs --- a/rust/lib-hedgewars-engine/src/render/atlas.rs Wed Mar 27 23:26:58 2019 +0300 +++ b/rust/lib-hedgewars-engine/src/render/atlas.rs Thu Mar 28 00:13:13 2019 +0300 @@ -129,23 +129,17 @@ pub fn insert(&mut self, size: Size) -> Option { let (rect, _) = self.find_position(size)?; - - let mut rects_to_process = self.free_rects.len(); - let mut i = 0; + let mut splits = vec![]; - while i < rects_to_process { - let rects = split_rect(self.free_rects[i], rect); - if !rects.is_empty() { - self.free_rects.remove(i); - self.free_rects.extend(rects); - rects_to_process -= 1 - } else { - i += 1; + for i in (0..self.free_rects.len()).rev() { + if split_rect(self.free_rects[i], rect, &mut splits) { + self.free_rects.swap_remove(i as usize); } } + self.free_rects.extend(splits); + self.prune(); self.used_rects.push(rect); - self.prune(); Some(rect) } @@ -225,27 +219,27 @@ } } -fn split_rect(free_rect: Rect, rect: Rect) -> Vec { - let mut result = vec![]; - if free_rect.intersects(&rect) { +fn split_rect(free_rect: Rect, rect: Rect, output: &mut Vec) -> bool { + let split = free_rect.intersects(&rect); + if split { if rect.left() > free_rect.left() { let trim = free_rect.right() - rect.left() + 1; - result.push(free_rect.with_margins(0, -trim, 0, 0)) + output.push(free_rect.with_margins(0, -trim, 0, 0)) } if rect.right() < free_rect.right() { let trim = rect.right() - free_rect.left() + 1; - result.push(free_rect.with_margins(-trim, 0, 0, 0)) + output.push(free_rect.with_margins(-trim, 0, 0, 0)) } if rect.top() > free_rect.top() { let trim = free_rect.bottom() - rect.top() + 1; - result.push(free_rect.with_margins(0, 0, 0, -trim)); + output.push(free_rect.with_margins(0, 0, 0, -trim)); } if rect.bottom() < free_rect.bottom() { let trim = rect.bottom() - free_rect.top() + 1; - result.push(free_rect.with_margins(0, 0, -trim, 0)); + output.push(free_rect.with_margins(0, 0, -trim, 0)); } } - result + split } #[cfg(test)]