Skip to content

Commit 669d5a9

Browse files
committed
Add more backends to winit example
1 parent 9f54cd3 commit 669d5a9

File tree

2 files changed

+58
-24
lines changed

2 files changed

+58
-24
lines changed

examples/winit/Cargo.toml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ winit = { workspace = true }
1111
peniko = { workspace = true }
1212
wgpu = { workspace = true }
1313
anyrender = { workspace = true }
14-
anyrender_vello = { workspace = true }
15-
anyrender_vello_cpu = { workspace = true, features = ["pixels_window_renderer"] }
16-
14+
anyrender_vello = { workspace = true }
15+
anyrender_vello_cpu = { workspace = true, features = [
16+
"pixels_window_renderer",
17+
"softbuffer_window_renderer",
18+
] }

examples/winit/src/main.rs

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use anyrender::{PaintScene, WindowRenderer};
1+
use anyrender::{NullWindowRenderer, PaintScene, WindowRenderer};
22
use anyrender_vello::VelloWindowRenderer;
3-
use anyrender_vello_cpu::VelloCpuWindowRenderer;
3+
use anyrender_vello_cpu::{PixelsWindowRenderer, SoftbufferWindowRenderer, VelloCpuImageRenderer};
44
use kurbo::{Affine, Circle, Point, Rect, Stroke};
55
use peniko::{Color, Fill};
66
use std::sync::Arc;
@@ -18,23 +18,57 @@ struct App {
1818
height: u32,
1919
}
2020

21+
type VelloCpuSBWindowRenderer = SoftbufferWindowRenderer<VelloCpuImageRenderer>;
22+
type VelloCpuWindowRenderer = PixelsWindowRenderer<VelloCpuImageRenderer>;
23+
24+
// type InitialBackend = NullWindowRenderer;
25+
// type InitialBackend = VelloCpuWindowRenderer;
26+
type InitialBackend = VelloCpuSBWindowRenderer;
27+
// type InitialBackend = VelloWindowRenderer;
28+
2129
enum Renderer {
2230
Gpu(Box<VelloWindowRenderer>),
2331
Cpu(Box<VelloCpuWindowRenderer>),
32+
CpuSoftbuffer(Box<VelloCpuSBWindowRenderer>),
33+
Null(NullWindowRenderer),
34+
}
35+
impl From<VelloWindowRenderer> for Renderer {
36+
fn from(renderer: VelloWindowRenderer) -> Self {
37+
Self::Gpu(Box::new(renderer))
38+
}
39+
}
40+
impl From<VelloCpuWindowRenderer> for Renderer {
41+
fn from(renderer: VelloCpuWindowRenderer) -> Self {
42+
Self::Cpu(Box::new(renderer))
43+
}
44+
}
45+
impl From<VelloCpuSBWindowRenderer> for Renderer {
46+
fn from(renderer: VelloCpuSBWindowRenderer) -> Self {
47+
Self::CpuSoftbuffer(Box::new(renderer))
48+
}
49+
}
50+
impl From<NullWindowRenderer> for Renderer {
51+
fn from(renderer: NullWindowRenderer) -> Self {
52+
Self::Null(renderer)
53+
}
2454
}
2555

2656
impl Renderer {
2757
fn is_active(&self) -> bool {
2858
match self {
2959
Renderer::Gpu(r) => r.is_active(),
3060
Renderer::Cpu(r) => r.is_active(),
61+
Renderer::CpuSoftbuffer(r) => r.is_active(),
62+
Renderer::Null(r) => r.is_active(),
3163
}
3264
}
3365

3466
fn set_size(&mut self, w: u32, h: u32) {
3567
match self {
3668
Renderer::Gpu(r) => r.set_size(w, h),
3769
Renderer::Cpu(r) => r.set_size(w, h),
70+
Renderer::CpuSoftbuffer(r) => r.set_size(w, h),
71+
Renderer::Null(r) => r.set_size(w, h),
3872
}
3973
}
4074
}
@@ -89,19 +123,18 @@ impl App {
89123
);
90124
}
91125

92-
fn set_backend<R: WindowRenderer>(
126+
fn set_backend<R: WindowRenderer + Into<Renderer>>(
93127
&mut self,
94128
mut renderer: R,
95129
event_loop: &ActiveEventLoop,
96-
f: impl FnOnce(R) -> Renderer,
97130
) {
98131
let mut window = match &self.render_state {
99132
RenderState::Active { window, .. } => Some(window.clone()),
100133
RenderState::Suspended(cached_window) => cached_window.clone(),
101134
};
102135
let window = window.take().unwrap_or_else(|| {
103136
let attr = Window::default_attributes()
104-
.with_inner_size(winit::dpi::PhysicalSize::new(self.width, self.height))
137+
.with_inner_size(winit::dpi::LogicalSize::new(self.width, self.height))
105138
.with_resizable(true)
106139
.with_title("anyrender + winit demo")
107140
.with_visible(true)
@@ -110,10 +143,8 @@ impl App {
110143
});
111144

112145
renderer.resume(window.clone(), self.width, self.height);
113-
self.render_state = RenderState::Active {
114-
window,
115-
renderer: f(renderer),
116-
};
146+
let renderer = renderer.into();
147+
self.render_state = RenderState::Active { window, renderer };
117148
self.request_redraw();
118149
}
119150
}
@@ -126,9 +157,7 @@ impl ApplicationHandler for App {
126157
}
127158

128159
fn resumed(&mut self, event_loop: &ActiveEventLoop) {
129-
self.set_backend(VelloCpuWindowRenderer::new(), event_loop, |r| {
130-
Renderer::Cpu(Box::new(r))
131-
});
160+
self.set_backend(InitialBackend::new(), event_loop);
132161
}
133162

134163
fn window_event(
@@ -156,6 +185,10 @@ impl ApplicationHandler for App {
156185
WindowEvent::RedrawRequested => match renderer {
157186
Renderer::Gpu(r) => r.render(|p| App::draw_scene(p, Color::from_rgb8(255, 0, 0))),
158187
Renderer::Cpu(r) => r.render(|p| App::draw_scene(p, Color::from_rgb8(0, 255, 0))),
188+
Renderer::CpuSoftbuffer(r) => {
189+
r.render(|p| App::draw_scene(p, Color::from_rgb8(0, 0, 255)))
190+
}
191+
Renderer::Null(r) => r.render(|p| App::draw_scene(p, Color::from_rgb8(0, 0, 0))),
159192
},
160193
WindowEvent::KeyboardInput {
161194
event:
@@ -166,15 +199,14 @@ impl ApplicationHandler for App {
166199
},
167200
..
168201
} => match renderer {
169-
Renderer::Cpu(_) => {
170-
self.set_backend(VelloWindowRenderer::new(), event_loop, |r| {
171-
Renderer::Gpu(Box::new(r))
172-
});
202+
Renderer::Cpu(_) | Renderer::CpuSoftbuffer(_) => {
203+
self.set_backend(VelloWindowRenderer::new(), event_loop);
173204
}
174205
Renderer::Gpu(_) => {
175-
self.set_backend(VelloCpuWindowRenderer::new(), event_loop, |r| {
176-
Renderer::Cpu(Box::new(r))
177-
});
206+
self.set_backend(NullWindowRenderer::new(), event_loop);
207+
}
208+
Renderer::Null(_) => {
209+
self.set_backend(VelloCpuWindowRenderer::new(), event_loop);
178210
}
179211
},
180212
_ => {}
@@ -185,8 +217,8 @@ impl ApplicationHandler for App {
185217
fn main() {
186218
let mut app = App {
187219
render_state: RenderState::Suspended(None),
188-
width: 1024,
189-
height: 1024,
220+
width: 800,
221+
height: 600,
190222
};
191223

192224
let event_loop = EventLoop::new().unwrap();

0 commit comments

Comments
 (0)