pub mod color;
pub mod ditherer;
mod error;
mod img;
mod opts;
pub mod prelude;
pub use self::error::Error;
pub use self::error::Result;
use self::prelude::*;
#[cfg(test)]
mod tests;
pub fn create_quantize_n_bits_func(n: u8) -> Result<impl Fn(f64) -> (f64, f64)> {
if n == 0 || n > 7 {
Err(Error::BadBitDepth(n))
} else {
Ok(move |x: f64| {
let step_size = 255. / f64::from(n);
let floor = f64::floor(x / step_size) * step_size;
let floor_rem = x - floor;
let ceil = f64::ceil(x / step_size) * step_size;
let ceil_rem = ceil - x;
if floor_rem < ceil_rem {
let quot = f64::max(floor, 0.0);
(quot, floor_rem)
} else {
let quot = f64::min(255.0, ceil);
(quot, -ceil_rem)
}
})
}
}
pub fn clamp_f64_to_u8(n: f64) -> u8 {
match n {
n if n > 255.0 => 255,
n if n < 0.0 => 0,
n => n.round() as u8,
}
}