Factor out color handling into common module.
This commit is contained in:
parent
e15ac35f18
commit
610c864cd9
@ -5,64 +5,14 @@ use std::iter::repeat;
|
|||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug)]
|
use pixelfoo::color::Color;
|
||||||
struct Color(u8, u8, u8);
|
|
||||||
|
|
||||||
impl Color {
|
|
||||||
fn black() -> Color {
|
|
||||||
Color(0, 0, 0)
|
|
||||||
}
|
|
||||||
fn white() -> Color {
|
|
||||||
Color(255, 255, 255)
|
|
||||||
}
|
|
||||||
fn gray50() -> Color {
|
|
||||||
Color(128, 128, 128)
|
|
||||||
}
|
|
||||||
fn red() -> Color {
|
|
||||||
Color(255, 0, 0)
|
|
||||||
}
|
|
||||||
fn green() -> Color {
|
|
||||||
Color(0, 255, 0)
|
|
||||||
}
|
|
||||||
fn blue() -> Color {
|
|
||||||
Color(0, 0, 255)
|
|
||||||
}
|
|
||||||
fn yellow() -> Color {
|
|
||||||
Color(255, 255, 0)
|
|
||||||
}
|
|
||||||
fn cyan() -> Color {
|
|
||||||
Color(0, 255, 255)
|
|
||||||
}
|
|
||||||
fn magenta() -> Color {
|
|
||||||
Color(255, 0, 255)
|
|
||||||
}
|
|
||||||
fn complement(&self) -> Color {
|
|
||||||
Color(255 - self.0, 255 - self.1, 255 - self.2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn interpolate_u8(b0: u8, b1: u8, a: f64) -> u8 {
|
|
||||||
let b0 = b0 as f64;
|
|
||||||
let b1 = b1 as f64;
|
|
||||||
((1.0 - a) * b0 + a * b1) as u8
|
|
||||||
}
|
|
||||||
|
|
||||||
fn interpolate(c0: Color, c1: Color, a: f64) -> Color {
|
|
||||||
Color(
|
|
||||||
interpolate_u8(c0.0, c1.0, a),
|
|
||||||
interpolate_u8(c0.1, c1.1, a),
|
|
||||||
interpolate_u8(c0.2, c1.2, a),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Frame = Vec<Vec<Color>>;
|
type Frame = Vec<Vec<Color>>;
|
||||||
|
|
||||||
fn send<T: Write>(w: &mut T, f: &Frame) -> std::io::Result<()> {
|
fn send<T: Write>(w: &mut T, f: &Frame) -> std::io::Result<()> {
|
||||||
for l in f {
|
for l in f {
|
||||||
for c in l {
|
for c in l {
|
||||||
let Color(r, g, b) = c;
|
w.write_all(&c.rgb())?;
|
||||||
let buf = &[*r, *g, *b];
|
|
||||||
w.write_all(buf)?;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
w.flush()
|
w.flush()
|
||||||
@ -109,7 +59,7 @@ fn main() -> std::io::Result<()> {
|
|||||||
|
|
||||||
eprint!("delta_a {}", delta_a);
|
eprint!("delta_a {}", delta_a);
|
||||||
loop {
|
loop {
|
||||||
let c0 = interpolate(previous_color, next_color, a);
|
let c0 = previous_color.interpolate(next_color, a);
|
||||||
let c1 = c0.complement();
|
let c1 = c0.complement();
|
||||||
let mut frame = repeat(repeat(c0).take(x_size).collect::<Vec<_>>())
|
let mut frame = repeat(repeat(c0).take(x_size).collect::<Vec<_>>())
|
||||||
.take(y_size)
|
.take(y_size)
|
||||||
|
@ -7,51 +7,7 @@ use std::time::Duration;
|
|||||||
use rand::thread_rng;
|
use rand::thread_rng;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug)]
|
use pixelfoo::color::Color;
|
||||||
struct Color(u8, u8, u8);
|
|
||||||
|
|
||||||
#[allow(unused)]
|
|
||||||
impl Color {
|
|
||||||
fn black() -> Color {
|
|
||||||
Color(0, 0, 0)
|
|
||||||
}
|
|
||||||
fn white() -> Color {
|
|
||||||
Color(255, 255, 255)
|
|
||||||
}
|
|
||||||
fn gray50() -> Color {
|
|
||||||
Color(128, 128, 128)
|
|
||||||
}
|
|
||||||
fn red() -> Color {
|
|
||||||
Color(255, 0, 0)
|
|
||||||
}
|
|
||||||
fn green() -> Color {
|
|
||||||
Color(0, 255, 0)
|
|
||||||
}
|
|
||||||
fn blue() -> Color {
|
|
||||||
Color(0, 0, 255)
|
|
||||||
}
|
|
||||||
fn yellow() -> Color {
|
|
||||||
Color(255, 255, 0)
|
|
||||||
}
|
|
||||||
fn cyan() -> Color {
|
|
||||||
Color(0, 255, 255)
|
|
||||||
}
|
|
||||||
fn magenta() -> Color {
|
|
||||||
Color(255, 0, 255)
|
|
||||||
}
|
|
||||||
fn brown() -> Color {
|
|
||||||
Color(210, 105, 30)
|
|
||||||
}
|
|
||||||
fn darkblue() -> Color {
|
|
||||||
Color(0, 0, 127)
|
|
||||||
}
|
|
||||||
fn darkbrown() -> Color {
|
|
||||||
Color(139, 69, 19)
|
|
||||||
}
|
|
||||||
fn complement(&self) -> Color {
|
|
||||||
Color(255 - self.0, 255 - self.1, 255 - self.2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
enum Square {
|
enum Square {
|
||||||
@ -67,15 +23,14 @@ struct Board(Vec<Vec<Square>>);
|
|||||||
fn send<T: Write>(w: &mut T, board: &Board) -> std::io::Result<()> {
|
fn send<T: Write>(w: &mut T, board: &Board) -> std::io::Result<()> {
|
||||||
for line in &board.0 {
|
for line in &board.0 {
|
||||||
for square in line {
|
for square in line {
|
||||||
let Color(r, g, b) = match square {
|
let c = match square {
|
||||||
Square::Unknown => Color::black(),
|
Square::Unknown => Color::black(),
|
||||||
Square::Corridor => Color::yellow(),
|
Square::Corridor => Color::yellow(),
|
||||||
Square::Wall => Color::darkblue(),
|
Square::Wall => Color::darkblue(),
|
||||||
Square::Start => Color::red(),
|
Square::Start => Color::red(),
|
||||||
Square::Finish => Color::green(),
|
Square::Finish => Color::green(),
|
||||||
};
|
};
|
||||||
let buf = &[r, g, b];
|
w.write_all(&c.rgb())?;
|
||||||
w.write_all(buf)?;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
w.flush()
|
w.flush()
|
||||||
|
@ -8,42 +8,7 @@ use std::time::Duration;
|
|||||||
use rand::thread_rng;
|
use rand::thread_rng;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug)]
|
use pixelfoo::color::Color;
|
||||||
struct Color(u8, u8, u8);
|
|
||||||
|
|
||||||
#[allow(unused)]
|
|
||||||
impl Color {
|
|
||||||
fn black() -> Color {
|
|
||||||
Color(0, 0, 0)
|
|
||||||
}
|
|
||||||
fn white() -> Color {
|
|
||||||
Color(255, 255, 255)
|
|
||||||
}
|
|
||||||
fn gray50() -> Color {
|
|
||||||
Color(128, 128, 128)
|
|
||||||
}
|
|
||||||
fn red() -> Color {
|
|
||||||
Color(255, 0, 0)
|
|
||||||
}
|
|
||||||
fn green() -> Color {
|
|
||||||
Color(0, 255, 0)
|
|
||||||
}
|
|
||||||
fn blue() -> Color {
|
|
||||||
Color(0, 0, 255)
|
|
||||||
}
|
|
||||||
fn yellow() -> Color {
|
|
||||||
Color(255, 255, 0)
|
|
||||||
}
|
|
||||||
fn cyan() -> Color {
|
|
||||||
Color(0, 255, 255)
|
|
||||||
}
|
|
||||||
fn magenta() -> Color {
|
|
||||||
Color(255, 0, 255)
|
|
||||||
}
|
|
||||||
fn complement(&self) -> Color {
|
|
||||||
Color(255 - self.0, 255 - self.1, 255 - self.2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
enum Square {
|
enum Square {
|
||||||
@ -58,14 +23,13 @@ type Board = Vec<Vec<Square>>;
|
|||||||
fn send<T: Write>(w: &mut T, board: &Board) -> std::io::Result<()> {
|
fn send<T: Write>(w: &mut T, board: &Board) -> std::io::Result<()> {
|
||||||
for line in board {
|
for line in board {
|
||||||
for square in line {
|
for square in line {
|
||||||
let Color(r, g, b) = match square {
|
let c = match square {
|
||||||
Square::Empty => Color::blue(),
|
Square::Empty => Color::blue(),
|
||||||
Square::Grass => Color::green(),
|
Square::Grass => Color::green(),
|
||||||
Square::Rabbit => Color::yellow(),
|
Square::Rabbit => Color::yellow(),
|
||||||
Square::Fox => Color::red(),
|
Square::Fox => Color::red(),
|
||||||
};
|
};
|
||||||
let buf = &[r, g, b];
|
w.write_all(&c.rgb())?;
|
||||||
w.write_all(buf)?;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
w.flush()
|
w.flush()
|
||||||
|
63
src/color.rs
Normal file
63
src/color.rs
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
pub struct Color(u8, u8, u8);
|
||||||
|
|
||||||
|
#[allow(unused)]
|
||||||
|
impl Color {
|
||||||
|
pub fn black() -> Color {
|
||||||
|
Color(0, 0, 0)
|
||||||
|
}
|
||||||
|
pub fn white() -> Color {
|
||||||
|
Color(255, 255, 255)
|
||||||
|
}
|
||||||
|
pub fn gray50() -> Color {
|
||||||
|
Color(128, 128, 128)
|
||||||
|
}
|
||||||
|
pub fn red() -> Color {
|
||||||
|
Color(255, 0, 0)
|
||||||
|
}
|
||||||
|
pub fn green() -> Color {
|
||||||
|
Color(0, 255, 0)
|
||||||
|
}
|
||||||
|
pub fn blue() -> Color {
|
||||||
|
Color(0, 0, 255)
|
||||||
|
}
|
||||||
|
pub fn yellow() -> Color {
|
||||||
|
Color(255, 255, 0)
|
||||||
|
}
|
||||||
|
pub fn cyan() -> Color {
|
||||||
|
Color(0, 255, 255)
|
||||||
|
}
|
||||||
|
pub fn magenta() -> Color {
|
||||||
|
Color(255, 0, 255)
|
||||||
|
}
|
||||||
|
pub fn brown() -> Color {
|
||||||
|
Color(210, 105, 30)
|
||||||
|
}
|
||||||
|
pub fn darkblue() -> Color {
|
||||||
|
Color(0, 0, 127)
|
||||||
|
}
|
||||||
|
pub fn darkbrown() -> Color {
|
||||||
|
Color(139, 69, 19)
|
||||||
|
}
|
||||||
|
pub fn complement(&self) -> Color {
|
||||||
|
Color(255 - self.0, 255 - self.1, 255 - self.2)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rgb(&self) -> [u8; 3] {
|
||||||
|
[self.0, self.1, self.2]
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn interpolate(self, c: Color, a: f64) -> Color {
|
||||||
|
Color(
|
||||||
|
interpolate_u8(self.0, c.0, a),
|
||||||
|
interpolate_u8(self.1, c.1, a),
|
||||||
|
interpolate_u8(self.2, c.2, a),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn interpolate_u8(b0: u8, b1: u8, a: f64) -> u8 {
|
||||||
|
let b0 = b0 as f64;
|
||||||
|
let b1 = b1 as f64;
|
||||||
|
((1.0 - a) * b0 + a * b1) as u8
|
||||||
|
}
|
@ -1,7 +1 @@
|
|||||||
#[cfg(test)]
|
pub mod color;
|
||||||
mod tests {
|
|
||||||
#[test]
|
|
||||||
fn it_works() {
|
|
||||||
assert_eq!(2 + 2, 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user