gem 0.1.0-alpha.5

Color representations and conversions
macro_rules! impl_rgb_packed {
    (
        $ty:ident,
        red:  { shift: $rshift:expr, mask: $rmask:expr, clear: $rclear:expr },
        green:{ shift: $gshift:expr, mask: $gmask:expr, clear: $gclear:expr },
        blue: { shift: $bshift:expr, mask: $bmask:expr, clear: $bclear:expr }
    ) => {
        impl crate::rgb::HasRed for $ty {
            type Component = u8;

            fn red(&self) -> Self::Component {
                ((self.packed >> $rshift) & $rmask) as Self::Component
            }

            fn set_red(&mut self, value: Self::Component) {
                self.packed = (self.packed & $rclear) | ((u16::from(value) & $rmask) << $rshift);
            }
        }

        impl crate::rgb::HasGreen for $ty {
            type Component = u8;

            fn green(&self) -> Self::Component {
                ((self.packed >> $gshift) & $gmask) as Self::Component
            }

            fn set_green(&mut self, value: Self::Component) {
                self.packed = (self.packed & $gclear) | ((u16::from(value) & $gmask) << $gshift);
            }
        }

        impl crate::rgb::HasBlue for $ty {
            type Component = u8;

            fn blue(&self) -> Self::Component {
                ((self.packed >> $bshift) & $bmask) as Self::Component
            }

            fn set_blue(&mut self, value: Self::Component) {
                self.packed = (self.packed & $bclear) | ((u16::from(value) & $bmask) << $bshift);
            }
        }
    };
}

pub(crate) use impl_rgb_packed;

#[cfg(test)]
mod tests {
    use crate::rgb::{HasBlue, HasGreen, HasRed, Rgb565};

    #[test]
    fn set_red() {
        let mut color = Rgb565::from_rgb(0, 0, 0);
        color.set_red(15);
        assert_eq!(color.red(), 15);
    }

    #[test]
    fn set_green() {
        let mut color = Rgb565::from_rgb(0, 0, 0);
        color.set_green(15);
        assert_eq!(color.green(), 15);
    }

    #[test]
    fn set_blue() {
        let mut color = Rgb565::from_rgb(0, 0, 0);
        color.set_blue(15);
        assert_eq!(color.blue(), 15);
    }
}