summaryrefslogtreecommitdiffstats
path: root/wgpu/src/renderer
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--wgpu/src/renderer.rs24
-rw-r--r--wgpu/src/renderer/image.rs31
2 files changed, 49 insertions, 6 deletions
diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs
index 8930e9df..ab6f744f 100644
--- a/wgpu/src/renderer.rs
+++ b/wgpu/src/renderer.rs
@@ -1,4 +1,4 @@
-use crate::{quad, Primitive, Quad, Transformation};
+use crate::{quad, Image, Primitive, Quad, Transformation};
use iced_native::{
renderer::Debugger, renderer::Windowed, Background, Color, Layout,
MouseCursor, Point, Widget,
@@ -29,8 +29,10 @@ pub struct Renderer {
device: Device,
queue: Queue,
quad_pipeline: quad::Pipeline,
+ image_pipeline: crate::image::Pipeline,
quads: Vec<Quad>,
+ images: Vec<Image>,
glyph_brush: Rc<RefCell<GlyphBrush<'static, ()>>>,
}
@@ -67,6 +69,7 @@ impl Renderer {
.build(&mut device, TextureFormat::Bgra8UnormSrgb);
let quad_pipeline = quad::Pipeline::new(&mut device);
+ let image_pipeline = crate::image::Pipeline::new(&mut device);
Self {
surface,
@@ -74,8 +77,10 @@ impl Renderer {
device,
queue,
quad_pipeline,
+ image_pipeline,
quads: Vec::new(),
+ images: Vec::new(),
glyph_brush: Rc::new(RefCell::new(glyph_brush)),
}
}
@@ -139,6 +144,16 @@ impl Renderer {
self.quads.clear();
+ self.image_pipeline.draw(
+ &mut self.device,
+ &mut encoder,
+ &self.images,
+ target.transformation,
+ &frame.view,
+ );
+
+ self.images.clear();
+
self.glyph_brush
.borrow_mut()
.draw_queued(
@@ -238,6 +253,13 @@ impl Renderer {
border_radius: u32::from(*border_radius),
});
}
+ Primitive::Image { path, bounds } => {
+ self.images.push(Image {
+ path: path.clone(),
+ position: [bounds.x, bounds.y],
+ scale: [bounds.width, bounds.height],
+ });
+ }
}
}
}
diff --git a/wgpu/src/renderer/image.rs b/wgpu/src/renderer/image.rs
index 85ac3ad5..1a9b01bb 100644
--- a/wgpu/src/renderer/image.rs
+++ b/wgpu/src/renderer/image.rs
@@ -1,12 +1,33 @@
use crate::{Primitive, Renderer};
-use iced_native::{image, Image, Layout, MouseCursor, Node, Style};
+use iced_native::{image, Image, Layout, Length, MouseCursor, Node, Style};
impl image::Renderer for Renderer {
- fn node(&self, _image: &Image) -> Node {
- Node::new(Style::default())
+ fn node(&self, image: &Image) -> Node {
+ let (width, height) = self.image_pipeline.dimensions(&image.path);
+
+ let aspect_ratio = width as f32 / height as f32;
+
+ let mut style = Style::default().align_self(image.align_self);
+
+ style = match (image.width, image.height) {
+ (Length::Units(width), _) => style.width(image.width).height(
+ Length::Units((width as f32 / aspect_ratio).round() as u16),
+ ),
+ (_, _) => style
+ .width(Length::Units(width as u16))
+ .height(Length::Units(height as u16)),
+ };
+
+ Node::new(style)
}
- fn draw(&mut self, _image: &Image, _layout: Layout<'_>) -> Self::Output {
- (Primitive::None, MouseCursor::OutOfBounds)
+ fn draw(&mut self, image: &Image, layout: Layout<'_>) -> Self::Output {
+ (
+ Primitive::Image {
+ path: image.path.clone(),
+ bounds: layout.bounds(),
+ },
+ MouseCursor::OutOfBounds,
+ )
}
}