1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
//! Actual rendering functions for tile hunts.
use color_eyre::eyre::Result;
use crossbeam_channel::Sender;
use fnv::FnvHashSet;
use super::{
super::{
gpx::Coordinates,
layer::{TILE_HEIGHT, TILE_WIDTH},
},
RenderedTile,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Renderer;
impl super::Renderer for Renderer {
type Prepared = FnvHashSet<(u64, u64)>;
fn prepare(zoom: u32, tracks: &[Vec<Coordinates>], tick: Sender<()>) -> Result<Self::Prepared> {
let mut marked = FnvHashSet::default();
for track in tracks {
for point in track {
let merc = point.web_mercator(zoom);
let tile_x = merc.0 / TILE_WIDTH;
let tile_y = merc.1 / TILE_HEIGHT;
marked.insert((tile_x, tile_y));
}
tick.send(()).unwrap();
}
Ok(marked)
}
fn colorize(layer: Self::Prepared, tx: Sender<RenderedTile>) -> Result<()> {
static IMAGE_DATA: &[u8] = include_bytes!("tile-marked.png");
for (tile_x, tile_y) in layer {
tx.send(RenderedTile {
x: tile_x,
y: tile_y,
data: IMAGE_DATA.to_vec(),
})?;
}
Ok(())
}
fn tile_count(layer: &Self::Prepared) -> Result<u64> {
Ok(layer.len().try_into().unwrap())
}
}
|