Split local state from Engine in iced_wgpu

This commit is contained in:
Héctor Ramón Jiménez 2025-03-24 01:28:39 +01:00
parent 4b075b9731
commit 576dd22733
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
22 changed files with 768 additions and 641 deletions

View file

@ -1 +0,0 @@

View file

@ -3,7 +3,8 @@ use crate::core::image;
use crate::core::renderer;
use crate::core::svg;
use crate::core::{
self, Background, Color, Image, Point, Rectangle, Size, Svg, Transformation,
self, Background, Color, Font, Image, Pixels, Point, Rectangle, Size, Svg,
Transformation,
};
use crate::graphics;
use crate::graphics::compositor;
@ -353,29 +354,18 @@ where
}
}
fn screenshot<T: AsRef<str>>(
fn screenshot(
&mut self,
renderer: &mut Self::Renderer,
viewport: &graphics::Viewport,
background_color: Color,
overlay: &[T],
) -> Vec<u8> {
match (self, renderer) {
(Self::Primary(compositor), Renderer::Primary(renderer)) => {
compositor.screenshot(
renderer,
viewport,
background_color,
overlay,
)
compositor.screenshot(renderer, viewport, background_color)
}
(Self::Secondary(compositor), Renderer::Secondary(renderer)) => {
compositor.screenshot(
renderer,
viewport,
background_color,
overlay,
)
compositor.screenshot(renderer, viewport, background_color)
}
_ => unreachable!(),
}
@ -617,6 +607,41 @@ mod geometry {
}
}
impl<A, B> renderer::Headless for Renderer<A, B>
where
A: renderer::Headless,
B: renderer::Headless,
{
async fn new(
default_font: Font,
default_text_size: Pixels,
) -> Option<Self> {
if let Some(renderer) = A::new(default_font, default_text_size).await {
return Some(Self::Primary(renderer));
}
B::new(default_font, default_text_size)
.await
.map(Self::Secondary)
}
fn screenshot(
&mut self,
size: Size<u32>,
scale_factor: f32,
background_color: Color,
) -> Vec<u8> {
match self {
crate::fallback::Renderer::Primary(renderer) => {
renderer.screenshot(size, scale_factor, background_color)
}
crate::fallback::Renderer::Secondary(renderer) => {
renderer.screenshot(size, scale_factor, background_color)
}
}
}
}
impl<A, B> compositor::Default for Renderer<A, B>
where
A: compositor::Default,

View file

@ -23,9 +23,6 @@ pub type Compositor = renderer::Compositor;
#[cfg(all(feature = "wgpu", feature = "tiny-skia"))]
mod renderer {
use crate::core::renderer;
use crate::core::{Color, Font, Pixels, Size};
pub type Renderer = crate::fallback::Renderer<
iced_wgpu::Renderer,
iced_tiny_skia::Renderer,
@ -35,31 +32,6 @@ mod renderer {
iced_wgpu::window::Compositor,
iced_tiny_skia::window::Compositor,
>;
impl renderer::Headless for Renderer {
fn new(default_font: Font, default_text_size: Pixels) -> Self {
Self::Secondary(iced_tiny_skia::Renderer::new(
default_font,
default_text_size,
))
}
fn screenshot(
&mut self,
size: Size<u32>,
scale_factor: f32,
background_color: Color,
) -> Vec<u8> {
match self {
crate::fallback::Renderer::Primary(_) => unreachable!(
"iced_wgpu does not support headless mode yet!"
),
crate::fallback::Renderer::Secondary(renderer) => {
renderer.screenshot(size, scale_factor, background_color)
}
}
}
}
}
#[cfg(all(feature = "wgpu", not(feature = "tiny-skia")))]