Fix SVG export in the demo; update `Cargo.lock`

This commit is contained in:
Patrick Walton 2019-06-25 11:32:26 -07:00
parent ff777f7995
commit 4cdded74b4
5 changed files with 38 additions and 22 deletions

39
Cargo.lock generated
View File

@ -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"

View File

@ -25,6 +25,9 @@ features = ["release_max_level_warn"]
[dependencies.pathfinder_content]
path = "../../content"
[dependencies.pathfinder_export]
path = "../../export"
[dependencies.pathfinder_geometry]
path = "../../geometry"

View File

@ -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<W> DemoApp<W> 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();
}
}
}

View File

@ -21,6 +21,7 @@ pub enum FileFormat {
pub trait Export {
fn export<W: Write>(&self, writer: &mut W, format: FileFormat) -> io::Result<()>;
}
impl Export for Scene {
fn export<W: Write>(&self, writer: &mut W, format: FileFormat) -> io::Result<()> {
match format {

View File

@ -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<E>(mut scene: Scene,
@ -98,6 +105,7 @@ fn scene_thread<E>(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<E>(mut scene: Scene,
enum MainToWorkerMsg {
ReplaceScene(Scene),
CopyScene(Sender<Scene>),
SetViewBox(RectF),
Build(BuildOptions, Box<dyn RenderCommandListener>)
Build(BuildOptions, Box<dyn RenderCommandListener>),
}
pub struct RenderCommandStream {