summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2019-11-07 02:29:15 +0100
committerLibravatar GitHub <noreply@github.com>2019-11-07 02:29:15 +0100
commitd568d05df4388bfaa254ee87cca6edd07fc24465 (patch)
treed63162b4b7cfe5197a87d437569c1400b49e7da5
parentefa8d267b8e1d667902b1e0d0e7c6e4d79e75f6e (diff)
parent904818ccb0597e50b8a51bcbcbbf914c692b3d1a (diff)
downloadiced-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.rs43
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);
+ }
}
}
}