Modularize iced_wgpu

This commit is contained in:
Héctor Ramón Jiménez 2019-10-05 19:22:51 +02:00
parent ae56edc8cc
commit 5a5ca34b5f
11 changed files with 394 additions and 353 deletions

View file

@ -0,0 +1,18 @@
use crate::{Primitive, Renderer};
use iced_native::{button, Button, Layout, Node, Point, Style};
impl button::Renderer for Renderer {
fn node<Message>(&self, _button: &Button<Message>) -> Node {
Node::new(Style::default())
}
fn draw<Message>(
&mut self,
_button: &Button<Message>,
_layout: Layout<'_>,
_cursor_position: Point,
) -> Self::Primitive {
// TODO
Primitive::None
}
}

View file

@ -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>(&mut 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
}
}

View file

@ -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(),
}
}
}

View file

@ -0,0 +1,16 @@
use crate::{Primitive, Renderer};
use iced_native::{image, Image, Layout, Node, Style};
impl image::Renderer<&str> for Renderer {
fn node(&mut self, _image: &Image<&str>) -> Node {
Node::new(Style::default())
}
fn draw(
&mut self,
_image: &Image<&str>,
_layout: Layout<'_>,
) -> Self::Primitive {
Primitive::None
}
}

View file

@ -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>(&mut 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
}
}

22
wgpu/src/renderer/row.rs Normal file
View file

@ -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(),
}
}
}

View file

@ -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
}
}

77
wgpu/src/renderer/text.rs Normal file
View file

@ -0,0 +1,77 @@
use crate::{Primitive, Renderer};
use iced_native::{text, 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(),
}
}
}