diff options
author | metamuffin <metamuffin@disroot.org> | 2022-10-17 22:57:16 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-10-17 22:57:16 +0200 |
commit | ac18ff17a98236ace91ce7fd17e24a4756f3afdd (patch) | |
tree | 698d718202ee6eed7190bac0a0f20fc60aaaa8ab | |
parent | 3baa2e9cb8f00be594fb90a74acc9972e3477c72 (diff) | |
download | trash-map-ac18ff17a98236ace91ce7fd17e24a4756f3afdd.tar trash-map-ac18ff17a98236ace91ce7fd17e24a4756f3afdd.tar.bz2 trash-map-ac18ff17a98236ace91ce7fd17e24a4756f3afdd.tar.zst |
-rw-r--r-- | src/tiling.rs | 30 | ||||
-rw-r--r-- | src/viewer/mod.rs | 2 |
2 files changed, 25 insertions, 7 deletions
diff --git a/src/tiling.rs b/src/tiling.rs index 8ab7fc3..9a58ebd 100644 --- a/src/tiling.rs +++ b/src/tiling.rs @@ -1,4 +1,8 @@ -use std::{fs::File, io::Read}; +use std::{ + fs::File, + io::Read, + path::{Path, PathBuf}, +}; use log::info; @@ -10,16 +14,30 @@ pub struct Tiler { impl Tiler { pub fn new(renderer: Renderer) -> Self { + std::fs::create_dir_all("tiles").unwrap(); Self { renderer } } - pub fn get_tile(&self, z: isize, x: isize, y: isize) -> Vec<u8> { + pub fn path(z: isize, x: isize, y: isize) -> PathBuf { + Path::new(&format!("tiles/{},{},{}.png", z, x, y)).to_path_buf() + } + + pub fn generate_tile(&self, z: isize, x: isize, y: isize) { info!("generating tile (zoom={z}, x={x}, y={z})"); let segment = self.renderer.render_segment(x, y); - segment - .save(format!("tiles/{},{},{}.png", z, x, y)) - .unwrap(); + segment.save(Tiler::path(z, x, y)).unwrap(); + } - let mut f = File::open(format!("tiles/{},{},{}.png", z, x, y)).unwrap(); + pub fn update_tile(&self, z: isize, x: isize, y: isize) { + // TODO check mtime of region + if Tiler::path(z, x, y).exists() { + return; // already generated + } + self.generate_tile(z, x, y) + } + + pub fn get_tile(&self, z: isize, x: isize, y: isize) -> Vec<u8> { + self.update_tile(z, x, y); + let mut f = File::open(Tiler::path(z, x, y)).unwrap(); let mut buf = Vec::new(); f.read_to_end(&mut buf).unwrap(); buf diff --git a/src/viewer/mod.rs b/src/viewer/mod.rs index a411c29..f898c30 100644 --- a/src/viewer/mod.rs +++ b/src/viewer/mod.rs @@ -18,7 +18,7 @@ pub fn serve_http(dimension: Dimension, bind: SocketAddr) { .and(tiler.clone()) .and_then(|z, x, y, tiler: Arc<Tiler>| async move { Ok::<_, Infallible>(warp::reply::with_header( - tiler.get_tile(z, x, y), + tiler.get_tile(z, x, y), // TODO consider using tokio::spawn_blocking so we dont block the event loop "content-type", "image/png", )) |