diff options
| author | Daniel Schadt <kingdread@gmx.de> | 2023-01-08 19:36:31 +0100 | 
|---|---|---|
| committer | Daniel Schadt <kingdread@gmx.de> | 2023-01-08 19:36:31 +0100 | 
| commit | 4b30bda722668bef4ba362b3e578f02dede0099b (patch) | |
| tree | 1d61601adbcc4795e624694951337bdd39bf8532 /src | |
| parent | 97894620cd648648bdeba62e9b35c84dcf0e1962 (diff) | |
| download | hittekaart-4b30bda722668bef4ba362b3e578f02dede0099b.tar.gz hittekaart-4b30bda722668bef4ba362b3e578f02dede0099b.tar.bz2 hittekaart-4b30bda722668bef4ba362b3e578f02dede0099b.zip  | |
add a progress bar
Diffstat (limited to 'src')
| -rw-r--r-- | src/layer.rs | 4 | ||||
| -rw-r--r-- | src/renderer.rs | 21 | 
2 files changed, 21 insertions, 4 deletions
diff --git a/src/layer.rs b/src/layer.rs index 465953d..1c14df3 100644 --- a/src/layer.rs +++ b/src/layer.rs @@ -121,6 +121,10 @@ impl<P: Pixel> TileLayer<P> {      pub fn pixels_mut(&mut self) -> impl Iterator<Item = &mut P> {          self.enumerate_pixels_mut().map(|x| x.2)      } + +    pub fn tile_count(&self) -> usize { +        self.tiles.len() +    }  }  impl TileLayer<Rgba<u8>> { diff --git a/src/renderer.rs b/src/renderer.rs index c523268..757019c 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -1,6 +1,7 @@  use std::{fs, mem, path::Path};  use color_eyre::eyre::{bail, Result}; +use indicatif::ProgressBar;  use image::{ImageBuffer, Luma, Pixel, Rgba, RgbaImage};  use nalgebra::{vector, Vector2};  use num_traits::identities::Zero; @@ -87,6 +88,9 @@ fn render_line<P: Pixel>(      let displacement = normal * thickness as f64;      let displacement = displacement.map(|x| x as i32); +    if displacement == vector![0, 0] { +        return; +    }      let polygon = [          unsigned_add(start, displacement),          unsigned_add(end, displacement), @@ -123,12 +127,12 @@ fn merge_heat_counter(base: &mut HeatCounter, overlay: &HeatCounter) {  }  fn colorize_tile(tile: &ImageBuffer<Luma<u32>, Vec<u32>>, max: u32) -> RgbaImage { -    let gradient = colorgrad::turbo(); +    let gradient = colorgrad::yl_or_rd();      let mut result = ImageBuffer::from_pixel(tile.width(), tile.height(), [0, 0, 0, 0].into());      for (x, y, pixel) in tile.enumerate_pixels() {          if pixel[0] > 0 {              let alpha = pixel[0] as f64 / max as f64; -            let color = gradient.at(alpha); +            let color = gradient.at(1.0 - alpha);              let target = result.get_pixel_mut(x, y);              *target = color.to_rgba8().into();          } @@ -159,6 +163,9 @@ pub fn lazy_colorization<P: AsRef<Path>>(layer: &HeatCounter, base_dir: P) -> Re      if max == 0 {          return Ok(());      } + +    let bar = ProgressBar::new(layer.tile_count().try_into().unwrap()); +      for (tile_x, tile_y, tile) in layer.enumerate_tiles() {          let colorized = colorize_tile(&tile, max);          let folder = base_dir.join(&tile_x.to_string()); @@ -170,7 +177,9 @@ pub fn lazy_colorization<P: AsRef<Path>>(layer: &HeatCounter, base_dir: P) -> Re          }          let file = folder.join(&format!("{tile_y}.png"));          layer::compress_png(&colorized, file)?; +        bar.inc(1);      } +    bar.finish();      Ok(())  } @@ -178,6 +187,8 @@ pub fn lazy_colorization<P: AsRef<Path>>(layer: &HeatCounter, base_dir: P) -> Re  pub fn render_heatcounter(zoom: u32, tracks: &[Vec<Coordinates>]) -> HeatCounter {      let size = 256 * 2u64.pow(zoom); +    let bar = ProgressBar::new(tracks.len().try_into().unwrap()); +      let mut heatcounter = TileLayer::from_pixel(size, size, [0].into());      for track in tracks { @@ -189,14 +200,16 @@ pub fn render_heatcounter(zoom: u32, tracks: &[Vec<Coordinates>]) -> HeatCounter              .collect::<Vec<_>>();          for point in points.iter() { -            render_circle(&mut layer, *point, 10, [1].into()); +            render_circle(&mut layer, *point, (zoom as u64 / 4).max(1), [1].into());          }          for (a, b) in points.iter().zip(points.iter().skip(1)) { -            render_line(&mut layer, *a, *b, 10, [1].into()); +            render_line(&mut layer, *a, *b, (zoom as u64 / 4).max(1), [1].into());          }          merge_heat_counter(&mut heatcounter, &layer); +        bar.inc(1);      } +    bar.finish();      heatcounter  }  | 
