summaryrefslogtreecommitdiffstats
path: root/wgpu/src/widget
diff options
context:
space:
mode:
Diffstat (limited to 'wgpu/src/widget')
-rw-r--r--wgpu/src/widget/canvas.rs24
-rw-r--r--wgpu/src/widget/canvas/cache.rs12
-rw-r--r--wgpu/src/widget/canvas/frame.rs12
-rw-r--r--wgpu/src/widget/canvas/geometry.rs15
4 files changed, 37 insertions, 26 deletions
diff --git a/wgpu/src/widget/canvas.rs b/wgpu/src/widget/canvas.rs
index 2b485e18..744d901e 100644
--- a/wgpu/src/widget/canvas.rs
+++ b/wgpu/src/widget/canvas.rs
@@ -10,7 +10,7 @@ use crate::{Defaults, Primitive, Renderer};
use iced_native::{
input::mouse, layout, Clipboard, Element, Hasher, Layout, Length,
- MouseCursor, Point, Size, Widget,
+ MouseCursor, Point, Size, Vector, Widget,
};
use std::hash::Hash;
@@ -190,20 +190,20 @@ impl<Message, S: State> Widget<Message, Renderer> for Canvas<S> {
_cursor_position: Point,
) -> (Primitive, MouseCursor) {
let bounds = layout.bounds();
- let origin = Point::new(bounds.x, bounds.y);
+ let translation = Vector::new(bounds.x, bounds.y);
let size = Size::new(bounds.width, bounds.height);
(
- Primitive::Group {
- primitives: self
- .state
- .draw(size)
- .into_iter()
- .map(|geometry| Primitive::Cached {
- origin,
- cache: geometry.into_primitive(),
- })
- .collect(),
+ Primitive::Translate {
+ translation,
+ content: Box::new(Primitive::Group {
+ primitives: self
+ .state
+ .draw(size)
+ .into_iter()
+ .map(Geometry::into_primitive)
+ .collect(),
+ }),
},
MouseCursor::Idle,
)
diff --git a/wgpu/src/widget/canvas/cache.rs b/wgpu/src/widget/canvas/cache.rs
index 310bc1d3..12cc6442 100644
--- a/wgpu/src/widget/canvas/cache.rs
+++ b/wgpu/src/widget/canvas/cache.rs
@@ -57,21 +57,27 @@ impl Cache {
if let State::Filled { bounds, primitive } = self.state.borrow().deref()
{
if *bounds == new_bounds {
- return Geometry::from_primitive(primitive.clone());
+ return Geometry::from_primitive(Primitive::Cached {
+ cache: primitive.clone(),
+ });
}
}
let mut frame = Frame::new(new_bounds);
input.draw(&mut frame);
- let primitive = Arc::new(frame.into_primitive());
+ let primitive = {
+ let geometry = frame.into_geometry();
+
+ Arc::new(geometry.into_primitive())
+ };
*self.state.borrow_mut() = State::Filled {
bounds: new_bounds,
primitive: primitive.clone(),
};
- Geometry::from_primitive(primitive)
+ Geometry::from_primitive(Primitive::Cached { cache: primitive })
}
pub fn with<'a, T>(&'a self, input: T) -> impl crate::canvas::State + 'a
diff --git a/wgpu/src/widget/canvas/frame.rs b/wgpu/src/widget/canvas/frame.rs
index a951a029..8623ce4d 100644
--- a/wgpu/src/widget/canvas/frame.rs
+++ b/wgpu/src/widget/canvas/frame.rs
@@ -1,7 +1,7 @@
use iced_native::{Point, Rectangle, Size, Vector};
use crate::{
- canvas::{Fill, Path, Stroke, Text},
+ canvas::{Fill, Geometry, Path, Stroke, Text},
triangle, Primitive,
};
@@ -260,13 +260,13 @@ impl Frame {
self.transforms.current.is_identity = false;
}
- /// Produces the primitive representing everything drawn on the [`Frame`].
+ /// Produces the [`Geometry`] representing everything drawn on the [`Frame`].
///
/// [`Frame`]: struct.Frame.html
- pub fn into_primitive(mut self) -> Primitive {
+ /// [`Geometry`]: struct.Geometry.html
+ pub fn into_geometry(mut self) -> Geometry {
if !self.buffers.indices.is_empty() {
self.primitives.push(Primitive::Mesh2D {
- origin: Point::ORIGIN,
buffers: triangle::Mesh2D {
vertices: self.buffers.vertices,
indices: self.buffers.indices,
@@ -274,9 +274,9 @@ impl Frame {
});
}
- Primitive::Group {
+ Geometry::from_primitive(Primitive::Group {
primitives: self.primitives,
- }
+ })
}
}
diff --git a/wgpu/src/widget/canvas/geometry.rs b/wgpu/src/widget/canvas/geometry.rs
index db7b4054..12ef828f 100644
--- a/wgpu/src/widget/canvas/geometry.rs
+++ b/wgpu/src/widget/canvas/geometry.rs
@@ -1,15 +1,20 @@
use crate::Primitive;
-use std::sync::Arc;
-#[derive(Debug)]
-pub struct Geometry(Arc<Primitive>);
+#[derive(Debug, Clone)]
+pub struct Geometry(Primitive);
impl Geometry {
- pub(crate) fn from_primitive(primitive: Arc<Primitive>) -> Self {
+ pub(crate) fn from_primitive(primitive: Primitive) -> Self {
Self(primitive)
}
- pub(crate) fn into_primitive(self) -> Arc<Primitive> {
+ pub fn into_primitive(self) -> Primitive {
self.0
}
}
+
+impl From<Geometry> for Primitive {
+ fn from(geometry: Geometry) -> Primitive {
+ geometry.0
+ }
+}