🐛 Prevent rendering of unused fill slots in shapes

This commit is contained in:
Alejandro Alonso
2025-10-28 12:20:02 +01:00
parent f64105ad08
commit 3f4d699395
2 changed files with 13 additions and 4 deletions

View File

@@ -301,11 +301,17 @@
IHeapWritable
(-get-byte-size [_]
(- (.-byteLength dbuffer) 4))
;; Include the 4-byte header with the fill count
(+ 4 (* size FILL-U8-SIZE)))
(-write-to [_ heap offset]
(let [buffer' (.-buffer ^js/DataView dbuffer)]
(.set heap (js/Uint32Array. buffer' 4) offset)))
(let [buffer' (.-buffer ^js/DataView dbuffer)
;; Calculate byte size: 4 bytes header + (size * FILL-U8-SIZE)
byte-size (+ 4 (* size FILL-U8-SIZE))
;; Create Uint32Array with exact size needed (convert bytes to u32 elements)
u32-array (js/Uint32Array. buffer' 0 (/ byte-size 4))]
;; Copy from offset 0 to include the header with fill count
(.set heap u32-array offset)))
IBinaryFills
(-get-image-ids [_]

View File

@@ -70,7 +70,10 @@ pub fn parse_fills_from_bytes(buffer: &[u8], num_fills: usize) -> Vec<shapes::Fi
pub extern "C" fn set_shape_fills() {
with_current_shape_mut!(state, |shape: &mut Shape| {
let bytes = mem::bytes();
let fills = parse_fills_from_bytes(&bytes, bytes.len() / RAW_FILL_DATA_SIZE);
// The first byte contains the actual number of fills
let num_fills = bytes.first().copied().unwrap_or(0) as usize;
// Skip the first 4 bytes (header with fill count) and parse only the actual fills
let fills = parse_fills_from_bytes(&bytes[4..], num_fills);
shape.set_fills(fills);
});
}