Advertisement
cwchen

[Rust] The RGB getter of Color class.

Aug 28th, 2017
3,351
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.70 KB | None | 0 0
  1. impl Color {
  2.     pub fn rgb(& self) -> (u8, u8, u8) {
  3.         match *self {
  4.             Color::RGB{r, g, b} => (r, g, b),
  5.             Color::CMYK{c, m, y, k} => {
  6.                 ((255.0 * (1.0 - c) * (1.0 - k)) as u8,
  7.                  (255.0 * (1.0 - m) * (1.0 - k)) as u8,
  8.                  (255.0 * (1.0 - y) * (1.0 - k)) as u8)
  9.             }
  10.             Color::HSL{h, s, l} => {
  11.                 // Saturation == 0
  12.                 if f64::abs(s) < 1e-10 {
  13.                     return ((255.0 * l) as u8,
  14.                             (255.0 * l) as u8,
  15.                             (255.0 * l) as u8);
  16.                 }
  17.  
  18.                 let v2: f64;
  19.                 let v1: f64;
  20.  
  21.                 if l < 0.5 {
  22.                     v2 = l * (1.0 + s);
  23.                 } else {
  24.                     v2 = (l + s) - s * l
  25.                 }
  26.  
  27.                 v1 = 2.0 * l - v2;
  28.  
  29.                 ((255.0 * Self::hue2rgb(
  30.                     v1, v2, ((h as f64)/360.0 + 1.0/3.0))) as u8,
  31.                  (255.0 * Self::hue2rgb(
  32.                     v1, v2, (h as f64)/360.0)) as u8,
  33.                  (255.0 * Self::hue2rgb(
  34.                     v1, v2, ((h as f64)/360.0 - 1.0/3.0))) as u8)
  35.             }
  36.         }
  37.     }
  38. }
  39.  
  40. impl Color {
  41.     fn hue2rgb(v1: f64, v2: f64, h: f64) -> f64 {
  42.         let mut _h = h;
  43.         if _h < 0.0 {
  44.             _h += 1.0;
  45.         }
  46.  
  47.         if _h > 1.0 {
  48.             _h -= 1.0;
  49.         }
  50.  
  51.         if 6.0 * _h < 1.0 {
  52.             return v1 + (v2 - v1) * 6.0 * _h;
  53.         }
  54.  
  55.         if 2.0 * _h < 1.0 {
  56.             return v2;
  57.         }
  58.  
  59.         if 3.0 * _h < 2.0 {
  60.             return v1 + (v2 - v1) * ((2.0 / 3.0 - _h) * 6.0);
  61.         }
  62.  
  63.         v1
  64.     }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement