1- use anyrender:: { PaintScene , WindowRenderer } ;
1+ use anyrender:: { NullWindowRenderer , PaintScene , WindowRenderer } ;
22use anyrender_vello:: VelloWindowRenderer ;
3- use anyrender_vello_cpu:: VelloCpuWindowRenderer ;
3+ use anyrender_vello_cpu:: { PixelsWindowRenderer , SoftbufferWindowRenderer , VelloCpuImageRenderer } ;
44use kurbo:: { Affine , Circle , Point , Rect , Stroke } ;
55use peniko:: { Color , Fill } ;
66use 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+
2129enum 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
2656impl 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 {
185217fn 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