diff --git a/Cargo.lock b/Cargo.lock index 8fe5c64a..2db21e83 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -357,6 +357,15 @@ name = "constant_time_eq" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "convert" +version = "0.1.0" +dependencies = [ + "pathfinder_export 0.1.0", + "pathfinder_svg 0.1.0", + "usvg 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "core-foundation" version = "0.6.4" @@ -1446,6 +1455,7 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "metal 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "pathfinder_content 0.1.0", + "pathfinder_export 0.1.0", "pathfinder_geometry 0.3.0", "pathfinder_gl 0.1.0", "pathfinder_gpu 0.1.0", @@ -1458,6 +1468,16 @@ dependencies = [ "usvg 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "pathfinder_export" +version = "0.1.0" +dependencies = [ + "deflate 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)", + "pathfinder_content 0.1.0", + "pathfinder_geometry 0.3.0", + "pathfinder_renderer 0.1.0", +] + [[package]] name = "pathfinder_geometry" version = "0.3.0" @@ -1537,16 +1557,6 @@ dependencies = [ "pathfinder_simd 0.3.0", ] -[[package]] -name = "pathfinder_pdf" -version = "0.1.0" -dependencies = [ - "deflate 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)", - "pathfinder_content 0.1.0", - "pathfinder_geometry 0.3.0", - "pathfinder_renderer 0.1.0", -] - [[package]] name = "pathfinder_renderer" version = "0.1.0" @@ -2127,15 +2137,6 @@ dependencies = [ "usvg 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "svg2pdf" -version = "0.1.0" -dependencies = [ - "pathfinder_pdf 0.1.0", - "pathfinder_svg 0.1.0", - "usvg 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "svgdom" version = "0.17.0" diff --git a/demo/common/Cargo.toml b/demo/common/Cargo.toml index b6aa30e5..bf6a270b 100644 --- a/demo/common/Cargo.toml +++ b/demo/common/Cargo.toml @@ -25,6 +25,9 @@ features = ["release_max_level_warn"] [dependencies.pathfinder_content] path = "../../content" +[dependencies.pathfinder_export] +path = "../../export" + [dependencies.pathfinder_geometry] path = "../../geometry" diff --git a/demo/common/src/lib.rs b/demo/common/src/lib.rs index e97231b2..408e8313 100644 --- a/demo/common/src/lib.rs +++ b/demo/common/src/lib.rs @@ -22,6 +22,7 @@ use crate::device::{GroundProgram, GroundVertexArray}; use crate::ui::{DemoUIModel, DemoUIPresenter, ScreenshotInfo, ScreenshotType, UIAction}; use crate::window::{Event, Keycode, SVGPath, Window, WindowSize}; use clap::{App, Arg}; +use pathfinder_export::{Export, FileFormat}; use pathfinder_geometry::vector::{Vector2F, Vector2I}; use pathfinder_geometry::rect::RectF; use pathfinder_geometry::transform2d::Transform2DF; @@ -38,7 +39,7 @@ use pathfinder_renderer::scene::Scene; use pathfinder_svg::BuiltSVG; use pathfinder_ui::{MousePosition, UIEvent}; use std::fs::File; -use std::io::{Read, Write}; +use std::io::{BufWriter, Read}; use std::path::PathBuf; use std::thread; use std::time::Duration; @@ -550,7 +551,8 @@ impl DemoApp where W: Window { } Some(ScreenshotInfo { kind: ScreenshotType::SVG, path }) => { // FIXME(pcwalton): This won't work on Android. - File::create(path).unwrap().write_all(&mut self.scene_proxy.as_svg()).unwrap(); + let mut writer = BufWriter::new(File::create(path).unwrap()); + self.scene_proxy.copy_scene().export(&mut writer, FileFormat::SVG).unwrap(); } } } diff --git a/export/src/lib.rs b/export/src/lib.rs index 4640c3c0..9ec0c31f 100644 --- a/export/src/lib.rs +++ b/export/src/lib.rs @@ -21,6 +21,7 @@ pub enum FileFormat { pub trait Export { fn export(&self, writer: &mut W, format: FileFormat) -> io::Result<()>; } + impl Export for Scene { fn export(&self, writer: &mut W, format: FileFormat) -> io::Result<()> { match format { diff --git a/renderer/src/concurrent/scene_proxy.rs b/renderer/src/concurrent/scene_proxy.rs index 9a1f16c5..075e25ce 100644 --- a/renderer/src/concurrent/scene_proxy.rs +++ b/renderer/src/concurrent/scene_proxy.rs @@ -89,6 +89,13 @@ impl SceneProxy { } renderer.end_scene(); } + + #[inline] + pub fn copy_scene(&self) -> Scene { + let (sender, receiver) = mpsc::channel(); + self.sender.send(MainToWorkerMsg::CopyScene(sender)).unwrap(); + receiver.recv().unwrap() + } } fn scene_thread(mut scene: Scene, @@ -98,6 +105,7 @@ fn scene_thread(mut scene: Scene, while let Ok(msg) = main_to_worker_receiver.recv() { match msg { MainToWorkerMsg::ReplaceScene(new_scene) => scene = new_scene, + MainToWorkerMsg::CopyScene(sender) => sender.send(scene.clone()).unwrap(), MainToWorkerMsg::SetViewBox(new_view_box) => scene.set_view_box(new_view_box), MainToWorkerMsg::Build(options, listener) => scene.build(options, listener, &executor) } @@ -106,8 +114,9 @@ fn scene_thread(mut scene: Scene, enum MainToWorkerMsg { ReplaceScene(Scene), + CopyScene(Sender), SetViewBox(RectF), - Build(BuildOptions, Box) + Build(BuildOptions, Box), } pub struct RenderCommandStream {