Enforce matching dimensions between render context and pixmap when rasterizing
diff --git a/Cargo.lock b/Cargo.lock index ef8dd41..36b2502 100644 --- a/Cargo.lock +++ b/Cargo.lock
@@ -3744,6 +3744,7 @@ dependencies = [ "bytemuck", "crossbeam-channel", + "log", "ordered-channel", "rayon", "smallvec",
diff --git a/sparse_strips/vello_cpu/Cargo.toml b/sparse_strips/vello_cpu/Cargo.toml index f447ac7..d8682df 100644 --- a/sparse_strips/vello_cpu/Cargo.toml +++ b/sparse_strips/vello_cpu/Cargo.toml
@@ -24,6 +24,7 @@ rayon = { workspace = true, optional = true } smallvec = { workspace = true, optional = true } thread_local = { workspace = true, optional = true } +log = { workspace = true } [features]
diff --git a/sparse_strips/vello_cpu/src/render.rs b/sparse_strips/vello_cpu/src/render.rs index 115b744..19553be 100644 --- a/sparse_strips/vello_cpu/src/render.rs +++ b/sparse_strips/vello_cpu/src/render.rs
@@ -15,6 +15,7 @@ use alloc::sync::Arc; use alloc::vec; use alloc::vec::Vec; +use log::warn; use vello_common::blurred_rounded_rect::BlurredRoundedRectangle; use vello_common::encode::{EncodeExt, EncodedPaint}; use vello_common::fearless_simd::Level; @@ -448,9 +449,19 @@ } /// Render the current context into a pixmap. + /// + /// Note that the pixmap needs to have the same dimensions as the render context. pub fn render_to_pixmap(&self, pixmap: &mut Pixmap) { let width = pixmap.width(); let height = pixmap.height(); + + if width != self.width || height != self.height { + warn!("cannot render a pixmap with the dimensions {width}x{height} into \ + a render context with the dimensions {}x{}", self.width, self.height); + + return; + } + self.render_to_buffer( pixmap.data_as_u8_slice_mut(), width, @@ -945,6 +956,7 @@ mod tests { use crate::RenderContext; use vello_common::kurbo::{Rect, Shape}; + use vello_common::pixmap::Pixmap; use vello_common::tile::Tile; #[test] @@ -981,4 +993,17 @@ ctx.flush(); ctx.render_to_pixmap(&mut pixmap); } + + #[test] + fn mismatched_dimensions() { + let mut ctx = RenderContext::new(20, 15); + let mut pixmap = Pixmap::new(20, 20); + let rect = Rect::new(0.0, 0.0, 20.0, 20.0); + + ctx.push_layer(Some(&rect.to_path(0.1)), None, None, None); + ctx.pop_layer(); + + ctx.flush(); + ctx.render_to_pixmap(&mut pixmap); + } }