feim 0.25.1

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

#[derive(Copy, Clone, Eq, PartialEq, Debug)]
#[repr(C)]
pub struct Nrgba {
    pub r: u8,
    pub g: u8,
    pub b: u8,
    pub a: u8,
}

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

impl Color for Nrgba {
    fn as_rgba(&self) -> (u32, u32, u32, u32) {
        let r = self.r as u32;
        let g = self.g as u32;
        let b = self.b as u32;
        let a = self.a 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 Nrgba {
    fn convert_from(c: C) -> Nrgba {
        let (r, g, b, a) = c.as_rgba();
        Nrgba {
            r: ((r >> 8) & 0xff) as u8,
            g: ((g >> 8) & 0xff) as u8,
            b: ((b >> 8) & 0xff) as u8,
            a: ((a >> 8) & 0xff) as u8,
        }
    }
}

impl From<Nrgba> for u32 {
    fn from(c: Nrgba) -> u32 {
        let r = c.r as u32;
        let g = (c.g as u32) << 8;
        let b = (c.b as u32) << (8 * 2);
        let a = (c.a as u32) << (8 * 3);
        r | g | b | a
    }
}

impl From<u32> for Nrgba {
    fn from(c: u32) -> Nrgba {
        let r = (c & 0xff) as u8;
        let g = ((c & 0xff00) >> 8) as u8;
        let b = ((c & 0xff0000) >> 16) as u8;
        let a = ((c & 0xff000000) >> 24) as u8;
        Nrgba { r, g, b, a }
    }
}