diff options
author | Daniel Schadt <kingdread@gmx.de> | 2025-06-26 22:10:31 +0200 |
---|---|---|
committer | Daniel Schadt <kingdread@gmx.de> | 2025-06-26 22:10:31 +0200 |
commit | 99150875308e0cac89f4de2996cfd1954305dcfe (patch) | |
tree | f19224064543aed367522b05778a992d7385c712 /src/renderer/mod.rs | |
parent | 6adcd94a6747fe7ec6f1ad1073453636847a0bff (diff) | |
download | hittekaart-99150875308e0cac89f4de2996cfd1954305dcfe.tar.gz hittekaart-99150875308e0cac89f4de2996cfd1954305dcfe.tar.bz2 hittekaart-99150875308e0cac89f4de2996cfd1954305dcfe.zip |
split crate into core and clipy
Diffstat (limited to 'src/renderer/mod.rs')
-rw-r--r-- | src/renderer/mod.rs | 99 |
1 files changed, 0 insertions, 99 deletions
diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs deleted file mode 100644 index 73c2e87..0000000 --- a/src/renderer/mod.rs +++ /dev/null @@ -1,99 +0,0 @@ -//! Generic "tile rendering" methods. -use std::thread; - -use color_eyre::Result; -use crossbeam_channel::Sender; - -use super::gpx::Coordinates; - -pub mod heatmap; -pub mod marktile; -pub mod tilehunt; - -const CHANNEL_SIZE: usize = 30; - -/// Represents a fully rendered tile. -#[derive(Debug, Clone)] -pub struct RenderedTile { - /// The `x` coordinate of the tile. - pub x: u64, - /// The `y` coordinate of the tile. - pub y: u64, - /// The encoded (PNG) image data, ready to be saved to disk. - pub data: Vec<u8>, -} - -/// An object that is responsible for turning raw GPX tracks into a representation. -/// -/// This is done in two steps, preparation and actual rendering. This allows different feedback for -/// the user. -pub trait Renderer: Send + Sync { - type Prepared: Send; - - /// Prepare the rendered data. - /// - /// The `tick` channel is used to provide user-feedback, for every finished track a tick should - /// be sent. - fn prepare( - &self, - zoom: u32, - tracks: &[Vec<Coordinates>], - tick: Sender<()>, - ) -> Result<Self::Prepared>; - - /// Actually produce the colored tiles, using the previously prepared data. - /// - /// The `saver` channel is used to send the finished tiles to a thread that is responsible for - /// saving them. - fn colorize(&self, prepared: Self::Prepared, saver: Sender<RenderedTile>) -> Result<()>; - - /// Returns the tile count of the prepared data. - /// - /// This is used for the user interface, to scale progress bars appropriately. - fn tile_count(&self, prepared: &Self::Prepared) -> Result<u64>; -} - -/// A convenience wrapper to call [`Renderer::prepare`]. -/// -/// This function takes the same arguments, but provides the ability to use a callback closure -/// instead of having to set up a channel. The callback is always called on the same thread. -pub fn prepare<R: Renderer, F: FnMut() -> Result<()>>( - renderer: &R, - zoom: u32, - tracks: &[Vec<Coordinates>], - mut tick: F, -) -> Result<R::Prepared> { - thread::scope(|s| { - let (sender, receiver) = crossbeam_channel::bounded(CHANNEL_SIZE); - - let preparer = s.spawn(|| renderer.prepare(zoom, tracks, sender)); - - for _ in receiver { - tick()?; - } - - preparer.join().unwrap() - }) -} - -/// A convenience wrapper to call [`Renderer::colorize`]. -/// -/// This function takes the same arguments, but provides the ability to use a callback closure -/// instead of having to set up a channel. The callback is always called on the same thread. -pub fn colorize<R: Renderer, F: FnMut(RenderedTile) -> Result<()>>( - renderer: &R, - prepared: R::Prepared, - mut saver: F, -) -> Result<()> { - thread::scope(|s| { - let (sender, receiver) = crossbeam_channel::bounded(CHANNEL_SIZE); - - let colorizer = s.spawn(|| renderer.colorize(prepared, sender)); - - for tile in receiver { - saver(tile)?; - } - - colorizer.join().unwrap() - }) -} |