1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
use guillotiere::{AtlasAllocator, Size}; pub struct Allocator { raw: AtlasAllocator, allocations: usize, } impl Allocator { pub fn new(size: u32) -> Allocator { let raw = AtlasAllocator::new(Size::new(size as i32, size as i32)); Allocator { raw, allocations: 0, } } pub fn allocate(&mut self, width: u32, height: u32) -> Option<Region> { let allocation = self.raw.allocate(Size::new(width as i32, height as i32))?; self.allocations += 1; Some(Region { allocation }) } pub fn deallocate(&mut self, region: &Region) { self.raw.deallocate(region.allocation.id); self.allocations = self.allocations.saturating_sub(1); } pub fn is_empty(&self) -> bool { self.allocations == 0 } } pub struct Region { allocation: guillotiere::Allocation, } impl Region { pub fn position(&self) -> (u32, u32) { let rectangle = &self.allocation.rectangle; (rectangle.min.x as u32, rectangle.min.y as u32) } pub fn size(&self) -> (u32, u32) { let size = self.allocation.rectangle.size(); (size.width as u32, size.height as u32) } } impl std::fmt::Debug for Allocator { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "Allocator") } } impl std::fmt::Debug for Region { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Region") .field("id", &self.allocation.id) .field("rectangle", &self.allocation.rectangle) .finish() } }