Write a `.pf3` file
This commit is contained in:
parent
00fb5ca5de
commit
7400f0acf3
|
@ -1476,6 +1476,7 @@ name = "tile-svg"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"euclid 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"euclid 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"jemallocator 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"jemallocator 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|
|
@ -6,6 +6,7 @@ edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitflags = "1.0"
|
bitflags = "1.0"
|
||||||
|
byteorder = "1.2"
|
||||||
clap = "2.32"
|
clap = "2.32"
|
||||||
euclid = "0.19"
|
euclid = "0.19"
|
||||||
jemallocator = "0.1"
|
jemallocator = "0.1"
|
||||||
|
|
|
@ -16,6 +16,7 @@ extern crate quickcheck;
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
extern crate rand;
|
extern crate rand;
|
||||||
|
|
||||||
|
use byteorder::{LittleEndian, WriteBytesExt};
|
||||||
use clap::{App, Arg};
|
use clap::{App, Arg};
|
||||||
use euclid::{Point2D, Rect, Size2D, Transform2D};
|
use euclid::{Point2D, Rect, Size2D, Transform2D};
|
||||||
use jemallocator;
|
use jemallocator;
|
||||||
|
@ -28,6 +29,8 @@ use quick_xml::Reader;
|
||||||
use quick_xml::events::Event;
|
use quick_xml::events::Event;
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::fmt::{self, Debug, Formatter};
|
use std::fmt::{self, Debug, Formatter};
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::{self, BufWriter, Write};
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
@ -40,7 +43,7 @@ use svgtypes::{TransformListToken};
|
||||||
static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
|
static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
|
||||||
|
|
||||||
// TODO(pcwalton): Make this configurable.
|
// TODO(pcwalton): Make this configurable.
|
||||||
const SCALE_FACTOR: f32 = 8.0;
|
const SCALE_FACTOR: f32 = 1.0;
|
||||||
|
|
||||||
// TODO(pcwalton): Make this configurable.
|
// TODO(pcwalton): Make this configurable.
|
||||||
const FLATTENING_TOLERANCE: f32 = 3.0;
|
const FLATTENING_TOLERANCE: f32 = 3.0;
|
||||||
|
@ -63,10 +66,11 @@ fn main() {
|
||||||
Some(runs) => runs.parse().unwrap(),
|
Some(runs) => runs.parse().unwrap(),
|
||||||
None => 1,
|
None => 1,
|
||||||
};
|
};
|
||||||
let path = PathBuf::from(matches.value_of("INPUT").unwrap());
|
let input_path = PathBuf::from(matches.value_of("INPUT").unwrap());
|
||||||
|
let output_path = matches.value_of("OUTPUT").map(PathBuf::from);
|
||||||
|
|
||||||
let scene = Scene::from_path(&path);
|
let scene = Scene::from_path(&input_path);
|
||||||
println!("bounds: {:?}", scene.bounds);
|
println!("Scene bounds: {:?}", scene.bounds);
|
||||||
|
|
||||||
let start_time = Instant::now();
|
let start_time = Instant::now();
|
||||||
let mut built_scene = BuiltScene::new();
|
let mut built_scene = BuiltScene::new();
|
||||||
|
@ -74,11 +78,16 @@ fn main() {
|
||||||
built_scene = scene.build();
|
built_scene = scene.build();
|
||||||
}
|
}
|
||||||
let elapsed_time = Instant::now() - start_time;
|
let elapsed_time = Instant::now() - start_time;
|
||||||
|
|
||||||
let elapsed_ms = elapsed_time.as_secs() as f64 * 1000.0 +
|
let elapsed_ms = elapsed_time.as_secs() as f64 * 1000.0 +
|
||||||
elapsed_time.subsec_micros() as f64 / 1000.0;
|
elapsed_time.subsec_micros() as f64 / 1000.0;
|
||||||
println!("{:.3}ms elapsed", elapsed_ms / runs as f64);
|
println!("{:.3}ms elapsed", elapsed_ms / runs as f64);
|
||||||
println!("{} fill primitives generated", built_scene.fills.len());
|
println!("{} fill primitives generated", built_scene.fills.len());
|
||||||
println!("{} tiles generated", built_scene.tiles.len());
|
println!("{} tiles generated", built_scene.tiles.len());
|
||||||
|
|
||||||
|
if let Some(output_path) = output_path {
|
||||||
|
built_scene.write(&mut BufWriter::new(File::create(output_path).unwrap())).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -948,6 +957,40 @@ impl BuiltScene {
|
||||||
fn new() -> BuiltScene {
|
fn new() -> BuiltScene {
|
||||||
BuiltScene { fills: vec![], tiles: vec![] }
|
BuiltScene { fills: vec![], tiles: vec![] }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn write<W>(&self, writer: &mut W) -> io::Result<()> where W: Write {
|
||||||
|
writer.write_all(b"RIFF")?;
|
||||||
|
|
||||||
|
let fill_size = self.fills.len() * mem::size_of::<FillPrimitive>();
|
||||||
|
let tile_size = self.tiles.len() * mem::size_of::<TilePrimitive>();
|
||||||
|
writer.write_u32::<LittleEndian>((4 + 8 + tile_size + 8 + fill_size) as u32)?;
|
||||||
|
|
||||||
|
writer.write_all(b"PF3S")?;
|
||||||
|
|
||||||
|
writer.write_all(b"fill")?;
|
||||||
|
writer.write_u32::<LittleEndian>(fill_size as u32)?;
|
||||||
|
for fill_primitive in &self.fills {
|
||||||
|
write_point(writer, &fill_primitive.from)?;
|
||||||
|
write_point(writer, &fill_primitive.to)?;
|
||||||
|
writer.write_u32::<LittleEndian>(fill_primitive.tile_index)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.write_all(b"tile")?;
|
||||||
|
writer.write_u32::<LittleEndian>(tile_size as u32)?;
|
||||||
|
for tile_primitive in &self.tiles {
|
||||||
|
let color = tile_primitive.color;
|
||||||
|
write_point(writer, &tile_primitive.position)?;
|
||||||
|
writer.write_all(&[color.r, color.g, color.b, color.a]).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok(());
|
||||||
|
|
||||||
|
fn write_point<W>(writer: &mut W, point: &Point2D<f32>) -> io::Result<()> where W: Write {
|
||||||
|
writer.write_f32::<LittleEndian>(point.x)?;
|
||||||
|
writer.write_f32::<LittleEndian>(point.y)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TilePrimitive {
|
impl TilePrimitive {
|
||||||
|
|
Loading…
Reference in New Issue