bracket-terminal 0.8.7

ASCII/Codepage 437 terminal emulator with a game loop. Defaults to OpenGL, also support WebGPU (for Vulkan/Metal/WGPU), Curses and Crossterm for output. Part of the bracket-lib family.
Documentation
use bracket_color::prelude::*;
use parking_lot::Mutex;
use std::collections::HashMap;

pub struct CursesColor {
    rf: f32,
    gf: f32,
    bf: f32,
}

impl CursesColor {
    pub fn new(red: i16, green: i16, blue: i16) -> CursesColor {
        CursesColor {
            rf: red as f32 / 1000.0,
            gf: green as f32 / 1000.0,
            bf: blue as f32 / 1000.0,
        }
    }
}

lazy_static! {
    static ref COLOR_CACHE: Mutex<HashMap<u32, i16>> = Mutex::new(HashMap::new());
}

pub fn find_nearest_color(color: RGBA, map: &[CursesColor]) -> i16 {
    let key = (color.r * 255.0) as u32
        + (((color.g * 255.0) as u32) << 8u32)
        + (((color.b * 255.0) as u32) << 16u32)
        + (((color.a * 255.0) as u32) << 24u32);
    {
        let cache = COLOR_CACHE.lock();
        if let Some(col) = cache.get(&key) {
            return *col;
        }
    }

    let mut result = -1;
    let mut best_diff = std::f32::MAX;

    for (i, cc) in map.iter().enumerate() {
        let diff_r = f32::abs(color.r - cc.rf);
        let diff_g = f32::abs(color.g - cc.gf);
        let diff_b = f32::abs(color.b - cc.bf);
        let total_diff = diff_r + diff_g + diff_b;

        if total_diff < best_diff {
            result = i as i16;
            best_diff = total_diff;
        }
    }

    COLOR_CACHE.lock().insert(key, result);

    result
}