rusvid_effect 0.2.1

Collection of predefined image effects for rusvid
Documentation
use rusvid_core::pixel::Pixel;

const MULTIPLIER_RED: f32 = 0.299;
const MULTIPLIER_GREEN: f32 = 0.587;
const MULTIPLIER_BLUE: f32 = 0.114;

#[inline(always)]
pub fn transform(source: &Pixel) -> Pixel {
    let grayscale_value = (source.get_r() as f32 * MULTIPLIER_RED
        + source.get_g() as f32 * MULTIPLIER_GREEN
        + source.get_b() as f32 * MULTIPLIER_BLUE) as u8;

    Pixel::new(grayscale_value, grayscale_value, grayscale_value, source[3])
}

#[cfg(test)]
mod tests {
    use rusvid_core::pixel::Pixel;

    use super::transform;

    #[test]
    fn just_works() {
        let source = Pixel::new(255, 0, 0, 255);
        let result = transform(&source);
        assert!(!(source.get_r() == source.get_g() && source.get_r() == source.get_b()));
        assert!((result.get_r() == result.get_g() && result.get_r() == result.get_b()));
        assert_eq!(source.get_a(), result.get_a());
        assert_eq!(result.get_r(), 76);

        let source = Pixel::new(0, 255, 0, 255);
        let result = transform(&source);
        assert!(!(source.get_r() == source.get_g() && source.get_r() == source.get_b()));
        assert!((result.get_r() == result.get_g() && result.get_r() == result.get_b()));
        assert_eq!(source.get_a(), result.get_a());
        assert_eq!(result.get_r(), 149);

        let source = Pixel::new(0, 0, 255, 255);
        let result = transform(&source);
        assert!(!(source.get_r() == source.get_g() && source.get_r() == source.get_b()));
        assert!((result.get_r() == result.get_g() && result.get_r() == result.get_b()));
        assert_eq!(source.get_a(), result.get_a());
        assert_eq!(result.get_r(), 29);
    }
}