diff options
author | 2019-11-07 02:29:15 +0100 | |
---|---|---|
committer | 2019-11-07 02:29:15 +0100 | |
commit | d568d05df4388bfaa254ee87cca6edd07fc24465 (patch) | |
tree | d63162b4b7cfe5197a87d437569c1400b49e7da5 | |
parent | efa8d267b8e1d667902b1e0d0e7c6e4d79e75f6e (diff) | |
parent | 904818ccb0597e50b8a51bcbcbbf914c692b3d1a (diff) | |
download | iced-d568d05df4388bfaa254ee87cca6edd07fc24465.tar.gz iced-d568d05df4388bfaa254ee87cca6edd07fc24465.tar.bz2 iced-d568d05df4388bfaa254ee87cca6edd07fc24465.zip |
Merge pull request #43 from hecrj/fix/clip-primitive-overflow
Fix integer overflow with nested clip primitives
-rw-r--r-- | wgpu/src/renderer.rs | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs index f46acb8c..c8e1e10d 100644 --- a/wgpu/src/renderer.rs +++ b/wgpu/src/renderer.rs @@ -254,24 +254,31 @@ impl Renderer { offset, content, } => { - let clip_layer = Layer::new( - Rectangle { - x: bounds.x as u32 - layer.offset.x, - y: bounds.y as u32 - layer.offset.y, - width: bounds.width as u32, - height: bounds.height as u32, - }, - layer.offset + *offset, - ); - - let new_layer = Layer::new(layer.bounds, layer.offset); - - layers.push(clip_layer); - - // TODO: Primitive culling - self.draw_primitive(content, layers); - - layers.push(new_layer); + let x = bounds.x - layer.offset.x as f32; + let y = bounds.y - layer.offset.y as f32; + let width = (bounds.width + x).min(bounds.width); + let height = (bounds.height + y).min(bounds.height); + + // Only draw visible content on-screen + // TODO: Also, check for parent layer bounds to avoid further + // drawing in some circumstances. + if width > 0.0 && height > 0.0 { + let clip_layer = Layer::new( + Rectangle { + x: x.max(0.0).floor() as u32, + y: y.max(0.0).floor() as u32, + width: width.ceil() as u32, + height: height.ceil() as u32, + }, + layer.offset + *offset, + ); + + let new_layer = Layer::new(layer.bounds, layer.offset); + + layers.push(clip_layer); + self.draw_primitive(content, layers); + layers.push(new_layer); + } } } } |