diff options
author | 2022-03-10 23:33:58 +0700 | |
---|---|---|
committer | 2022-03-10 23:33:58 +0700 | |
commit | ec8ed9fa8bdfdd750cfc26eb50b971d575095ebf (patch) | |
tree | 18dd54da8116e5cbfc8900edb5bb8a704413a282 /graphics | |
parent | a53fa91e0ddf374bbeb66d5e831b79127ed47a9d (diff) | |
download | iced-ec8ed9fa8bdfdd750cfc26eb50b971d575095ebf.tar.gz iced-ec8ed9fa8bdfdd750cfc26eb50b971d575095ebf.tar.bz2 iced-ec8ed9fa8bdfdd750cfc26eb50b971d575095ebf.zip |
Fix `canvas::Frame` issuing a new layer for `Mesh2D` in `with_clip`
Text will still be rendered in its own layer, until we fix the composition bottleneck in `glyph-brush`.
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/src/widget/canvas/frame.rs | 42 | ||||
-rw-r--r-- | graphics/src/widget/canvas/geometry.rs | 6 |
2 files changed, 32 insertions, 16 deletions
diff --git a/graphics/src/widget/canvas/frame.rs b/graphics/src/widget/canvas/frame.rs index a3449605..8e198b29 100644 --- a/graphics/src/widget/canvas/frame.rs +++ b/graphics/src/widget/canvas/frame.rs @@ -265,12 +265,30 @@ impl Frame { f(&mut frame); - self.primitives.push(Primitive::Clip { - bounds: region, - content: Box::new(Primitive::Translate { - translation: Vector::new(region.x, region.y), - content: Box::new(frame.into_geometry().into_primitive()), - }), + let primitives = frame.into_primitives(); + + let (text, meshes) = primitives + .into_iter() + .partition(|primitive| matches!(primitive, Primitive::Text { .. })); + + let translation = Vector::new(region.x, region.y); + + self.primitives.push(Primitive::Group { + primitives: vec![ + Primitive::Translate { + translation, + content: Box::new(Primitive::Group { primitives: meshes }), + }, + Primitive::Translate { + translation, + content: Box::new(Primitive::Clip { + bounds: region, + content: Box::new(Primitive::Group { + primitives: text, + }), + }), + }, + ], }); } @@ -308,7 +326,13 @@ impl Frame { } /// Produces the [`Geometry`] representing everything drawn on the [`Frame`]. - pub fn into_geometry(mut self) -> Geometry { + pub fn into_geometry(self) -> Geometry { + Geometry::from_primitive(Primitive::Group { + primitives: self.into_primitives(), + }) + } + + fn into_primitives(mut self) -> Vec<Primitive> { if !self.buffers.indices.is_empty() { self.primitives.push(Primitive::Mesh2D { buffers: triangle::Mesh2D { @@ -319,9 +343,7 @@ impl Frame { }); } - Geometry::from_primitive(Primitive::Group { - primitives: self.primitives, - }) + self.primitives } } diff --git a/graphics/src/widget/canvas/geometry.rs b/graphics/src/widget/canvas/geometry.rs index 8915cda1..e8ac621d 100644 --- a/graphics/src/widget/canvas/geometry.rs +++ b/graphics/src/widget/canvas/geometry.rs @@ -22,9 +22,3 @@ impl Geometry { self.0 } } - -impl From<Geometry> for Primitive { - fn from(geometry: Geometry) -> Primitive { - geometry.0 - } -} |