use crate::quantize::quantizer::{Quantizer, QuantizerResult};
use crate::utils::color_utils::Argb;
use indexmap::IndexMap;
#[derive(Debug, Default)]
pub struct QuantizerMap {
color_to_count: Option<IndexMap<Argb, u32>>,
}
impl QuantizerMap {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub const fn color_to_count(&self) -> Option<&IndexMap<Argb, u32>> {
self.color_to_count.as_ref()
}
}
impl Quantizer for QuantizerMap {
fn quantize(&mut self, pixels: &[Argb], _max_colors: usize) -> QuantizerResult {
let mut pixel_by_count = IndexMap::new();
for &pixel in pixels {
*pixel_by_count.entry(pixel).or_insert(0) += 1;
}
self.color_to_count = Some(pixel_by_count.clone());
QuantizerResult::new(pixel_by_count)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_quantize_map() {
let mut quantizer = QuantizerMap::new();
let pixels = vec![Argb(0xFF0000FF), Argb(0xFF0000FF), Argb(0xFFFF0000)];
let result = quantizer.quantize(&pixels, 10);
assert_eq!(result.color_to_count.get(&Argb(0xFF0000FF)), Some(&2));
assert_eq!(result.color_to_count.get(&Argb(0xFFFF0000)), Some(&1));
assert_eq!(result.color_to_count.len(), 2);
}
}