diff options
| -rw-r--r-- | Cargo.toml | 4 | ||||
| -rw-r--r-- | src/xcursor.rs | 18 |
2 files changed, 14 insertions, 8 deletions
@@ -14,3 +14,7 @@ usvg = "0.44.0" lto = "fat" codegen-units = 1 strip = "symbols" + +[features] +default = ["overalloc"] +overalloc = [] diff --git a/src/xcursor.rs b/src/xcursor.rs index ff6c3d6..7e365e4 100644 --- a/src/xcursor.rs +++ b/src/xcursor.rs @@ -31,10 +31,8 @@ impl XCursorEncoder { } pub fn pack(&mut self) -> Vec<u8> { - fn insert_bytes(data: &mut Vec<u8>, new_data: impl IntoIterator<Item = u8>) { - for int in new_data { - data.push(int); - } + fn insert_bytes(data: &mut Vec<u8>, new_data: &[u8]) { + data.extend_from_slice(new_data); } fn insert_int(data: &mut Vec<u8>, int: u32) { data.push((int & 0xff) as u8); @@ -44,11 +42,15 @@ impl XCursorEncoder { } let mut data: Vec<u8> = Vec::new(); + #[cfg(feature="overalloc")] + data.reserve( + 4194304 + ); // File Header { // MAGIC string ("Xcur") - insert_bytes(&mut data, MAGIC); + insert_bytes(&mut data, &MAGIC); // CARD32 bytes in this header insert_int(&mut data, 16); // CARD32 file version @@ -62,7 +64,7 @@ impl XCursorEncoder { let mut img_idx: usize = 0; for img in self.images.clone().into_iter() { // Some header - insert_bytes(&mut data, IMAGE_HEADER); + insert_bytes(&mut data, &IMAGE_HEADER); // CARD32 type-specific label - size for images insert_int(&mut data, img.r#type); // CARD32 absolute byte position of table in file @@ -78,7 +80,7 @@ impl XCursorEncoder { // Header Size (36) insert_int(&mut data, 36); // Image Type - insert_bytes(&mut data, IMAGE_HEADER); + insert_bytes(&mut data, &IMAGE_HEADER); // Subtype, for nominal size insert_int(&mut data, img.subtype); // Version @@ -92,7 +94,7 @@ impl XCursorEncoder { // Milliseconds till next frame insert_int(&mut data, img.delay); // Raw image data - insert_bytes(&mut data, img.data); + insert_bytes(&mut data, &img.data); } } |