Fix overflow in clipping
diff --git a/sparse_strips/vello_common/src/coarse.rs b/sparse_strips/vello_common/src/coarse.rs index ac8ca43..3245aff 100644 --- a/sparse_strips/vello_common/src/coarse.rs +++ b/sparse_strips/vello_common/src/coarse.rs
@@ -521,10 +521,10 @@ // Calculate starting position and column for alpha mask let mut x = x0; - let mut col = (strip.alpha_idx / u32::from(Tile::HEIGHT)) as u16; + let mut col = strip.alpha_idx / u32::from(Tile::HEIGHT); let clip_x = clip_bbox.x0() * WideTile::WIDTH; if clip_x > x { - col += clip_x - x; + col += (clip_x - x) as u32; x = clip_x; } @@ -543,10 +543,10 @@ let cmd = CmdClipAlphaFill { x: x_rel, width: width as u32, - alpha_idx: (col * Tile::HEIGHT) as usize, + alpha_idx: col as usize * Tile::HEIGHT as usize, }; x += width; - col += width; + col += width as u32; // Apply the clip strip command and update state self.get_mut(wtile_x, cur_wtile_y).clip_strip(cmd);
diff --git a/sparse_strips/vello_cpu/src/render.rs b/sparse_strips/vello_cpu/src/render.rs index 68931b4..35522e2 100644 --- a/sparse_strips/vello_cpu/src/render.rs +++ b/sparse_strips/vello_cpu/src/render.rs
@@ -275,8 +275,9 @@ #[cfg(test)] mod tests { + use core::iter; use crate::RenderContext; - use vello_common::kurbo::Rect; + use vello_common::kurbo::{Rect, Shape}; #[test] fn reset_render_context() { @@ -295,4 +296,14 @@ assert!(ctx.strip_buf.is_empty()); assert!(ctx.alphas.is_empty()); } + + #[test] + fn clip_overflow() { + let mut ctx = RenderContext::new(100, 100); + + ctx.alphas.extend(iter::repeat(255).take(u16::MAX as usize + 1)); + + ctx.clip(&Rect::new(20.0, 20.0, 180.0, 180.0).to_path(0.1)); + ctx.finish(); + } }