diff options
| author | 2019-11-07 02:29:15 +0100 | |
|---|---|---|
| committer | 2019-11-07 02:29:15 +0100 | |
| commit | d568d05df4388bfaa254ee87cca6edd07fc24465 (patch) | |
| tree | d63162b4b7cfe5197a87d437569c1400b49e7da5 /wgpu/src/renderer | |
| 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
Diffstat (limited to '')
| -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); +                }              }          }      } | 
