#[derive(Debug, Copy, Clone, Eq, PartialEq, Default, Hash)]
pub struct Color {
red: u8,
green: u8,
}
impl Color {
pub const OFF: Color = Color { red: 0, green: 0 };
pub const RED: Color = Color { red: 3, green: 0 };
pub const GREEN: Color = Color { red: 0, green: 3 };
pub const AMBER: Color = Color { red: 3, green: 3 };
pub const DIM_GREEN: Color = Color { red: 0, green: 1 };
pub const DIM_RED: Color = Color { red: 1, green: 0 };
pub const ORANGE: Color = Color { red: 3, green: 2 };
pub const YELLOW: Color = Color { red: 2, green: 3 };
pub const BLACK: Color = Color::OFF;
pub fn new(red: u8, green: u8) -> Color {
assert!(red < 4);
assert!(green < 4);
Color { red, green }
}
pub fn red(&self) -> u8 {
self.red
}
pub fn green(&self) -> u8 {
self.green
}
pub fn set_red(&mut self, red: u8) {
assert!(red < 4);
self.red = red
}
pub fn set_green(&mut self, green: u8) {
assert!(green < 4);
self.green = green
}
}
#[derive(Debug, Ord, PartialOrd, Eq, PartialEq, Hash, Copy, Clone)]
pub enum Brightness {
Off,
Low,
Medium,
Full,
}
#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone)]
#[repr(u8)]
pub enum Buffer {
A = 0,
B = 1,
}
#[derive(Debug, Hash, Eq, PartialEq, Copy, Clone)]
pub enum DoubleBufferingBehavior {
None,
Clear,
Copy,
}
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
pub struct DoubleBuffering {
pub copy: bool,
pub flash: bool,
pub edited_buffer: Buffer,
pub displayed_buffer: Buffer,
}
pub(crate) fn make_color_code(color: Color, dbb: DoubleBufferingBehavior) -> u8 {
let double_buffering_code = match dbb {
DoubleBufferingBehavior::None => 0b00,
DoubleBufferingBehavior::Copy => 0b01,
DoubleBufferingBehavior::Clear => 0b10,
};
(color.green << 4) | (double_buffering_code << 2) | color.red
}
pub(crate) fn make_color_code_loopable(color: Color, should_loop: bool) -> u8 {
((should_loop as u8) << 6) | (color.green() << 4) | color.red()
}