use crossbeam_channel::Sender;
use fnv::FnvHashSet;
use super::{
super::{
error::Result,
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(
&self,
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(&self, 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(&self, layer: &Self::Prepared) -> Result<u64> {
Ok(layer.len().try_into().unwrap())
}
}