summaryrefslogtreecommitdiffstats
path: root/wgpu/src/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'wgpu/src/renderer')
-rw-r--r--wgpu/src/renderer/button.rs49
-rw-r--r--wgpu/src/renderer/checkbox.rs18
-rw-r--r--wgpu/src/renderer/column.rs22
-rw-r--r--wgpu/src/renderer/image.rs16
-rw-r--r--wgpu/src/renderer/radio.rs17
-rw-r--r--wgpu/src/renderer/row.rs22
-rw-r--r--wgpu/src/renderer/slider.rs17
-rw-r--r--wgpu/src/renderer/text.rs80
8 files changed, 241 insertions, 0 deletions
diff --git a/wgpu/src/renderer/button.rs b/wgpu/src/renderer/button.rs
new file mode 100644
index 00000000..00fcd0eb
--- /dev/null
+++ b/wgpu/src/renderer/button.rs
@@ -0,0 +1,49 @@
+use crate::{Primitive, Renderer};
+use iced_native::{
+ button, Align, Background, Button, Color, Layout, Length, Node, Point,
+ Style,
+};
+
+impl button::Renderer for Renderer {
+ fn node<Message>(&self, button: &Button<Message, Self>) -> Node {
+ let style = Style::default()
+ .width(button.width)
+ .padding(button.padding)
+ .min_width(Length::Units(100))
+ .align_self(button.align_self)
+ .align_items(Align::Stretch);
+
+ Node::with_children(style, vec![button.content.node(self)])
+ }
+
+ fn draw<Message>(
+ &mut self,
+ button: &Button<Message, Self>,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ ) -> Self::Primitive {
+ let bounds = layout.bounds();
+
+ Primitive::Group {
+ primitives: vec![
+ Primitive::Quad {
+ bounds,
+ background: button.background.unwrap_or(Background::Color(
+ Color {
+ r: 0.8,
+ b: 0.8,
+ g: 0.8,
+ a: 1.0,
+ },
+ )),
+ border_radius: button.border_radius,
+ },
+ button.content.draw(
+ self,
+ layout.children().next().unwrap(),
+ cursor_position,
+ ),
+ ],
+ }
+ }
+}
diff --git a/wgpu/src/renderer/checkbox.rs b/wgpu/src/renderer/checkbox.rs
new file mode 100644
index 00000000..16d5734f
--- /dev/null
+++ b/wgpu/src/renderer/checkbox.rs
@@ -0,0 +1,18 @@
+use crate::{Primitive, Renderer};
+use iced_native::{checkbox, Checkbox, Layout, Node, Point, Style};
+
+impl checkbox::Renderer for Renderer {
+ fn node<Message>(&self, _checkbox: &Checkbox<Message>) -> Node {
+ Node::new(Style::default())
+ }
+
+ fn draw<Message>(
+ &mut self,
+ _checkbox: &Checkbox<Message>,
+ _layout: Layout<'_>,
+ _cursor_position: Point,
+ ) -> Self::Primitive {
+ // TODO
+ Primitive::None
+ }
+}
diff --git a/wgpu/src/renderer/column.rs b/wgpu/src/renderer/column.rs
new file mode 100644
index 00000000..1b9adad6
--- /dev/null
+++ b/wgpu/src/renderer/column.rs
@@ -0,0 +1,22 @@
+use crate::{Primitive, Renderer};
+use iced_native::{column, Column, Layout, Point};
+
+impl column::Renderer for Renderer {
+ fn draw<Message>(
+ &mut self,
+ column: &Column<'_, Message, Self>,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ ) -> Self::Primitive {
+ Primitive::Group {
+ primitives: column
+ .children
+ .iter()
+ .zip(layout.children())
+ .map(|(child, layout)| {
+ child.draw(self, layout, cursor_position)
+ })
+ .collect(),
+ }
+ }
+}
diff --git a/wgpu/src/renderer/image.rs b/wgpu/src/renderer/image.rs
new file mode 100644
index 00000000..bacc430d
--- /dev/null
+++ b/wgpu/src/renderer/image.rs
@@ -0,0 +1,16 @@
+use crate::{Primitive, Renderer};
+use iced_native::{image, Image, Layout, Node, Style};
+
+impl image::Renderer<&str> for Renderer {
+ fn node(&self, _image: &Image<&str>) -> Node {
+ Node::new(Style::default())
+ }
+
+ fn draw(
+ &mut self,
+ _image: &Image<&str>,
+ _layout: Layout<'_>,
+ ) -> Self::Primitive {
+ Primitive::None
+ }
+}
diff --git a/wgpu/src/renderer/radio.rs b/wgpu/src/renderer/radio.rs
new file mode 100644
index 00000000..fdc0a0fc
--- /dev/null
+++ b/wgpu/src/renderer/radio.rs
@@ -0,0 +1,17 @@
+use crate::{Primitive, Renderer};
+use iced_native::{radio, Layout, Node, Point, Radio, Style};
+
+impl radio::Renderer for Renderer {
+ fn node<Message>(&self, _checkbox: &Radio<Message>) -> Node {
+ Node::new(Style::default())
+ }
+
+ fn draw<Message>(
+ &mut self,
+ _radio: &Radio<Message>,
+ _layout: Layout<'_>,
+ _cursor_position: Point,
+ ) -> Self::Primitive {
+ Primitive::None
+ }
+}
diff --git a/wgpu/src/renderer/row.rs b/wgpu/src/renderer/row.rs
new file mode 100644
index 00000000..be9e4ede
--- /dev/null
+++ b/wgpu/src/renderer/row.rs
@@ -0,0 +1,22 @@
+use crate::{Primitive, Renderer};
+use iced_native::{row, Layout, Point, Row};
+
+impl row::Renderer for Renderer {
+ fn draw<Message>(
+ &mut self,
+ row: &Row<'_, Message, Self>,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ ) -> Self::Primitive {
+ Primitive::Group {
+ primitives: row
+ .children
+ .iter()
+ .zip(layout.children())
+ .map(|(child, layout)| {
+ child.draw(self, layout, cursor_position)
+ })
+ .collect(),
+ }
+ }
+}
diff --git a/wgpu/src/renderer/slider.rs b/wgpu/src/renderer/slider.rs
new file mode 100644
index 00000000..2e76022d
--- /dev/null
+++ b/wgpu/src/renderer/slider.rs
@@ -0,0 +1,17 @@
+use crate::{Primitive, Renderer};
+use iced_native::{slider, Layout, Node, Point, Slider, Style};
+
+impl slider::Renderer for Renderer {
+ fn node<Message>(&self, _slider: &Slider<Message>) -> Node {
+ Node::new(Style::default())
+ }
+
+ fn draw<Message>(
+ &mut self,
+ _slider: &Slider<Message>,
+ _layout: Layout<'_>,
+ _cursor_position: Point,
+ ) -> Self::Primitive {
+ Primitive::None
+ }
+}
diff --git a/wgpu/src/renderer/text.rs b/wgpu/src/renderer/text.rs
new file mode 100644
index 00000000..c89c0b3e
--- /dev/null
+++ b/wgpu/src/renderer/text.rs
@@ -0,0 +1,80 @@
+use crate::{Primitive, Renderer};
+use iced_native::{text, Color, Layout, Node, Style, Text};
+
+use wgpu_glyph::{GlyphCruncher, Section};
+
+use std::cell::RefCell;
+use std::f32;
+
+impl text::Renderer for Renderer {
+ fn node(&self, text: &Text) -> Node {
+ let glyph_brush = self.glyph_brush.clone();
+ let content = text.content.clone();
+
+ // TODO: Investigate why stretch tries to measure this MANY times
+ // with every ancestor's bounds.
+ // Bug? Using the library wrong? I should probably open an issue on
+ // the stretch repository.
+ // I noticed that the first measure is the one that matters in
+ // practice. Here, we use a RefCell to store the cached measurement.
+ let measure = RefCell::new(None);
+ let size = text.size.map(f32::from).unwrap_or(20.0);
+
+ let style = Style::default().width(text.width);
+
+ iced_native::Node::with_measure(style, move |bounds| {
+ let mut measure = measure.borrow_mut();
+
+ if measure.is_none() {
+ let bounds = (
+ match bounds.width {
+ iced_native::Number::Undefined => f32::INFINITY,
+ iced_native::Number::Defined(w) => w,
+ },
+ match bounds.height {
+ iced_native::Number::Undefined => f32::INFINITY,
+ iced_native::Number::Defined(h) => h,
+ },
+ );
+
+ let text = Section {
+ text: &content,
+ scale: wgpu_glyph::Scale { x: size, y: size },
+ bounds,
+ ..Default::default()
+ };
+
+ let (width, height) = if let Some(bounds) =
+ glyph_brush.borrow_mut().glyph_bounds(&text)
+ {
+ (bounds.width(), bounds.height())
+ } else {
+ (0.0, 0.0)
+ };
+
+ let size = iced_native::Size { width, height };
+
+ // If the text has no width boundary we avoid caching as the
+ // layout engine may just be measuring text in a row.
+ if bounds.0 == f32::INFINITY {
+ return size;
+ } else {
+ *measure = Some(size);
+ }
+ }
+
+ measure.unwrap()
+ })
+ }
+
+ fn draw(&mut self, text: &Text, layout: Layout<'_>) -> Self::Primitive {
+ Primitive::Text {
+ content: text.content.clone(),
+ size: f32::from(text.size.unwrap_or(20)),
+ bounds: layout.bounds(),
+ color: text.color.unwrap_or(Color::BLACK),
+ horizontal_alignment: text.horizontal_alignment,
+ vertical_alignment: text.vertical_alignment,
+ }
+ }
+}