summaryrefslogtreecommitdiffstats
path: root/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'renderer')
-rw-r--r--renderer/Cargo.toml1
-rw-r--r--renderer/src/backend.rs100
-rw-r--r--renderer/src/compositor.rs68
-rw-r--r--renderer/src/lib.rs80
-rw-r--r--renderer/src/widget.rs11
5 files changed, 92 insertions, 168 deletions
diff --git a/renderer/Cargo.toml b/renderer/Cargo.toml
index 56e17209..a159978c 100644
--- a/renderer/Cargo.toml
+++ b/renderer/Cargo.toml
@@ -27,5 +27,4 @@ iced_wgpu.workspace = true
iced_wgpu.optional = true
log.workspace = true
-raw-window-handle.workspace = true
thiserror.workspace = true
diff --git a/renderer/src/backend.rs b/renderer/src/backend.rs
deleted file mode 100644
index 3f229b52..00000000
--- a/renderer/src/backend.rs
+++ /dev/null
@@ -1,100 +0,0 @@
-use crate::core::text;
-use crate::core::{Font, Point, Size};
-use crate::graphics::backend;
-
-use std::borrow::Cow;
-
-#[allow(clippy::large_enum_variant)]
-pub enum Backend {
- TinySkia(iced_tiny_skia::Backend),
- #[cfg(feature = "wgpu")]
- Wgpu(iced_wgpu::Backend),
-}
-
-macro_rules! delegate {
- ($backend:expr, $name:ident, $body:expr) => {
- match $backend {
- Self::TinySkia($name) => $body,
- #[cfg(feature = "wgpu")]
- Self::Wgpu($name) => $body,
- }
- };
-}
-
-impl backend::Text for Backend {
- const ICON_FONT: Font = Font::with_name("Iced-Icons");
- const CHECKMARK_ICON: char = '\u{f00c}';
- const ARROW_DOWN_ICON: char = '\u{e800}';
-
- fn default_font(&self) -> Font {
- delegate!(self, backend, backend.default_font())
- }
-
- fn default_size(&self) -> f32 {
- delegate!(self, backend, backend.default_size())
- }
-
- fn measure(
- &self,
- contents: &str,
- size: f32,
- line_height: text::LineHeight,
- font: Font,
- bounds: Size,
- shaping: text::Shaping,
- ) -> Size {
- delegate!(
- self,
- backend,
- backend.measure(contents, size, line_height, font, bounds, shaping)
- )
- }
-
- fn hit_test(
- &self,
- contents: &str,
- size: f32,
- line_height: text::LineHeight,
- font: Font,
- bounds: Size,
- shaping: text::Shaping,
- position: Point,
- nearest_only: bool,
- ) -> Option<text::Hit> {
- delegate!(
- self,
- backend,
- backend.hit_test(
- contents,
- size,
- line_height,
- font,
- bounds,
- shaping,
- position,
- nearest_only,
- )
- )
- }
-
- fn load_font(&mut self, font: Cow<'static, [u8]>) {
- delegate!(self, backend, backend.load_font(font));
- }
-}
-
-#[cfg(feature = "image")]
-impl backend::Image for Backend {
- fn dimensions(&self, handle: &crate::core::image::Handle) -> Size<u32> {
- delegate!(self, backend, backend.dimensions(handle))
- }
-}
-
-#[cfg(feature = "svg")]
-impl backend::Svg for Backend {
- fn viewport_dimensions(
- &self,
- handle: &crate::core::svg::Handle,
- ) -> Size<u32> {
- delegate!(self, backend, backend.viewport_dimensions(handle))
- }
-}
diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs
index d1500089..f10ed048 100644
--- a/renderer/src/compositor.rs
+++ b/renderer/src/compositor.rs
@@ -1,9 +1,8 @@
use crate::core::Color;
-use crate::graphics::compositor::{Information, SurfaceError};
+use crate::graphics::compositor::{Information, SurfaceError, Window};
use crate::graphics::{Error, Viewport};
use crate::{Renderer, Settings};
-use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle};
use std::env;
pub enum Compositor<Theme> {
@@ -15,7 +14,7 @@ pub enum Compositor<Theme> {
pub enum Surface {
TinySkia(iced_tiny_skia::window::Surface),
#[cfg(feature = "wgpu")]
- Wgpu(iced_wgpu::window::Surface),
+ Wgpu(iced_wgpu::window::Surface<'static>),
}
impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
@@ -23,20 +22,18 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
type Renderer = Renderer<Theme>;
type Surface = Surface;
- fn new<W: HasRawWindowHandle + HasRawDisplayHandle>(
+ fn new<W: Window + Clone>(
settings: Self::Settings,
- compatible_window: Option<&W>,
- ) -> Result<(Self, Self::Renderer), Error> {
+ compatible_window: W,
+ ) -> Result<Self, Error> {
let candidates =
Candidate::list_from_env().unwrap_or(Candidate::default_list());
let mut error = Error::GraphicsAdapterNotFound;
for candidate in candidates {
- match candidate.build(settings, compatible_window) {
- Ok((compositor, renderer)) => {
- return Ok((compositor, renderer))
- }
+ match candidate.build(settings, compatible_window.clone()) {
+ Ok(compositor) => return Ok(compositor),
Err(new_error) => {
error = new_error;
}
@@ -46,9 +43,21 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
Err(error)
}
- fn create_surface<W: HasRawWindowHandle + HasRawDisplayHandle>(
+ fn create_renderer(&self) -> Self::Renderer {
+ match self {
+ Compositor::TinySkia(compositor) => {
+ Renderer::TinySkia(compositor.create_renderer())
+ }
+ #[cfg(feature = "wgpu")]
+ Compositor::Wgpu(compositor) => {
+ Renderer::Wgpu(compositor.create_renderer())
+ }
+ }
+ }
+
+ fn create_surface<W: Window + Clone>(
&mut self,
- window: &W,
+ window: W,
width: u32,
height: u32,
) -> Surface {
@@ -216,28 +225,26 @@ impl Candidate {
)
}
- fn build<Theme, W: HasRawWindowHandle + HasRawDisplayHandle>(
+ fn build<Theme, W: Window>(
self,
settings: Settings,
- _compatible_window: Option<&W>,
- ) -> Result<(Compositor<Theme>, Renderer<Theme>), Error> {
+ _compatible_window: W,
+ ) -> Result<Compositor<Theme>, Error> {
match self {
Self::TinySkia => {
- let (compositor, backend) =
- iced_tiny_skia::window::compositor::new();
+ let compositor = iced_tiny_skia::window::compositor::new(
+ iced_tiny_skia::Settings {
+ default_font: settings.default_font,
+ default_text_size: settings.default_text_size,
+ },
+ _compatible_window,
+ );
- Ok((
- Compositor::TinySkia(compositor),
- Renderer::TinySkia(iced_tiny_skia::Renderer::new(
- backend,
- settings.default_font,
- settings.default_text_size,
- )),
- ))
+ Ok(Compositor::TinySkia(compositor))
}
#[cfg(feature = "wgpu")]
Self::Wgpu => {
- let (compositor, backend) = iced_wgpu::window::compositor::new(
+ let compositor = iced_wgpu::window::compositor::new(
iced_wgpu::Settings {
default_font: settings.default_font,
default_text_size: settings.default_text_size,
@@ -247,14 +254,7 @@ impl Candidate {
_compatible_window,
)?;
- Ok((
- Compositor::Wgpu(compositor),
- Renderer::Wgpu(iced_wgpu::Renderer::new(
- backend,
- settings.default_font,
- settings.default_text_size,
- )),
- ))
+ Ok(Compositor::Wgpu(compositor))
}
#[cfg(not(feature = "wgpu"))]
Self::Wgpu => {
diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs
index 7594d532..f2acfa00 100644
--- a/renderer/src/lib.rs
+++ b/renderer/src/lib.rs
@@ -1,6 +1,9 @@
#![forbid(rust_2018_idioms)]
#![deny(unsafe_code, unused_results, rustdoc::broken_intra_doc_links)]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
+#[cfg(feature = "wgpu")]
+pub use iced_wgpu as wgpu;
+
pub mod compositor;
#[cfg(feature = "geometry")]
@@ -19,9 +22,8 @@ pub use geometry::Geometry;
use crate::core::renderer;
use crate::core::text::{self, Text};
-use crate::core::{
- Background, Color, Font, Pixels, Point, Rectangle, Size, Vector,
-};
+use crate::core::{Background, Color, Font, Pixels, Point, Rectangle, Vector};
+use crate::graphics::text::Editor;
use crate::graphics::text::Paragraph;
use crate::graphics::Mesh;
@@ -149,6 +151,7 @@ impl<T> core::Renderer for Renderer<T> {
impl<T> text::Renderer for Renderer<T> {
type Font = Font;
type Paragraph = Paragraph;
+ type Editor = Editor;
const ICON_FONT: Font = iced_tiny_skia::Renderer::<T>::ICON_FONT;
const CHECKMARK_ICON: char = iced_tiny_skia::Renderer::<T>::CHECKMARK_ICON;
@@ -163,36 +166,35 @@ impl<T> text::Renderer for Renderer<T> {
delegate!(self, renderer, renderer.default_size())
}
- fn create_paragraph(&self, text: Text<'_, Self::Font>) -> Self::Paragraph {
- delegate!(self, renderer, renderer.create_paragraph(text))
+ fn load_font(&mut self, bytes: Cow<'static, [u8]>) {
+ delegate!(self, renderer, renderer.load_font(bytes));
}
- fn resize_paragraph(
- &self,
- paragraph: &mut Self::Paragraph,
- new_bounds: Size,
+ fn fill_paragraph(
+ &mut self,
+ paragraph: &Self::Paragraph,
+ position: Point,
+ color: Color,
+ clip_bounds: Rectangle,
) {
delegate!(
self,
renderer,
- renderer.resize_paragraph(paragraph, new_bounds)
+ renderer.fill_paragraph(paragraph, position, color, clip_bounds)
);
}
- fn load_font(&mut self, bytes: Cow<'static, [u8]>) {
- delegate!(self, renderer, renderer.load_font(bytes));
- }
-
- fn fill_paragraph(
+ fn fill_editor(
&mut self,
- text: &Self::Paragraph,
+ editor: &Self::Editor,
position: Point,
color: Color,
+ clip_bounds: Rectangle,
) {
delegate!(
self,
renderer,
- renderer.fill_paragraph(text, position, color)
+ renderer.fill_editor(editor, position, color, clip_bounds)
);
}
@@ -201,8 +203,13 @@ impl<T> text::Renderer for Renderer<T> {
text: Text<'_, Self::Font>,
position: Point,
color: Color,
+ clip_bounds: Rectangle,
) {
- delegate!(self, renderer, renderer.fill_text(text, position, color));
+ delegate!(
+ self,
+ renderer,
+ renderer.fill_text(text, position, color, clip_bounds)
+ );
}
}
@@ -210,18 +217,26 @@ impl<T> text::Renderer for Renderer<T> {
impl<T> crate::core::image::Renderer for Renderer<T> {
type Handle = crate::core::image::Handle;
- fn dimensions(&self, handle: &crate::core::image::Handle) -> Size<u32> {
+ fn dimensions(
+ &self,
+ handle: &crate::core::image::Handle,
+ ) -> core::Size<u32> {
delegate!(self, renderer, renderer.dimensions(handle))
}
- fn draw(&mut self, handle: crate::core::image::Handle, bounds: Rectangle) {
- delegate!(self, renderer, renderer.draw(handle, bounds));
+ fn draw(
+ &mut self,
+ handle: crate::core::image::Handle,
+ filter_method: crate::core::image::FilterMethod,
+ bounds: Rectangle,
+ ) {
+ delegate!(self, renderer, renderer.draw(handle, filter_method, bounds));
}
}
#[cfg(feature = "svg")]
impl<T> crate::core::svg::Renderer for Renderer<T> {
- fn dimensions(&self, handle: &crate::core::svg::Handle) -> Size<u32> {
+ fn dimensions(&self, handle: &crate::core::svg::Handle) -> core::Size<u32> {
delegate!(self, renderer, renderer.dimensions(handle))
}
@@ -247,6 +262,7 @@ impl<T> crate::graphics::geometry::Renderer for Renderer<T> {
crate::Geometry::TinySkia(primitive) => {
renderer.draw_primitive(primitive);
}
+ #[cfg(feature = "wgpu")]
crate::Geometry::Wgpu(_) => unreachable!(),
}
}
@@ -265,3 +281,23 @@ impl<T> crate::graphics::geometry::Renderer for Renderer<T> {
}
}
}
+
+#[cfg(feature = "wgpu")]
+impl<T> iced_wgpu::primitive::pipeline::Renderer for Renderer<T> {
+ fn draw_pipeline_primitive(
+ &mut self,
+ bounds: Rectangle,
+ primitive: impl wgpu::primitive::pipeline::Primitive,
+ ) {
+ match self {
+ Self::TinySkia(_renderer) => {
+ log::warn!(
+ "Custom shader primitive is unavailable with tiny-skia."
+ );
+ }
+ Self::Wgpu(renderer) => {
+ renderer.draw_pipeline_primitive(bounds, primitive);
+ }
+ }
+ }
+}
diff --git a/renderer/src/widget.rs b/renderer/src/widget.rs
deleted file mode 100644
index 6c0c2a83..00000000
--- a/renderer/src/widget.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-#[cfg(feature = "canvas")]
-pub mod canvas;
-
-#[cfg(feature = "canvas")]
-pub use canvas::Canvas;
-
-#[cfg(feature = "qr_code")]
-pub mod qr_code;
-
-#[cfg(feature = "qr_code")]
-pub use qr_code::QRCode;