use nalgebra::Vector4;
use nalgebra::coordinates::XYZW;
pub trait Pixel: Clone + Copy + Send + Sync {
fn empty() -> Self;
fn with_alpha(self, alpha: f32) -> Self;
fn mul_alpha(self, alpha: f32) -> Self;
}
#[derive(Debug, Clone, Copy)]
#[repr(C)] pub struct RGBAf32Pixel {
pub r: f32,
pub g: f32,
pub b: f32,
pub a: f32,
}
impl Default for RGBAf32Pixel {
fn default() -> RGBAf32Pixel {
RGBAf32Pixel { r: 0.0, g: 0.0, b: 0.0, a: 1.0 }
}
}
impl Pixel for RGBAf32Pixel {
fn empty() -> RGBAf32Pixel {
RGBAf32Pixel { r: 0.0, g: 0.0, b: 0.0, a: 0.0 }
}
fn with_alpha(self, alpha: f32) -> RGBAf32Pixel {
RGBAf32Pixel { r: self.r, g: self.g, b: self.b, a: alpha }
}
fn mul_alpha(self, alpha: f32) -> RGBAf32Pixel {
RGBAf32Pixel { r: self.r, g: self.g, b: self.b, a: self.a * alpha }
}
}
impl Pixel for Vector4<f32> {
fn empty() -> Vector4<f32> {
Vector4::new(0.0, 0.0, 0.0, 0.0)
}
fn with_alpha(self, alpha: f32) -> Vector4<f32> {
let XYZW { x, y, z, .. } = *self;
Vector4::new(x, y, z, alpha)
}
fn mul_alpha(self, alpha: f32) -> Vector4<f32> {
let XYZW { x, y, z, w } = *self;
Vector4::new(x, y, z, w * alpha)
}
}