aboutsummaryrefslogtreecommitdiff
path: root/src/tiling.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-10-17 22:57:16 +0200
committermetamuffin <metamuffin@disroot.org>2022-10-17 22:57:16 +0200
commitac18ff17a98236ace91ce7fd17e24a4756f3afdd (patch)
tree698d718202ee6eed7190bac0a0f20fc60aaaa8ab /src/tiling.rs
parent3baa2e9cb8f00be594fb90a74acc9972e3477c72 (diff)
downloadtrash-map-master.tar
trash-map-master.tar.bz2
trash-map-master.tar.zst
cache tilesHEADmaster
Diffstat (limited to 'src/tiling.rs')
-rw-r--r--src/tiling.rs30
1 files changed, 24 insertions, 6 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