1- use anyrender:: { NullWindowRenderer , PaintScene , WindowRenderer } ;
1+ use anyrender:: { NullWindowRenderer , PaintScene , Scene , WindowRenderer } ;
2+ use anyrender_serialize:: SceneArchive ;
23use anyrender_skia:: SkiaWindowRenderer ;
34use anyrender_vello:: VelloWindowRenderer ;
45use anyrender_vello_cpu:: { PixelsWindowRenderer , SoftbufferWindowRenderer , VelloCpuImageRenderer } ;
56use anyrender_vello_hybrid:: VelloHybridWindowRenderer ;
67use kurbo:: { Affine , Circle , Point , Rect , Stroke } ;
78use peniko:: { Color , Fill } ;
8- use std:: sync:: Arc ;
9+ use std:: { path :: PathBuf , sync:: Arc } ;
910use winit:: {
1011 application:: ApplicationHandler ,
1112 event:: { ElementState , KeyEvent , WindowEvent } ,
@@ -16,6 +17,7 @@ use winit::{
1617
1718struct App {
1819 render_state : RenderState ,
20+ scene : Scene ,
1921 width : u32 ,
2022 height : u32 ,
2123}
@@ -119,30 +121,6 @@ impl App {
119121 }
120122 }
121123
122- fn draw_scene < T : PaintScene > ( scene : & mut T , color : Color ) {
123- scene. fill (
124- Fill :: NonZero ,
125- Affine :: IDENTITY ,
126- Color :: WHITE ,
127- None ,
128- & Rect :: new ( 0.0 , 0.0 , 50.0 , 50.0 ) ,
129- ) ;
130- scene. stroke (
131- & Stroke :: new ( 2.0 ) ,
132- Affine :: IDENTITY ,
133- Color :: BLACK ,
134- None ,
135- & Rect :: new ( 5.0 , 5.0 , 35.0 , 35.0 ) ,
136- ) ;
137- scene. fill (
138- Fill :: NonZero ,
139- Affine :: IDENTITY ,
140- color,
141- None ,
142- & Circle :: new ( Point :: new ( 20.0 , 20.0 ) , 10.0 ) ,
143- ) ;
144- }
145-
146124 fn set_backend < R : WindowRenderer + Into < Renderer > > (
147125 & mut self ,
148126 mut renderer : R ,
@@ -204,15 +182,23 @@ impl ApplicationHandler for App {
204182 }
205183 WindowEvent :: RedrawRequested => match renderer {
206184 Renderer :: Skia ( r) => {
207- r. render ( |p| App :: draw_scene ( p, Color :: from_rgb8 ( 128 , 128 , 128 ) ) )
185+ r. render ( |painter| painter. append_scene ( self . scene . clone ( ) , Affine :: IDENTITY ) )
186+ }
187+ Renderer :: Gpu ( r) => {
188+ r. render ( |painter| painter. append_scene ( self . scene . clone ( ) , Affine :: IDENTITY ) )
189+ }
190+ Renderer :: Hybrid ( r) => {
191+ r. render ( |painter| painter. append_scene ( self . scene . clone ( ) , Affine :: IDENTITY ) )
192+ }
193+ Renderer :: Cpu ( r) => {
194+ r. render ( |painter| painter. append_scene ( self . scene . clone ( ) , Affine :: IDENTITY ) )
208195 }
209- Renderer :: Gpu ( r) => r. render ( |p| App :: draw_scene ( p, Color :: from_rgb8 ( 255 , 0 , 0 ) ) ) ,
210- Renderer :: Hybrid ( r) => r. render ( |p| App :: draw_scene ( p, Color :: from_rgb8 ( 0 , 0 , 0 ) ) ) ,
211- Renderer :: Cpu ( r) => r. render ( |p| App :: draw_scene ( p, Color :: from_rgb8 ( 0 , 255 , 0 ) ) ) ,
212196 Renderer :: CpuSoftbuffer ( r) => {
213- r. render ( |p| App :: draw_scene ( p, Color :: from_rgb8 ( 0 , 0 , 255 ) ) )
197+ r. render ( |painter| painter. append_scene ( self . scene . clone ( ) , Affine :: IDENTITY ) )
198+ }
199+ Renderer :: Null ( r) => {
200+ r. render ( |painter| painter. append_scene ( self . scene . clone ( ) , Affine :: IDENTITY ) )
214201 }
215- Renderer :: Null ( r) => r. render ( |p| App :: draw_scene ( p, Color :: from_rgb8 ( 0 , 0 , 0 ) ) ) ,
216202 } ,
217203 WindowEvent :: KeyboardInput {
218204 event :
@@ -245,8 +231,20 @@ impl ApplicationHandler for App {
245231}
246232
247233fn main ( ) {
234+ let mut args = std:: env:: args_os ( ) ;
235+ let maybe_path = args. nth ( 1 ) . map ( |s| PathBuf :: from ( s) ) ;
236+
237+ let scene = if let Some ( path) = maybe_path {
238+ let file = std:: fs:: File :: open ( & path) . expect ( "File not found" ) ;
239+ let archive = SceneArchive :: deserialize ( file) . expect ( "Failed to deserialize archive" ) ;
240+ archive. to_scene ( ) . expect ( "Failed to convert archive to scene" )
241+ } else {
242+ default_scene ( )
243+ } ;
244+
248245 let mut app = App {
249246 render_state : RenderState :: Suspended ( None ) ,
247+ scene,
250248 width : 800 ,
251249 height : 600 ,
252250 } ;
@@ -256,3 +254,30 @@ fn main() {
256254 . run_app ( & mut app)
257255 . expect ( "Couldn't run event loop" ) ;
258256}
257+
258+ fn default_scene ( ) -> Scene {
259+ let mut scene = Scene :: new ( ) ;
260+ scene. fill (
261+ Fill :: NonZero ,
262+ Affine :: IDENTITY ,
263+ Color :: WHITE ,
264+ None ,
265+ & Rect :: new ( 0.0 , 0.0 , 50.0 , 50.0 ) ,
266+ ) ;
267+ scene. stroke (
268+ & Stroke :: new ( 2.0 ) ,
269+ Affine :: IDENTITY ,
270+ Color :: BLACK ,
271+ None ,
272+ & Rect :: new ( 5.0 , 5.0 , 35.0 , 35.0 ) ,
273+ ) ;
274+ scene. fill (
275+ Fill :: NonZero ,
276+ Affine :: IDENTITY ,
277+ Color :: from_rgb8 ( 255 , 0 , 0 ) ,
278+ None ,
279+ & Circle :: new ( Point :: new ( 20.0 , 20.0 ) , 10.0 ) ,
280+ ) ;
281+
282+ scene
283+ }
0 commit comments