127 .collect(); |
127 .collect(); |
128 } |
128 } |
129 |
129 |
130 pub fn insert(&mut self, size: Size) -> Option<Rect> { |
130 pub fn insert(&mut self, size: Size) -> Option<Rect> { |
131 let (rect, _) = self.find_position(size)?; |
131 let (rect, _) = self.find_position(size)?; |
132 |
132 let mut splits = vec![]; |
133 let mut rects_to_process = self.free_rects.len(); |
133 |
134 let mut i = 0; |
134 for i in (0..self.free_rects.len()).rev() { |
135 |
135 if split_rect(self.free_rects[i], rect, &mut splits) { |
136 while i < rects_to_process { |
136 self.free_rects.swap_remove(i as usize); |
137 let rects = split_rect(self.free_rects[i], rect); |
137 } |
138 if !rects.is_empty() { |
138 } |
139 self.free_rects.remove(i); |
139 self.free_rects.extend(splits); |
140 self.free_rects.extend(rects); |
140 self.prune(); |
141 rects_to_process -= 1 |
|
142 } else { |
|
143 i += 1; |
|
144 } |
|
145 } |
|
146 |
141 |
147 self.used_rects.push(rect); |
142 self.used_rects.push(rect); |
148 self.prune(); |
|
149 Some(rect) |
143 Some(rect) |
150 } |
144 } |
151 |
145 |
152 pub fn insert_set<Iter>(&mut self, sizes: Iter) -> Vec<Rect> |
146 pub fn insert_set<Iter>(&mut self, sizes: Iter) -> Vec<Rect> |
153 where |
147 where |
223 true |
217 true |
224 } |
218 } |
225 } |
219 } |
226 } |
220 } |
227 |
221 |
228 fn split_rect(free_rect: Rect, rect: Rect) -> Vec<Rect> { |
222 fn split_rect(free_rect: Rect, rect: Rect, output: &mut Vec<Rect>) -> bool { |
229 let mut result = vec![]; |
223 let split = free_rect.intersects(&rect); |
230 if free_rect.intersects(&rect) { |
224 if split { |
231 if rect.left() > free_rect.left() { |
225 if rect.left() > free_rect.left() { |
232 let trim = free_rect.right() - rect.left() + 1; |
226 let trim = free_rect.right() - rect.left() + 1; |
233 result.push(free_rect.with_margins(0, -trim, 0, 0)) |
227 output.push(free_rect.with_margins(0, -trim, 0, 0)) |
234 } |
228 } |
235 if rect.right() < free_rect.right() { |
229 if rect.right() < free_rect.right() { |
236 let trim = rect.right() - free_rect.left() + 1; |
230 let trim = rect.right() - free_rect.left() + 1; |
237 result.push(free_rect.with_margins(-trim, 0, 0, 0)) |
231 output.push(free_rect.with_margins(-trim, 0, 0, 0)) |
238 } |
232 } |
239 if rect.top() > free_rect.top() { |
233 if rect.top() > free_rect.top() { |
240 let trim = free_rect.bottom() - rect.top() + 1; |
234 let trim = free_rect.bottom() - rect.top() + 1; |
241 result.push(free_rect.with_margins(0, 0, 0, -trim)); |
235 output.push(free_rect.with_margins(0, 0, 0, -trim)); |
242 } |
236 } |
243 if rect.bottom() < free_rect.bottom() { |
237 if rect.bottom() < free_rect.bottom() { |
244 let trim = rect.bottom() - free_rect.top() + 1; |
238 let trim = rect.bottom() - free_rect.top() + 1; |
245 result.push(free_rect.with_margins(0, 0, -trim, 0)); |
239 output.push(free_rect.with_margins(0, 0, -trim, 0)); |
246 } |
240 } |
247 } |
241 } |
248 result |
242 split |
249 } |
243 } |
250 |
244 |
251 #[cfg(test)] |
245 #[cfg(test)] |
252 mod tests { |
246 mod tests { |
253 use super::Atlas; |
247 use super::Atlas; |