From 8816176ca70e59f9ee07443daf636472e249204f Mon Sep 17 00:00:00 2001 From: saji Date: Fri, 2 Aug 2024 11:34:19 -0500 Subject: [PATCH] make lab conversion parallel; use hyab --- Cargo.lock | 1 + Cargo.toml | 1 + src/dither.rs | 11 +++++------ 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 024a7ff..ac1695c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1463,6 +1463,7 @@ dependencies = [ "mime", "minijinja", "palette", + "rayon", "rusqlite", "serde", "strum", diff --git a/Cargo.toml b/Cargo.toml index fee9c2f..153f925 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ linux-embedded-hal = { version = "0.4.0"} mime = "0.3.17" minijinja = "2.1.0" palette = "0.7.6" +rayon = "1.10.0" rusqlite = { version = "0.32.1", features = ["bundled"] } serde = { version = "1.0.204", features = ["derive"] } strum = { version = "0.26.3", features = ["derive"] } diff --git a/src/dither.rs b/src/dither.rs index 7ea316a..77ed2be 100644 --- a/src/dither.rs +++ b/src/dither.rs @@ -6,6 +6,7 @@ use tracing::instrument; use image::Rgb as imgRgb; use palette::color_difference::{Ciede2000, HyAb}; use palette::{cast::FromComponents, IntoColor, Lab, Srgb}; +use rayon::prelude::*; #[derive( strum::EnumString, strum::Display, Serialize, Deserialize, PartialEq, Eq, Debug, Clone, @@ -94,7 +95,7 @@ fn nearest_neighbor(input_color: Lab, palette: &[Lab]) -> (u8, Lab) { .map(|(idx, p_color)| { ( idx, - input_color.difference(*p_color), // this is CIEDIE2000 based and highly accurate. + input_color.hybrid_distance(*p_color), // this is CIEDIE2000 based and highly accurate. input_color - *p_color, ) }) @@ -214,11 +215,9 @@ impl<'a> Ditherer for ErrorDiffusion<'a> { // first, a view into the rgb components let srgb = <&[Srgb]>::from_components(&**img); let (xsize, ysize) = img.dimensions(); - // our destination buffer. - let mut temp_img: Vec = Vec::with_capacity((xsize * ysize) as usize); - for pix in srgb { - temp_img.push(pix.into_format().into_color()); - } + // our temporary buffer. we push the error here. + let mut temp_img: Vec = srgb.par_iter().map(|p| p.into_format().into_color()).collect(); + let lab_palette: Vec = output.palette.iter().map(|c| Lab::from_color(*c)).collect(); // TODO: rework this to make more sense.