feim 0.25.1

Modular crate for working with images in Rust
Documentation
use super::convert::ConvertFrom;
use super::{Color, Zero};

#[derive(Copy, Clone, Debug)]
#[repr(C)]
pub struct NrgbaFloat {
    pub r: f32,
    pub g: f32,
    pub b: f32,
    pub a: f32,
}

impl Zero for NrgbaFloat {
    const ZERO: Self = Self {
        r: 0.0,
        g: 0.0,
        b: 0.0,
        a: 0.0,
    };
}

impl Color for NrgbaFloat {
    fn as_rgba(&self) -> (u32, u32, u32, u32) {
        let [r, g, b, a] =
            fast_srgb8::f32x4_to_srgb8([self.r, self.g, self.b, self.a]).map(|x| x as u32);

        let r = r | (r << 8);
        let g = g | (g << 8);
        let b = b | (b << 8);
        let a = a | (a << 8);

        (r, g, b, a)
    }
}

impl<C: Color> ConvertFrom<C> for NrgbaFloat {
    fn convert_from(c: C) -> NrgbaFloat {
        let (r, g, b, a) = c.as_rgba();
        NrgbaFloat {
            r: fast_srgb8::srgb8_to_f32(((r >> 8) & 0xff) as u8),
            g: fast_srgb8::srgb8_to_f32(((g >> 8) & 0xff) as u8),
            b: fast_srgb8::srgb8_to_f32(((b >> 8) & 0xff) as u8),
            a: fast_srgb8::srgb8_to_f32(((a >> 8) & 0xff) as u8),
        }
    }
}