aboutsummaryrefslogtreecommitdiff
path: root/src/renderer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderer.rs')
-rw-r--r--src/renderer.rs41
1 files changed, 30 insertions, 11 deletions
diff --git a/src/renderer.rs b/src/renderer.rs
index 2f29828..de65da6 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -1,6 +1,9 @@
-use std::{fs, path::Path};
+use std::{fs, mem, path::Path, sync::mpsc, thread};
-use color_eyre::eyre::{bail, Result};
+use color_eyre::{
+ eyre::{bail, Result},
+ Report,
+};
use image::{ImageBuffer, Luma, Pixel, RgbaImage};
use nalgebra::{vector, Vector2};
use rayon::iter::ParallelIterator;
@@ -143,22 +146,38 @@ pub fn lazy_colorization<P: AsRef<Path>, F: Fn(usize) + Send + Sync>(
return Ok(());
}
- layer
- .into_parallel_tiles()
- .try_for_each(|(tile_x, tile_y, tile)| {
- let colorized = colorize_tile(&tile, max.into());
+ type Job = (u64, u64, Vec<u8>);
+ let (tx, rx) = mpsc::sync_channel::<Job>(30);
+
+ thread::scope(|s| {
+ let saver = s.spawn(move || loop {
+ let Ok((tile_x, tile_y, data)) = rx.recv() else { return Ok(()) };
let folder = base_dir.join(tile_x.to_string());
let metadata = folder.metadata();
match metadata {
- Err(_) => fs::create_dir_all(&folder)?,
+ Err(_) => fs::create_dir(&folder)?,
Ok(m) if !m.is_dir() => bail!("Output path is not a directory"),
_ => {}
}
let file = folder.join(format!("{tile_y}.png"));
- layer::compress_png(&colorized, file)?;
- progress_callback(1);
- Ok(())
- })?;
+ fs::write(file, data)?;
+ });
+
+ layer
+ .into_parallel_tiles()
+ .try_for_each(|(tile_x, tile_y, tile)| {
+ let colorized = colorize_tile(&tile, max.into());
+ let data = layer::compress_png_as_bytes(&colorized)?;
+ tx.send((tile_x, tile_y, data))?;
+ progress_callback(1);
+ Ok::<(), Report>(())
+ })?;
+
+ mem::drop(tx);
+ saver.join().unwrap()?;
+ Ok::<_, Report>(())
+ })?;
+
Ok(())
}