diff --git a/Cargo.lock b/Cargo.lock index a3c1d17..441bab9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1773,11 +1773,11 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] name = "kurbo" version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7564e90fe3c0d5771e1f0bc95322b21baaeaa0d9213fa6a0b61c99f8b17b3bfb" +source = "git+https://github.com/linebender/kurbo?rev=868cd631beee6f787d63113a9eb72e8c005fa33c#868cd631beee6f787d63113a9eb72e8c005fa33c" dependencies = [ "arrayvec", "euclid", + "polycool", "serde", "smallvec", ] @@ -2576,6 +2576,21 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "player" +version = "0.1.0" +dependencies = [ + "anyrender", + "anyrender_serialize", + "anyrender_skia", + "anyrender_vello", + "anyrender_vello_cpu", + "anyrender_vello_hybrid", + "kurbo", + "peniko", + "winit", +] + [[package]] name = "png" version = "0.17.16" @@ -2628,6 +2643,14 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" +[[package]] +name = "polycool" +version = "0.4.0" +source = "git+https://github.com/linebender/kurbo?rev=868cd631beee6f787d63113a9eb72e8c005fa33c#868cd631beee6f787d63113a9eb72e8c005fa33c" +dependencies = [ + "arrayvec", +] + [[package]] name = "portable-atomic" version = "1.11.1" @@ -4661,20 +4684,6 @@ dependencies = [ "xkbcommon-dl", ] -[[package]] -name = "winit-example" -version = "0.1.0" -dependencies = [ - "anyrender", - "anyrender_skia", - "anyrender_vello", - "anyrender_vello_cpu", - "anyrender_vello_hybrid", - "kurbo", - "peniko", - "winit", -] - [[package]] name = "winnow" version = "0.7.13" diff --git a/Cargo.toml b/Cargo.toml index af1f6df..baf2dd4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ members = [ "crates/wgpu_context", "crates/pixels_window_renderer", "crates/softbuffer_window_renderer", - "examples/winit", + "examples/player", "examples/bunnymark", "examples/serialize", ] @@ -78,7 +78,8 @@ pollster = "0.4" # Dev-dependencies winit = { version = "0.30.2", features = ["rwh_06"] } -# [patch.crates-io] +[patch.crates-io] +kurbo = { git = "https://github.com/linebender/kurbo", rev = "868cd631beee6f787d63113a9eb72e8c005fa33c" } # vello = { path = "../vello/vello" } # vello_cpu = { path = "../vello/sparse_strips/vello_cpu" } # vello_hybrid = { path = "../vello/sparse_strips/vello_hybrid" } diff --git a/examples/winit/Cargo.toml b/examples/player/Cargo.toml similarity index 88% rename from examples/winit/Cargo.toml rename to examples/player/Cargo.toml index 14eb4b0..0640151 100644 --- a/examples/winit/Cargo.toml +++ b/examples/player/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "winit-example" +name = "player" version = "0.1.0" edition.workspace = true license.workspace = true @@ -10,6 +10,7 @@ kurbo = { workspace = true } winit = { workspace = true } peniko = { workspace = true } anyrender = { workspace = true } +anyrender_serialize = { workspace = true } anyrender_vello = { workspace = true } anyrender_skia = { workspace = true } anyrender_vello_hybrid = { workspace = true } diff --git a/examples/winit/src/main.rs b/examples/player/src/main.rs similarity index 78% rename from examples/winit/src/main.rs rename to examples/player/src/main.rs index b651707..fd08d50 100644 --- a/examples/winit/src/main.rs +++ b/examples/player/src/main.rs @@ -1,11 +1,12 @@ -use anyrender::{NullWindowRenderer, PaintScene, WindowRenderer}; +use anyrender::{NullWindowRenderer, PaintScene, Scene, WindowRenderer}; +use anyrender_serialize::SceneArchive; use anyrender_skia::SkiaWindowRenderer; use anyrender_vello::VelloWindowRenderer; use anyrender_vello_cpu::{PixelsWindowRenderer, SoftbufferWindowRenderer, VelloCpuImageRenderer}; use anyrender_vello_hybrid::VelloHybridWindowRenderer; use kurbo::{Affine, Circle, Point, Rect, Stroke}; use peniko::{Color, Fill}; -use std::sync::Arc; +use std::{path::PathBuf, sync::Arc}; use winit::{ application::ApplicationHandler, event::{ElementState, KeyEvent, WindowEvent}, @@ -16,6 +17,7 @@ use winit::{ struct App { render_state: RenderState, + scene: Scene, width: u32, height: u32, } @@ -119,30 +121,6 @@ impl App { } } - fn draw_scene(scene: &mut T, color: Color) { - scene.fill( - Fill::NonZero, - Affine::IDENTITY, - Color::WHITE, - None, - &Rect::new(0.0, 0.0, 50.0, 50.0), - ); - scene.stroke( - &Stroke::new(2.0), - Affine::IDENTITY, - Color::BLACK, - None, - &Rect::new(5.0, 5.0, 35.0, 35.0), - ); - scene.fill( - Fill::NonZero, - Affine::IDENTITY, - color, - None, - &Circle::new(Point::new(20.0, 20.0), 10.0), - ); - } - fn set_backend>( &mut self, mut renderer: R, @@ -204,15 +182,23 @@ impl ApplicationHandler for App { } WindowEvent::RedrawRequested => match renderer { Renderer::Skia(r) => { - r.render(|p| App::draw_scene(p, Color::from_rgb8(128, 128, 128))) + r.render(|painter| painter.append_scene(self.scene.clone(), Affine::IDENTITY)) + } + Renderer::Gpu(r) => { + r.render(|painter| painter.append_scene(self.scene.clone(), Affine::IDENTITY)) + } + Renderer::Hybrid(r) => { + r.render(|painter| painter.append_scene(self.scene.clone(), Affine::IDENTITY)) + } + Renderer::Cpu(r) => { + r.render(|painter| painter.append_scene(self.scene.clone(), Affine::IDENTITY)) } - Renderer::Gpu(r) => r.render(|p| App::draw_scene(p, Color::from_rgb8(255, 0, 0))), - Renderer::Hybrid(r) => r.render(|p| App::draw_scene(p, Color::from_rgb8(0, 0, 0))), - Renderer::Cpu(r) => r.render(|p| App::draw_scene(p, Color::from_rgb8(0, 255, 0))), Renderer::CpuSoftbuffer(r) => { - r.render(|p| App::draw_scene(p, Color::from_rgb8(0, 0, 255))) + r.render(|painter| painter.append_scene(self.scene.clone(), Affine::IDENTITY)) + } + Renderer::Null(r) => { + r.render(|painter| painter.append_scene(self.scene.clone(), Affine::IDENTITY)) } - Renderer::Null(r) => r.render(|p| App::draw_scene(p, Color::from_rgb8(0, 0, 0))), }, WindowEvent::KeyboardInput { event: @@ -245,8 +231,22 @@ impl ApplicationHandler for App { } fn main() { + let mut args = std::env::args_os(); + let maybe_path = args.nth(1).map(PathBuf::from); + + let scene = if let Some(path) = maybe_path { + let file = std::fs::File::open(&path).expect("File not found"); + let archive = SceneArchive::deserialize(file).expect("Failed to deserialize archive"); + archive + .to_scene() + .expect("Failed to convert archive to scene") + } else { + default_scene() + }; + let mut app = App { render_state: RenderState::Suspended(None), + scene, width: 800, height: 600, }; @@ -256,3 +256,30 @@ fn main() { .run_app(&mut app) .expect("Couldn't run event loop"); } + +fn default_scene() -> Scene { + let mut scene = Scene::new(); + scene.fill( + Fill::NonZero, + Affine::IDENTITY, + Color::WHITE, + None, + &Rect::new(0.0, 0.0, 50.0, 50.0), + ); + scene.stroke( + &Stroke::new(2.0), + Affine::IDENTITY, + Color::BLACK, + None, + &Rect::new(5.0, 5.0, 35.0, 35.0), + ); + scene.fill( + Fill::NonZero, + Affine::IDENTITY, + Color::from_rgb8(255, 0, 0), + None, + &Circle::new(Point::new(20.0, 20.0), 10.0), + ); + + scene +}