commit
e46e0b0004
3 changed files with 159 additions and 0 deletions
@ -0,0 +1,3 @@ |
|||
|
|||
/target |
|||
**/*.rs.bk |
|||
@ -0,0 +1,7 @@ |
|||
[package] |
|||
name = "hello_fb" |
|||
version = "0.1.0" |
|||
authors = ["Nicolas Massé <nicolas.masse@itix.fr>"] |
|||
|
|||
[dependencies] |
|||
minifb = "*" |
|||
@ -0,0 +1,149 @@ |
|||
extern crate minifb; |
|||
|
|||
use minifb::{Key, WindowOptions, Window}; |
|||
|
|||
const WIDTH: usize = 360; |
|||
const HEIGHT: usize = 100; |
|||
|
|||
fn hsl_to_rgb(h: i32, s: f64, l: f64) -> u32 { |
|||
//println!("h: {}, s: {}, l: {}", h, s, l);
|
|||
let c: f64 = (1.0 - (2.0 * l - 1.0).abs()) * s; |
|||
let x: f64 = c * (1.0 - ((h as f64 / 60.0) % 2.0 - 1.0).abs()) as f64; |
|||
let m: f64 = l - c / 2.0; |
|||
//println!("c: {}, x: {}, m: {}", c, x, m);
|
|||
let (rp, gp, bp) = match h { |
|||
0...59 => (c, x, 0.0), |
|||
60...119 => (x, c, 0.0), |
|||
120...179 => (0.0, c, x), |
|||
180...239 => (0.0, x, c), |
|||
240...299 => (x, 0.0, c), |
|||
300...359 => (c, 0.0, x), |
|||
_ => (0.0, 0.0, 0.0) |
|||
}; |
|||
//println!("r': {}, g': {}, b': {}", rp, gp, bp);
|
|||
let (r, g, b) = ((rp + m) * 255.0, (gp + m) * 255.0, (bp + m) * 255.0); |
|||
//println!("r: {}, g: {}, b: {}", r, g, b);
|
|||
|
|||
b as u32 + ((g as u32) << 8) + ((r as u32) << 16) |
|||
} |
|||
|
|||
fn main() { |
|||
let mut buffer: Vec<u32> = vec![0; WIDTH * HEIGHT]; |
|||
|
|||
let mut window = Window::new("Test - ESC to exit", |
|||
WIDTH, |
|||
HEIGHT, |
|||
WindowOptions::default()).unwrap_or_else(|e| { |
|||
panic!("{}", e); |
|||
}); |
|||
|
|||
while window.is_open() && !window.is_key_down(Key::Escape) { |
|||
let s: f64 = 1.0; |
|||
|
|||
let mut count: i32 = 0; |
|||
for i in buffer.iter_mut() { |
|||
let h: i32 = count % 360; |
|||
let l: f64 = count as f64 / 36000.0; // see http://carols10cents.github.io/rust-conversion-reference/
|
|||
|
|||
*i = hsl_to_rgb(h, s, l); |
|||
count += 1; |
|||
} |
|||
|
|||
// We unwrap here as we want this code to exit if it fails. Real applications may want to handle this in a different way
|
|||
window.update_with_buffer(&buffer).unwrap(); |
|||
} |
|||
} |
|||
|
|||
/* |
|||
* Run unit tests with : |
|||
*
|
|||
* ```sh |
|||
* $ cargo test |
|||
* ``` |
|||
*/ |
|||
#[cfg(test)] |
|||
mod tests { |
|||
// Note this useful idiom: importing names from outer (for mod tests) scope.
|
|||
use super::*; |
|||
|
|||
// Test cases from https://www.rapidtables.com/convert/color/hsl-to-rgb.html
|
|||
#[test] |
|||
fn test_hsl_to_rgb_black() { |
|||
assert_eq!(hsl_to_rgb(0, 0.0, 0.0), 0x000000); // Black
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_white() { |
|||
assert_eq!(hsl_to_rgb(0, 0.0, 1.0), 0xFFFFFF); // White
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_red() { |
|||
assert_eq!(hsl_to_rgb(0, 1.0, 0.5), 0xFF0000); // Red
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_lime() { |
|||
assert_eq!(hsl_to_rgb(120, 1.0, 0.5), 0x00FF00); // Lime
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_blue() { |
|||
assert_eq!(hsl_to_rgb(240, 1.0, 0.5), 0x0000FF); // Blue
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_yellow() { |
|||
assert_eq!(hsl_to_rgb(60, 1.0, 0.5), 0xFFFF00); // Yellow
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_cyan() { |
|||
assert_eq!(hsl_to_rgb(180, 1.0, 0.5), 0x00FFFF); // Cyan
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_magenta() { |
|||
assert_eq!(hsl_to_rgb(300, 1.0, 0.5), 0xFF00FF); // Magenta
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_silver() { |
|||
assert_eq!(hsl_to_rgb(0, 0.0, 0.75), 0xC0C0C0); // Silver
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_gray() { |
|||
assert_eq!(hsl_to_rgb(0, 0.0, 0.5), 0x808080); // Gray
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_maroon() { |
|||
assert_eq!(hsl_to_rgb(0, 1.0, 0.25), 0x800000); // Maroon
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_olive() { |
|||
assert_eq!(hsl_to_rgb(60, 1.0, 0.25), 0x808000); // Olive
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_green() { |
|||
assert_eq!(hsl_to_rgb(120, 1.0, 0.25), 0x008000); // Green
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_purple() { |
|||
assert_eq!(hsl_to_rgb(300, 1.0, 0.25), 0x800080); // Purple
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_teal() { |
|||
assert_eq!(hsl_to_rgb(180, 1.0, 0.25), 0x008080); // Teal
|
|||
} |
|||
|
|||
#[test] |
|||
fn test_hsl_to_rgb_navy() { |
|||
assert_eq!(hsl_to_rgb(240, 1.0, 0.5), 0x000080); // Navy
|
|||
} |
|||
} |
|||
Loading…
Reference in new issue