aboutsummaryrefslogtreecommitdiff
path: root/src/renderer/tilehunt.rs
blob: f44644b01d329153f3ce8606d663ee155e9ca2ff (plain)
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())
    }
}