const DEFAULT_BRIGHTNESS: u8 = 7;
const IDX_BRIGHTNESS: usize = 0;
const IDX_BLUE: usize = 1;
const IDX_GREEN: usize = 2;
const IDX_RED: usize = 3;
#[derive(Debug, Copy, Clone)]
pub struct Pixel {
value: [u8; 4], }
impl Pixel {
#[inline]
pub fn rgb(&self) -> (u8, u8, u8) {
(
self.value[IDX_RED],
self.value[IDX_GREEN],
self.value[IDX_BLUE],
)
}
#[inline]
pub fn set_rgb(&mut self, red: u8, green: u8, blue: u8) {
self.value[IDX_RED] = red;
self.value[IDX_GREEN] = green;
self.value[IDX_BLUE] = blue;
}
#[inline]
pub fn rgbb(&self) -> (u8, u8, u8, f32) {
(
self.value[IDX_RED],
self.value[IDX_GREEN],
self.value[IDX_BLUE],
f32::from(0b0001_1111 & self.value[IDX_BRIGHTNESS]) / 31.0,
)
}
#[inline]
pub fn set_rgbb(&mut self, red: u8, green: u8, blue: u8, brightness: f32) {
self.set_rgb(red, green, blue);
self.set_brightness(brightness);
}
#[inline]
pub fn red(&self) -> u8 {
self.value[IDX_RED]
}
#[inline]
pub fn set_red(&mut self, red: u8) {
self.value[IDX_RED] = red;
}
#[inline]
pub fn green(&self) -> u8 {
self.value[IDX_GREEN]
}
#[inline]
pub fn set_green(&mut self, green: u8) {
self.value[IDX_GREEN] = green;
}
#[inline]
pub fn blue(&self) -> u8 {
self.value[IDX_BLUE]
}
#[inline]
pub fn set_blue(&mut self, blue: u8) {
self.value[IDX_BLUE] = blue;
}
#[inline]
pub fn brightness(&self) -> f32 {
f32::from(0b0001_1111 & self.value[IDX_BRIGHTNESS]) / 31.0
}
#[inline]
pub fn set_brightness(&mut self, brightness: f32) {
self.value[IDX_BRIGHTNESS] = 0b1110_0000 | ((31.0 * brightness.max(0.0).min(1.0)) as u8);
}
#[inline]
pub fn clear(&mut self) {
self.set_rgb(0, 0, 0);
}
#[inline]
pub(crate) fn bytes(&self) -> &[u8] {
&self.value
}
}
impl Default for Pixel {
fn default() -> Self {
Self {
value: [0b1110_0000 | DEFAULT_BRIGHTNESS, 0, 0, 0],
}
}
}