From 3a0d34c0240f4421737a6a08761f99d6f8140d02 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 4 Mar 2023 05:37:11 +0100 Subject: Create `iced_widget` subcrate and re-organize the whole codebase --- renderer/src/compositor.rs | 133 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 renderer/src/compositor.rs (limited to 'renderer/src/compositor.rs') diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs new file mode 100644 index 00000000..0cdcb293 --- /dev/null +++ b/renderer/src/compositor.rs @@ -0,0 +1,133 @@ +use crate::core::Color; +use crate::graphics::compositor::{Information, SurfaceError}; +use crate::graphics::{Error, Viewport}; +use crate::{Backend, Renderer, Settings}; + +use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; + +pub enum Compositor { + Wgpu(iced_wgpu::window::Compositor), + TinySkia(iced_tiny_skia::window::Compositor), +} + +pub enum Surface { + Wgpu(iced_wgpu::window::Surface), + TinySkia(iced_tiny_skia::window::Surface), +} + +impl crate::graphics::Compositor for Compositor { + type Settings = Settings; + type Renderer = Renderer; + type Surface = Surface; + + fn new( + settings: Self::Settings, + _compatible_window: Option<&W>, + ) -> Result<(Self, Self::Renderer), Error> { + //let (compositor, backend) = iced_wgpu::window::compositor::new( + // iced_wgpu::Settings { + // default_font: settings.default_font, + // default_text_size: settings.default_text_size, + // antialiasing: settings.antialiasing, + // ..iced_wgpu::Settings::from_env() + // }, + // compatible_window, + //)?; + + //Ok(( + // Self::Wgpu(compositor), + // Renderer::new(Backend::Wgpu(backend)), + //)) + let (compositor, backend) = + iced_tiny_skia::window::compositor::new(iced_tiny_skia::Settings { + default_font: settings.default_font, + default_text_size: settings.default_text_size, + }); + + Ok(( + Self::TinySkia(compositor), + Renderer::new(Backend::TinySkia(backend)), + )) + } + + fn create_surface( + &mut self, + window: &W, + width: u32, + height: u32, + ) -> Surface { + match self { + Self::Wgpu(compositor) => { + Surface::Wgpu(compositor.create_surface(window, width, height)) + } + Self::TinySkia(compositor) => Surface::TinySkia( + compositor.create_surface(window, width, height), + ), + } + } + + fn configure_surface( + &mut self, + surface: &mut Surface, + width: u32, + height: u32, + ) { + match (self, surface) { + (Self::Wgpu(compositor), Surface::Wgpu(surface)) => { + compositor.configure_surface(surface, width, height); + } + (Self::TinySkia(compositor), Surface::TinySkia(surface)) => { + compositor.configure_surface(surface, width, height); + } + _ => unreachable!(), + } + } + + fn fetch_information(&self) -> Information { + match self { + Self::Wgpu(compositor) => compositor.fetch_information(), + Self::TinySkia(compositor) => compositor.fetch_information(), + } + } + + fn present>( + &mut self, + renderer: &mut Self::Renderer, + surface: &mut Self::Surface, + viewport: &Viewport, + background_color: Color, + overlay: &[T], + ) -> Result<(), SurfaceError> { + renderer.with_primitives(|backend, primitives| { + match (self, backend, surface) { + ( + Self::Wgpu(compositor), + Backend::Wgpu(backend), + Surface::Wgpu(surface), + ) => iced_wgpu::window::compositor::present( + compositor, + backend, + surface, + primitives, + viewport, + background_color, + overlay, + ), + ( + Self::TinySkia(compositor), + Backend::TinySkia(backend), + Surface::TinySkia(surface), + ) => iced_tiny_skia::window::compositor::present( + compositor, + backend, + surface, + primitives, + viewport, + background_color, + overlay, + ), + _ => unreachable!(), + } + }) + } +} -- cgit From 9b4bcd287a7f4822314e158990d1dc023d5aab51 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 6 Mar 2023 22:10:13 +0100 Subject: Introduce backend feature flags in `iced_renderer` --- renderer/src/compositor.rs | 112 +++++++++++++++++++++++++++++++++------------ 1 file changed, 82 insertions(+), 30 deletions(-) (limited to 'renderer/src/compositor.rs') diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index 0cdcb293..218e7e33 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -1,17 +1,21 @@ use crate::core::Color; use crate::graphics::compositor::{Information, SurfaceError}; use crate::graphics::{Error, Viewport}; -use crate::{Backend, Renderer, Settings}; +use crate::{Renderer, Settings}; use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; pub enum Compositor { + #[cfg(feature = "wgpu")] Wgpu(iced_wgpu::window::Compositor), + #[cfg(feature = "tiny-skia")] TinySkia(iced_tiny_skia::window::Compositor), } pub enum Surface { + #[cfg(feature = "wgpu")] Wgpu(iced_wgpu::window::Surface), + #[cfg(feature = "tiny-skia")] TinySkia(iced_tiny_skia::window::Surface), } @@ -22,32 +26,65 @@ impl crate::graphics::Compositor for Compositor { fn new( settings: Self::Settings, - _compatible_window: Option<&W>, + compatible_window: Option<&W>, ) -> Result<(Self, Self::Renderer), Error> { - //let (compositor, backend) = iced_wgpu::window::compositor::new( - // iced_wgpu::Settings { - // default_font: settings.default_font, - // default_text_size: settings.default_text_size, - // antialiasing: settings.antialiasing, - // ..iced_wgpu::Settings::from_env() - // }, - // compatible_window, - //)?; - - //Ok(( - // Self::Wgpu(compositor), - // Renderer::new(Backend::Wgpu(backend)), - //)) - let (compositor, backend) = - iced_tiny_skia::window::compositor::new(iced_tiny_skia::Settings { - default_font: settings.default_font, - default_text_size: settings.default_text_size, - }); - - Ok(( - Self::TinySkia(compositor), - Renderer::new(Backend::TinySkia(backend)), - )) + #[cfg(feature = "wgpu")] + let new_wgpu = |settings: Self::Settings, compatible_window| { + let (compositor, backend) = iced_wgpu::window::compositor::new( + iced_wgpu::Settings { + default_font: settings.default_font, + default_text_size: settings.default_text_size, + antialiasing: settings.antialiasing, + ..iced_wgpu::Settings::from_env() + }, + compatible_window, + )?; + + Ok(( + Self::Wgpu(compositor), + Renderer::new(crate::Backend::Wgpu(backend)), + )) + }; + + #[cfg(feature = "tiny-skia")] + let new_tiny_skia = |settings: Self::Settings, _compatible_window| { + let (compositor, backend) = iced_tiny_skia::window::compositor::new( + iced_tiny_skia::Settings { + default_font: settings.default_font, + default_text_size: settings.default_text_size, + }, + ); + + Ok(( + Self::TinySkia(compositor), + Renderer::new(crate::Backend::TinySkia(backend)), + )) + }; + + let fail = |_, _| Err(Error::GraphicsAdapterNotFound); + + let candidates = &[ + #[cfg(feature = "wgpu")] + new_wgpu, + #[cfg(feature = "tiny-skia")] + new_tiny_skia, + fail, + ]; + + let mut error = Error::GraphicsAdapterNotFound; + + for candidate in candidates { + match candidate(settings, compatible_window) { + Ok((compositor, renderer)) => { + return Ok((compositor, renderer)) + } + Err(new_error) => { + error = new_error; + } + } + } + + Err(error) } fn create_surface( @@ -57,9 +94,11 @@ impl crate::graphics::Compositor for Compositor { height: u32, ) -> Surface { match self { + #[cfg(feature = "wgpu")] Self::Wgpu(compositor) => { Surface::Wgpu(compositor.create_surface(window, width, height)) } + #[cfg(feature = "tiny-skia")] Self::TinySkia(compositor) => Surface::TinySkia( compositor.create_surface(window, width, height), ), @@ -73,19 +112,26 @@ impl crate::graphics::Compositor for Compositor { height: u32, ) { match (self, surface) { + #[cfg(feature = "wgpu")] (Self::Wgpu(compositor), Surface::Wgpu(surface)) => { compositor.configure_surface(surface, width, height); } + #[cfg(feature = "tiny-skia")] (Self::TinySkia(compositor), Surface::TinySkia(surface)) => { compositor.configure_surface(surface, width, height); } - _ => unreachable!(), + #[allow(unreachable_patterns)] + _ => panic!( + "The provided surface is not compatible with the compositor." + ), } } fn fetch_information(&self) -> Information { match self { + #[cfg(feature = "wgpu")] Self::Wgpu(compositor) => compositor.fetch_information(), + #[cfg(feature = "tiny-skia")] Self::TinySkia(compositor) => compositor.fetch_information(), } } @@ -100,9 +146,10 @@ impl crate::graphics::Compositor for Compositor { ) -> Result<(), SurfaceError> { renderer.with_primitives(|backend, primitives| { match (self, backend, surface) { + #[cfg(feature = "wgpu")] ( Self::Wgpu(compositor), - Backend::Wgpu(backend), + crate::Backend::Wgpu(backend), Surface::Wgpu(surface), ) => iced_wgpu::window::compositor::present( compositor, @@ -113,9 +160,10 @@ impl crate::graphics::Compositor for Compositor { background_color, overlay, ), + #[cfg(feature = "tiny-skia")] ( Self::TinySkia(compositor), - Backend::TinySkia(backend), + crate::Backend::TinySkia(backend), Surface::TinySkia(surface), ) => iced_tiny_skia::window::compositor::present( compositor, @@ -126,7 +174,11 @@ impl crate::graphics::Compositor for Compositor { background_color, overlay, ), - _ => unreachable!(), + #[allow(unreachable_patterns)] + _ => panic!( + "The provided renderer or surface are not compatible \ + with the compositor." + ), } }) } -- cgit From 42b2e9b007d49506c98d0242b8b061df3aa4228b Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 8 Apr 2023 06:44:46 +0200 Subject: Support `ICED_BACKEND` environment variable --- renderer/src/compositor.rs | 127 ++++++++++++++++++++++++++++++--------------- 1 file changed, 84 insertions(+), 43 deletions(-) (limited to 'renderer/src/compositor.rs') diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index 218e7e33..1ce13c7d 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -4,6 +4,7 @@ use crate::graphics::{Error, Viewport}; use crate::{Renderer, Settings}; use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; +use std::env; pub enum Compositor { #[cfg(feature = "wgpu")] @@ -28,53 +29,13 @@ impl crate::graphics::Compositor for Compositor { settings: Self::Settings, compatible_window: Option<&W>, ) -> Result<(Self, Self::Renderer), Error> { - #[cfg(feature = "wgpu")] - let new_wgpu = |settings: Self::Settings, compatible_window| { - let (compositor, backend) = iced_wgpu::window::compositor::new( - iced_wgpu::Settings { - default_font: settings.default_font, - default_text_size: settings.default_text_size, - antialiasing: settings.antialiasing, - ..iced_wgpu::Settings::from_env() - }, - compatible_window, - )?; - - Ok(( - Self::Wgpu(compositor), - Renderer::new(crate::Backend::Wgpu(backend)), - )) - }; - - #[cfg(feature = "tiny-skia")] - let new_tiny_skia = |settings: Self::Settings, _compatible_window| { - let (compositor, backend) = iced_tiny_skia::window::compositor::new( - iced_tiny_skia::Settings { - default_font: settings.default_font, - default_text_size: settings.default_text_size, - }, - ); - - Ok(( - Self::TinySkia(compositor), - Renderer::new(crate::Backend::TinySkia(backend)), - )) - }; - - let fail = |_, _| Err(Error::GraphicsAdapterNotFound); - - let candidates = &[ - #[cfg(feature = "wgpu")] - new_wgpu, - #[cfg(feature = "tiny-skia")] - new_tiny_skia, - fail, - ]; + let candidates = + Candidate::list_from_env().unwrap_or(Candidate::default_list()); let mut error = Error::GraphicsAdapterNotFound; for candidate in candidates { - match candidate(settings, compatible_window) { + match candidate.build(settings, compatible_window) { Ok((compositor, renderer)) => { return Ok((compositor, renderer)) } @@ -183,3 +144,83 @@ impl crate::graphics::Compositor for Compositor { }) } } + +enum Candidate { + Wgpu, + TinySkia, +} + +impl Candidate { + fn default_list() -> Vec { + vec![ + #[cfg(feature = "wgpu")] + Self::Wgpu, + #[cfg(feature = "tiny-skia")] + Self::TinySkia, + ] + } + + fn list_from_env() -> Option> { + let backends = env::var("ICED_BACKEND").ok()?; + + Some( + backends + .split(',') + .map(str::trim) + .map(|backend| match backend { + "wgpu" => Self::Wgpu, + "tiny-skia" => Self::TinySkia, + _ => panic!("unknown backend value: \"{backend}\""), + }) + .collect(), + ) + } + + fn build( + self, + settings: Settings, + compatible_window: Option<&W>, + ) -> Result<(Compositor, Renderer), Error> { + match self { + Self::Wgpu => { + if cfg!(feature = "wgpu") { + let (compositor, backend) = + iced_wgpu::window::compositor::new( + iced_wgpu::Settings { + default_font: settings.default_font, + default_text_size: settings.default_text_size, + antialiasing: settings.antialiasing, + ..iced_wgpu::Settings::from_env() + }, + compatible_window, + )?; + + return Ok(( + Compositor::Wgpu(compositor), + Renderer::new(crate::Backend::Wgpu(backend)), + )); + } else { + panic!("`wgpu` feature was not enabled in `iced_renderer`"); + } + } + Self::TinySkia => { + if cfg!(feature = "tiny-skia") { + let (compositor, backend) = + iced_tiny_skia::window::compositor::new( + iced_tiny_skia::Settings { + default_font: settings.default_font, + default_text_size: settings.default_text_size, + }, + ); + + Ok(( + Compositor::TinySkia(compositor), + Renderer::new(crate::Backend::TinySkia(backend)), + )) + } else { + panic!("`wgpu` feature was not enabled in `iced_renderer`"); + } + } + } + } +} -- cgit From c2249d2506585abac0f056c619a6dca1b05e8c46 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 8 Apr 2023 06:45:44 +0200 Subject: Fix copy-pasted panic description in `iced_renderer` --- renderer/src/compositor.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'renderer/src/compositor.rs') diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index 1ce13c7d..484d91eb 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -218,7 +218,7 @@ impl Candidate { Renderer::new(crate::Backend::TinySkia(backend)), )) } else { - panic!("`wgpu` feature was not enabled in `iced_renderer`"); + panic!("`tiny-skia` feature was not enabled in `iced_renderer`"); } } } -- cgit From e63cc181bddbdc0a5b9b091cfeee5e4343b3d906 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 26 Apr 2023 16:28:47 +0200 Subject: Fix `Candidate::build` in `compositor` of `iced_renderer` --- renderer/src/compositor.rs | 75 ++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 36 deletions(-) (limited to 'renderer/src/compositor.rs') diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index 484d91eb..e31c2bed 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -179,47 +179,50 @@ impl Candidate { fn build( self, settings: Settings, - compatible_window: Option<&W>, + _compatible_window: Option<&W>, ) -> Result<(Compositor, Renderer), Error> { match self { + #[cfg(feature = "wgpu")] Self::Wgpu => { - if cfg!(feature = "wgpu") { - let (compositor, backend) = - iced_wgpu::window::compositor::new( - iced_wgpu::Settings { - default_font: settings.default_font, - default_text_size: settings.default_text_size, - antialiasing: settings.antialiasing, - ..iced_wgpu::Settings::from_env() - }, - compatible_window, - )?; - - return Ok(( - Compositor::Wgpu(compositor), - Renderer::new(crate::Backend::Wgpu(backend)), - )); - } else { - panic!("`wgpu` feature was not enabled in `iced_renderer`"); - } + let (compositor, backend) = iced_wgpu::window::compositor::new( + iced_wgpu::Settings { + default_font: settings.default_font, + default_text_size: settings.default_text_size, + antialiasing: settings.antialiasing, + ..iced_wgpu::Settings::from_env() + }, + _compatible_window, + )?; + + Ok(( + Compositor::Wgpu(compositor), + Renderer::new(crate::Backend::Wgpu(backend)), + )) } + #[cfg(feature = "tiny-skia")] Self::TinySkia => { - if cfg!(feature = "tiny-skia") { - let (compositor, backend) = - iced_tiny_skia::window::compositor::new( - iced_tiny_skia::Settings { - default_font: settings.default_font, - default_text_size: settings.default_text_size, - }, - ); - - Ok(( - Compositor::TinySkia(compositor), - Renderer::new(crate::Backend::TinySkia(backend)), - )) - } else { - panic!("`tiny-skia` feature was not enabled in `iced_renderer`"); - } + let (compositor, backend) = + iced_tiny_skia::window::compositor::new( + iced_tiny_skia::Settings { + default_font: settings.default_font, + default_text_size: settings.default_text_size, + }, + ); + + Ok(( + Compositor::TinySkia(compositor), + Renderer::new(crate::Backend::TinySkia(backend)), + )) + } + #[cfg(not(feature = "wgpu"))] + Self::Wgpu => { + panic!("`wgpu` feature was not enabled in `iced_renderer`") + } + #[cfg(not(feature = "tiny-skia"))] + Self::TinySkia => { + panic!( + "`tiny-skia` feature was not enabled in `iced_renderer`" + ); } } } -- cgit From 9c63eb7df559e58b14188b4096e9bd206444bbf3 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 26 Apr 2023 16:46:27 +0200 Subject: Update `tiny-skia` and `resvg` --- renderer/src/compositor.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'renderer/src/compositor.rs') diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index e31c2bed..48ed4b1f 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -123,11 +123,10 @@ impl crate::graphics::Compositor for Compositor { ), #[cfg(feature = "tiny-skia")] ( - Self::TinySkia(compositor), + Self::TinySkia(_compositor), crate::Backend::TinySkia(backend), Surface::TinySkia(surface), ) => iced_tiny_skia::window::compositor::present( - compositor, backend, surface, primitives, -- cgit From dd04c0b070b60b15293892e2a7c284787d3d63b1 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 10 May 2023 22:21:31 +0200 Subject: Bundle `tiny-skia` backend together with `iced_renderer` --- renderer/src/compositor.rs | 80 +++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 47 deletions(-) (limited to 'renderer/src/compositor.rs') diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index 48ed4b1f..a353b8e4 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -7,17 +7,15 @@ use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; use std::env; pub enum Compositor { + TinySkia(iced_tiny_skia::window::Compositor), #[cfg(feature = "wgpu")] Wgpu(iced_wgpu::window::Compositor), - #[cfg(feature = "tiny-skia")] - TinySkia(iced_tiny_skia::window::Compositor), } pub enum Surface { + TinySkia(iced_tiny_skia::window::Surface), #[cfg(feature = "wgpu")] Wgpu(iced_wgpu::window::Surface), - #[cfg(feature = "tiny-skia")] - TinySkia(iced_tiny_skia::window::Surface), } impl crate::graphics::Compositor for Compositor { @@ -55,14 +53,13 @@ impl crate::graphics::Compositor for Compositor { height: u32, ) -> Surface { match self { + Self::TinySkia(compositor) => Surface::TinySkia( + compositor.create_surface(window, width, height), + ), #[cfg(feature = "wgpu")] Self::Wgpu(compositor) => { Surface::Wgpu(compositor.create_surface(window, width, height)) } - #[cfg(feature = "tiny-skia")] - Self::TinySkia(compositor) => Surface::TinySkia( - compositor.create_surface(window, width, height), - ), } } @@ -73,12 +70,11 @@ impl crate::graphics::Compositor for Compositor { height: u32, ) { match (self, surface) { - #[cfg(feature = "wgpu")] - (Self::Wgpu(compositor), Surface::Wgpu(surface)) => { + (Self::TinySkia(compositor), Surface::TinySkia(surface)) => { compositor.configure_surface(surface, width, height); } - #[cfg(feature = "tiny-skia")] - (Self::TinySkia(compositor), Surface::TinySkia(surface)) => { + #[cfg(feature = "wgpu")] + (Self::Wgpu(compositor), Surface::Wgpu(surface)) => { compositor.configure_surface(surface, width, height); } #[allow(unreachable_patterns)] @@ -90,10 +86,9 @@ impl crate::graphics::Compositor for Compositor { fn fetch_information(&self) -> Information { match self { + Self::TinySkia(compositor) => compositor.fetch_information(), #[cfg(feature = "wgpu")] Self::Wgpu(compositor) => compositor.fetch_information(), - #[cfg(feature = "tiny-skia")] - Self::TinySkia(compositor) => compositor.fetch_information(), } } @@ -107,13 +102,11 @@ impl crate::graphics::Compositor for Compositor { ) -> Result<(), SurfaceError> { renderer.with_primitives(|backend, primitives| { match (self, backend, surface) { - #[cfg(feature = "wgpu")] ( - Self::Wgpu(compositor), - crate::Backend::Wgpu(backend), - Surface::Wgpu(surface), - ) => iced_wgpu::window::compositor::present( - compositor, + Self::TinySkia(_compositor), + crate::Backend::TinySkia(backend), + Surface::TinySkia(surface), + ) => iced_tiny_skia::window::compositor::present( backend, surface, primitives, @@ -121,12 +114,13 @@ impl crate::graphics::Compositor for Compositor { background_color, overlay, ), - #[cfg(feature = "tiny-skia")] + #[cfg(feature = "wgpu")] ( - Self::TinySkia(_compositor), - crate::Backend::TinySkia(backend), - Surface::TinySkia(surface), - ) => iced_tiny_skia::window::compositor::present( + Self::Wgpu(compositor), + crate::Backend::Wgpu(backend), + Surface::Wgpu(surface), + ) => iced_wgpu::window::compositor::present( + compositor, backend, surface, primitives, @@ -154,7 +148,6 @@ impl Candidate { vec![ #[cfg(feature = "wgpu")] Self::Wgpu, - #[cfg(feature = "tiny-skia")] Self::TinySkia, ] } @@ -181,6 +174,20 @@ impl Candidate { _compatible_window: Option<&W>, ) -> Result<(Compositor, Renderer), Error> { match self { + Self::TinySkia => { + let (compositor, backend) = + iced_tiny_skia::window::compositor::new( + iced_tiny_skia::Settings { + default_font: settings.default_font, + default_text_size: settings.default_text_size, + }, + ); + + Ok(( + Compositor::TinySkia(compositor), + Renderer::new(crate::Backend::TinySkia(backend)), + )) + } #[cfg(feature = "wgpu")] Self::Wgpu => { let (compositor, backend) = iced_wgpu::window::compositor::new( @@ -198,31 +205,10 @@ impl Candidate { Renderer::new(crate::Backend::Wgpu(backend)), )) } - #[cfg(feature = "tiny-skia")] - Self::TinySkia => { - let (compositor, backend) = - iced_tiny_skia::window::compositor::new( - iced_tiny_skia::Settings { - default_font: settings.default_font, - default_text_size: settings.default_text_size, - }, - ); - - Ok(( - Compositor::TinySkia(compositor), - Renderer::new(crate::Backend::TinySkia(backend)), - )) - } #[cfg(not(feature = "wgpu"))] Self::Wgpu => { panic!("`wgpu` feature was not enabled in `iced_renderer`") } - #[cfg(not(feature = "tiny-skia"))] - Self::TinySkia => { - panic!( - "`tiny-skia` feature was not enabled in `iced_renderer`" - ); - } } } } -- cgit From 233196eb14b40f8bd5201ea0262571f82136ad53 Mon Sep 17 00:00:00 2001 From: Bingus Date: Sat, 25 Mar 2023 10:45:39 -0700 Subject: Added offscreen rendering support for wgpu & tiny-skia exposed with the window::screenshot command. --- renderer/src/compositor.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'renderer/src/compositor.rs') diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index a353b8e4..57317b28 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -136,6 +136,36 @@ impl crate::graphics::Compositor for Compositor { } }) } + + fn screenshot>( + &mut self, + renderer: &mut Self::Renderer, + surface: &mut Self::Surface, + viewport: &Viewport, + background_color: Color, + overlay: &[T], + ) -> Vec { + renderer.with_primitives(|backend, primitives| match (self, backend, surface) { + (Self::TinySkia(_compositor), crate::Backend::TinySkia(backend), Surface::TinySkia(surface)) => { + iced_tiny_skia::window::compositor::screenshot(surface, backend, primitives, viewport, background_color, overlay) + }, + #[cfg(feature = "wgpu")] + (Self::Wgpu(compositor), crate::Backend::Wgpu(backend), Surface::Wgpu(_)) => { + iced_wgpu::window::compositor::screenshot( + compositor, + backend, + primitives, + viewport, + background_color, + overlay, + ) + }, + #[allow(unreachable_patterns)] + _ => panic!( + "The provided renderer or backend are not compatible with the compositor." + ), + }) + } } enum Candidate { -- cgit From 0ae1baa37bd7b6607f79b33b8a6d8c5daafde0b2 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 22 Jun 2023 00:38:36 +0200 Subject: Introduce custom backend-specific primitives --- renderer/src/compositor.rs | 80 ++++++++++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 31 deletions(-) (limited to 'renderer/src/compositor.rs') diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index 57317b28..8b17a4b0 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -100,26 +100,28 @@ impl crate::graphics::Compositor for Compositor { background_color: Color, overlay: &[T], ) -> Result<(), SurfaceError> { - renderer.with_primitives(|backend, primitives| { - match (self, backend, surface) { - ( - Self::TinySkia(_compositor), - crate::Backend::TinySkia(backend), - Surface::TinySkia(surface), - ) => iced_tiny_skia::window::compositor::present( + match (self, renderer, surface) { + ( + Self::TinySkia(_compositor), + crate::Renderer::TinySkia(renderer), + Surface::TinySkia(surface), + ) => renderer.with_primitives(|backend, primitives| { + iced_tiny_skia::window::compositor::present( backend, surface, primitives, viewport, background_color, overlay, - ), - #[cfg(feature = "wgpu")] - ( - Self::Wgpu(compositor), - crate::Backend::Wgpu(backend), - Surface::Wgpu(surface), - ) => iced_wgpu::window::compositor::present( + ) + }), + #[cfg(feature = "wgpu")] + ( + Self::Wgpu(compositor), + crate::Renderer::Wgpu(renderer), + Surface::Wgpu(surface), + ) => renderer.with_primitives(|backend, primitives| { + iced_wgpu::window::compositor::present( compositor, backend, surface, @@ -127,14 +129,14 @@ impl crate::graphics::Compositor for Compositor { viewport, background_color, overlay, - ), - #[allow(unreachable_patterns)] - _ => panic!( - "The provided renderer or surface are not compatible \ + ) + }), + #[allow(unreachable_patterns)] + _ => panic!( + "The provided renderer or surface are not compatible \ with the compositor." - ), - } - }) + ), + } } fn screenshot>( @@ -145,12 +147,27 @@ impl crate::graphics::Compositor for Compositor { background_color: Color, overlay: &[T], ) -> Vec { - renderer.with_primitives(|backend, primitives| match (self, backend, surface) { - (Self::TinySkia(_compositor), crate::Backend::TinySkia(backend), Surface::TinySkia(surface)) => { - iced_tiny_skia::window::compositor::screenshot(surface, backend, primitives, viewport, background_color, overlay) - }, + match (self, renderer, surface) { + ( + Self::TinySkia(_compositor), + Renderer::TinySkia(renderer), + Surface::TinySkia(surface), + ) => renderer.with_primitives(|backend, primitives| { + iced_tiny_skia::window::compositor::screenshot( + surface, + backend, + primitives, + viewport, + background_color, + overlay, + ) + }), #[cfg(feature = "wgpu")] - (Self::Wgpu(compositor), crate::Backend::Wgpu(backend), Surface::Wgpu(_)) => { + ( + Self::Wgpu(compositor), + Renderer::Wgpu(renderer), + Surface::Wgpu(_), + ) => renderer.with_primitives(|backend, primitives| { iced_wgpu::window::compositor::screenshot( compositor, backend, @@ -159,12 +176,13 @@ impl crate::graphics::Compositor for Compositor { background_color, overlay, ) - }, + }), #[allow(unreachable_patterns)] _ => panic!( - "The provided renderer or backend are not compatible with the compositor." + "The provided renderer or backend are not compatible \ + with the compositor." ), - }) + } } } @@ -215,7 +233,7 @@ impl Candidate { Ok(( Compositor::TinySkia(compositor), - Renderer::new(crate::Backend::TinySkia(backend)), + Renderer::TinySkia(iced_tiny_skia::Renderer::new(backend)), )) } #[cfg(feature = "wgpu")] @@ -232,7 +250,7 @@ impl Candidate { Ok(( Compositor::Wgpu(compositor), - Renderer::new(crate::Backend::Wgpu(backend)), + Renderer::Wgpu(iced_wgpu::Renderer::new(backend)), )) } #[cfg(not(feature = "wgpu"))] -- cgit