dithr 0.3.0

Buffer-first rust dithering and halftoning library.
Documentation
use super::{ordered_dither_in_place, DEFAULT_STRENGTH};
use crate::{
    core::{PixelLayout, Sample},
    data::maps::generate_void_and_cluster_64x64_flat,
    Buffer, QuantizeMode, Result,
};
use std::sync::OnceLock;

const VOID_CLUSTER_SIDE: usize = 64;
const VOID_CLUSTER_LEN: usize = VOID_CLUSTER_SIDE * VOID_CLUSTER_SIDE;

static VOID_CLUSTER_64X64_FLAT: OnceLock<[u16; VOID_CLUSTER_LEN]> = OnceLock::new();

pub fn void_and_cluster_in_place<S: Sample, L: PixelLayout>(
    buffer: &mut Buffer<'_, S, L>,
    mode: QuantizeMode<'_, S>,
) -> Result<()> {
    ordered_dither_in_place(
        buffer,
        mode,
        void_cluster_64x64_flat(),
        VOID_CLUSTER_SIDE,
        VOID_CLUSTER_SIDE,
        DEFAULT_STRENGTH,
    )
}

fn void_cluster_64x64_flat() -> &'static [u16; VOID_CLUSTER_LEN] {
    VOID_CLUSTER_64X64_FLAT.get_or_init(generate_void_and_cluster_64x64_flat)
}