tint-1.0.1/.gitignore01006440000765000002400000000036131356067630012707 0ustar0000000000000000target/ **/*.rs.bk Cargo.lock tint-1.0.1/Cargo.toml.orig01006440000765000002400000000537131706741620013611 0ustar0000000000000000[package] name = "tint" version = "1.0.1" authors = ["Brian Savage "] description = "Color creation and manipulation" repository = "https://github.com/savage13/tint" homepage = "https://github.com/savage13/tint" readme = "README.md" keywords = ["color", "colour", "rgb", "hsv"] license = "MIT" [dependencies] lazy_static = "0.2" tint-1.0.1/Cargo.toml0000644000000015610007031 0ustar00# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g. crates.io) dependencies # # If you believe there's an error in this file please file an # issue against the rust-lang/cargo repository. If you're # editing this file be aware that the upstream Cargo.toml # will likely look very different (and much more reasonable) [package] name = "tint" version = "1.0.1" authors = ["Brian Savage "] description = "Color creation and manipulation" homepage = "https://github.com/savage13/tint" readme = "README.md" keywords = ["color", "colour", "rgb", "hsv"] license = "MIT" repository = "https://github.com/savage13/tint" [dependencies.lazy_static] version = "0.2" tint-1.0.1/LICENSE01006440000765000002400000002051131706434010011710 0ustar0000000000000000MIT License Copyright (c) 2017 savage13 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. tint-1.0.1/README.md01006440000765000002400000003532131706517060012176 0ustar0000000000000000tint ==== Color creation and manipulation in rust ### Usage Add this to your `Cargo.toml`: ```toml [dependencies] tint = "1.0.0" ``` and this to your crate root: ```rust extern crate tint; ``` ### Example ```rust extern crate tint; use tint::Color; fn main() { let purple = Color::from("purple"); println!("purple: {}", purple); // purple: (1.000, 0.000, 1.000, 1.000) let green = Color::from("#00ff00"); println!("green: {}", green); // green: (0.000, 1.000, 0.000, 1.000) } ``` ### Color names Basic and Extended Colors from W3C and SVG are supported, along with colors from the XKCD color database through tint::xkcd(). | Name | Color | |---------|-------------------------------------------------------| | Black | ![#000000](https://placehold.it/100x15/000000?text=+) | | Silver | ![#c0c0c0](https://placehold.it/100x15/c0c0c0?text=+) | | Gray | ![#808080](https://placehold.it/100x15/808080?text=+) | | White | ![#ffffff](https://placehold.it/100x15/ffffff?text=+) | | Maroon | ![#800000](https://placehold.it/100x15/800000?text=+) | | Red | ![#ff0000](https://placehold.it/100x15/ff0000?text=+) | | Purple | ![#800080](https://placehold.it/100x15/800080?text=+) | | Fuchsia | ![#ff00ff](https://placehold.it/100x15/ff00ff?text=+) | | Green | ![#008000](https://placehold.it/100x15/008000?text=+) | | Lime | ![#00ff00](https://placehold.it/100x15/00ff00?text=+) | | Olive | ![#808000](https://placehold.it/100x15/808000?text=+) | | Yellow | ![#ffff00](https://placehold.it/100x15/ffff00?text=+) | | Navy | ![#000080](https://placehold.it/100x15/000080?text=+) | | Blue | ![#0000ff](https://placehold.it/100x15/0000ff?text=+) | | Teal | ![#008080](https://placehold.it/100x15/008080?text=+) | | Aqua | ![#00ffff](https://placehold.it/100x15/00ffff?text=+) | tint-1.0.1/src/lib.rs01006440000765000002400000070257131706673530012637 0ustar0000000000000000 //! Color creation and manipulation //! //! ``` //! use tint::Color; //! use tint::Colour; // Alternatively //! let green = Color::from("green"); //! let green = Color::from("00FF00"); //! let green = Color::from("00ff00"); //! let green = Color::from("#00ff00"); //! let green = Color::from("#00FF00"); //! let green = Color::from((0,255,0)); //! let green = Color::from([0.,1.,0.]); //! let green = Color::from(vec![0.,1.,0.]); //! let green = Color::from(vec![0.,1.,0.,1.0]); //! let green = Color::from(&vec![0.,1.,0.]); //! let green = Color::from(&vec![0.,1.,0.,1.0]); //! //! let green = Color::new(0.0, 1.0, 0.0, 1.0); //! let green = Color::from_rgb1(0.0, 1.0, 0.0); //! let green = Color::from_rgb1v(&[0.0, 1.0, 0.0]); //! let green = Color::name("green"); //! let green = Colour::name("green"); //! ``` //! //! # Color names //! Typical names (HTML and SVG) are available by default, and //! color names defined in the XKCD color database are available //! by running the xkcd() function //! ## Basic Colors //! https://www.w3.org/TR/css3-color/#html4 //! ## Extended Colors //! https://www.w3.org/TR/css3-color/#svg-color //! ## XKCD Colors //! https://xkcd.com/color/rgb/ #[macro_use] extern crate lazy_static; use std::collections::HashMap; use std::sync::Mutex; use std::io::Cursor; use std::fmt; use std::fs::File; use std::io::BufReader; use std::io::BufRead; use std::path::Path; pub type Colour = Color; /// Color value #[derive(Debug,Copy,Clone)] pub struct Color { /// Red component [0,1] pub red: f64, /// Green component [0,1] pub green: f64, /// Blue component [0,1] pub blue: f64, /// Alpha component [0,1] pub alpha: f64, } impl Color { /// Create new color from components /// /// ``` /// use tint::Color; /// let red = Color::new(1.0, 0.0, 0.0, 1.0); /// let fushcia = Color::new(1.0, 0.0, 1.0, 1.0); /// ``` pub fn new(red: f64, green: f64, blue: f64, alpha: f64) -> Color { Color { red: red, green: green, blue: blue, alpha: alpha } } // RGB 1.0 /// Create new color from RGB components [0. .. 1.0], /// alpha value set to 1.0 /// /// ``` /// # use tint::Color; /// let blue = Color::from_rgb1(0.0, 0.0, 1.0); /// ``` pub fn from_rgb1(r: f64, g: f64, b: f64) -> Color { Color { red: r, green: g, blue: b, alpha: 1.0 } } /// Create new color from RGB f64 vector [0. .. 1.0], /// alpha value set to 1.0 /// /// ``` /// # use tint::Color; /// let green = Color::from_rgb1v(&[0.0, 1.0, 0.0]); /// ``` pub fn from_rgb1v(rgb: &[f64]) -> Color { Color { red: rgb[0], green: rgb[1], blue: rgb[2], alpha: 1.0 } } /// Convert Color to (f64,f64,f64) /// /// ``` /// # use tint::Color; /// let purple = Color::new(1.0, 0.0, 1.0, 1.0); /// let rgb = purple.to_rgb1(); /// assert_eq!(rgb, (1.0, 0.0, 1.0)); /// ``` pub fn to_rgb1(&self) -> (f64,f64,f64) { (self.red, self.green, self.blue) } // RGB 255 /// Create new Color from RGB [0 .. 255] /// alpha value set to 1.0 /// /// ``` /// # use tint::Color; /// let purple = Color::from_rgb255(255, 0, 255); /// ``` pub fn from_rgb255(red: u8, green: u8, blue: u8) -> Color { Color::from_rgb1((red as f64)/255., (green as f64)/255., (blue as f64)/255.) } /// Create new Color from RGB u8 vector [0 .. 255] /// alpha value set to 1.0 /// /// ``` /// # use tint::Color; /// let purple = Color::from_rgb255v(&[255, 0, 255]); /// assert_eq!(purple.red, 1.0); /// assert_eq!(purple.green, 0.0); /// assert_eq!(purple.blue, 1.0); /// ``` pub fn from_rgb255v(rgb: &[u8]) -> Color { Color::from_rgb255(rgb[0], rgb[1], rgb[2]) } /// Convert color to (u8,u8,u8) /// /// ``` /// # use tint::Color; /// let purple = Color::new(1.0, 0.0, 1.0, 1.0); /// assert_eq!(purple.to_rgb255(), (255,0,255)); /// ``` pub fn to_rgb255(&self) -> (u8,u8,u8) { let r = (self.red * 255.0) as u8; let g = (self.green * 255.0) as u8; let b = (self.blue * 255.0) as u8; (r,g,b) } // HEX /// Create new Color from Hex String /// /// ``` /// # use tint::Color; /// let facade = Color::from_hex("#facade"); /// assert_eq!(facade.to_rgb255(), (250, 202, 222)); /// ``` pub fn from_hex(hex: &str) -> Color { let n = if hex.chars().nth(0).unwrap() == '#' { 1 } else { 0 }; let r = u8::from_str_radix(&hex[n+0..n+2],16).unwrap(); let g = u8::from_str_radix(&hex[n+2..n+4],16).unwrap(); let b = u8::from_str_radix(&hex[n+4..n+6],16).unwrap(); Color::from_rgb255(r,g,b) } /// Convert Color into Hex String /// /// ``` /// # use tint::Color; /// let coffee = Color::from_rgb255(192, 255, 238); /// assert_eq!(coffee.to_hex(), "#c0ffee"); /// ``` pub fn to_hex(&self) -> String { let (r,g,b) = self.to_rgb255(); format!("#{:02x}{:02x}{:02x}", r,g,b) } //pub fn from_hexs(hex: &str) -> Vec { // hex.split(',').map(|x| Color::from_hex(x)).collect() //} // Named Color /// Get Color from exiting named colors /// Colors are defined from w3c Basic and Extended colors /// and colors from the XKCD database if loaded /// /// ``` /// # use tint::Color; /// let chartreuse = Color::name("chartreuse"); /// assert_eq!(chartreuse, Some(Color::from_hex("7fff00"))); /// let olive_drab = Color::name("olivedrab").unwrap(); /// assert_eq!(olive_drab.to_rgb255(), (107,142,35)); /// /// tint::xkcd(); /// let butterscotch = Color::name("butterscotch").unwrap(); /// assert_eq!(butterscotch.to_hex(), "#fdb147"); /// /// let avocado = Color::name("avocado green").unwrap(); /// assert_eq!(avocado.to_rgb255(), (135, 169, 34)); /// ``` pub fn name(name: &str) -> Option { match COLOR_MAP.lock().unwrap().get(name) { Some(&c) => Some(c.clone()), None => None, } } // HSV /// Convert Color to HSV pub fn to_hsv(&self) -> (f64,f64,f64) { rgb2hsv(self.red, self.green, self.blue) } /// Create new Color from HSV /// alpha value set to 1.0 pub fn from_hsv(&self) -> Color { let (r,g,b) = hsv2rgb(self.red, self.green, self.blue); Color::new(r,g,b,1.0) } // HSL /// Convert Color to HSL pub fn to_hsl(&self) -> (f64,f64,f64) { rgb2hsl(self.red, self.green, self.blue) } /// Create new Color from HSL /// alpha value set to 1.0 pub fn from_hsl(&self) -> Color { let (r,g,b) = hsl2rgb(self.red, self.green, self.blue); Color::new(r,g,b,1.0) } // YIQ /// Convert Color to YIQ pub fn to_yiq(&self) -> (f64,f64,f64) { rgb2yiq(self.red, self.green, self.blue) } /// Create new Color from YIQ /// alpha value set to 1.0 pub fn from_yiq(&self) -> Color { let (r,g,b) = yiq2rgb(self.red, self.green, self.blue); Color::new(r,g,b,1.0) } } // Strings /// Convert from named color or a hex string /// /// This may fail impl From for Color { fn from(s: String) -> Color { match Color::name(&s) { None => Color::from_hex(&s), Some(c) => c } } } /// Convert from named color or a hex string /// /// This may fail impl <'a> From<&'a String> for Color { fn from(s: &'a String) -> Color { match Color::name(s) { None => Color::from_hex(s), Some(c) => c } } } /// Convert from named color or a hex string /// /// This may fail impl <'a> From<&'a str> for Color { fn from(s: &'a str) -> Color { match Color::name(s) { None => Color::from_hex(s), Some(c) => c } } } // Tuples /// Convert from a u8 triple, red, green, blue impl From<(u8,u8,u8)> for Color { fn from(c: (u8,u8,u8)) -> Color { Color::from_rgb255(c.0, c.1, c.2) } } /// Convert from a f64 triple, red, green, blue impl From<(f64,f64,f64)> for Color { fn from(c: (f64,f64,f64)) -> Color { Color::from_rgb1(c.0, c.1, c.2) } } /// Convert from a f32 triple, red, green, blue impl From<(f32,f32,f32)> for Color { fn from(c: (f32,f32,f32)) -> Color { Color::from_rgb1(c.0 as f64, c.1 as f64, c.2 as f64) } } // Arrays /// Convert from a u8 triple, red, green, blue impl <'a> From<&'a [u8;3]> for Color { fn from(c: &'a [u8;3]) -> Color { Color::from_rgb255v(c) } } /// Convert from a f64 triple, red, green, blue impl <'a> From<&'a [f64;3]> for Color { fn from(c: &'a [f64;3]) -> Color { Color::from_rgb1v(c) } } /// Convert from a f32 triple, red, green, blue impl <'a> From<&'a [f32;3]> for Color { fn from(c: &'a [f32;3]) -> Color { Color::new(c[0] as f64, c[1] as f64, c[2] as f64, 1.0) } } /// Convert from a u8 triple, red, green, blue impl From<[u8;3]> for Color { fn from(c: [u8;3]) -> Color { Color::from_rgb255v(&c) } } /// Convert from a f64 triple, red, green, blue impl From<[f64;3]> for Color { fn from(c: [f64;3]) -> Color { Color::from_rgb1v(&c) } } /// Convert from a f32 triple, red, green, blue impl From<[f32;3]> for Color { fn from(c: [f32;3]) -> Color { Color::new(c[0] as f64, c[1] as f64, c[2] as f64, 1.0) } } // Vecs /// Convert from a f64 Vec, red, green, blue, maybe alpha /// /// This may fail impl <'a> From<&'a Vec> for Color { fn from(c: &'a Vec) -> Color { match c.len() { 3 => Color::new(c[0], c[1], c[2], 1.0), 4 => Color::new(c[0], c[1], c[2], c[3]), _ => panic!("Expected three or four color components"), } } } /// Convert from a f32 Vec, red, green, blue, maybe alpha /// /// This may fail impl <'a> From<&'a Vec> for Color { fn from(c: &'a Vec) -> Color { let c64 : Vec<_> = c.into_iter().map(|x| *x as f64).collect(); Color::from(&c64) } } /// Convert from a f32 Vec, red, green, blue, maybe alpha /// /// This may fail impl From> for Color { fn from(c: Vec) -> Color { Color::from(&c) } } /// Convert from a f32 Vec, red, green, blue, maybe alpha /// /// This may fail impl From> for Color { fn from(c: Vec) -> Color { let c64 : Vec<_> = c.into_iter().map(|x| x as f64).collect(); Color::from(&c64) } } impl PartialEq for Color { fn eq(&self, other: &Color) -> bool { self.red == other.red && self.blue == other.blue && self.green == other.green && self.alpha == other.alpha } } impl fmt::Display for Color { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "({:5.3}, {:5.3}, {:5.3}, {:5.3})", self.red, self.green, self.blue, self.alpha) } } fn parse_rgb_name(line: &str) -> Option<(String, Vec)> { // R G B Color Names let rgb : Vec<_>= line.split_whitespace().take(3) .map(|x| x.parse::()) .collect(); let is_rgb = rgb.iter().all(|x| x.is_ok()); if is_rgb && rgb.len() == 3 { let rgb = rgb.into_iter().map(|x| x.unwrap()).collect::>(); let name = line.split_whitespace() .skip(3) .map(|x| x.to_owned()) .collect::>() .join(" "); return Some((name, rgb)); } None } fn parse_name_hex(line: &str) -> Option<(String, Color)> { // Color Names #RRGGBB let vals = line.split('#').map(|x| x.trim()).collect::>(); if vals.len() == 2 { let name = vals[0].to_owned(); let hex = vals[1]; if hex.len() == 6 { return Some((name, Color::from_hex(hex))); } } None } /// Load a buffer and return a Vec of names and colors /// /// Available formats include: /// name #hex-value /// r255 g255 b255 name /// Lines beginning with # are ignored pub fn read_buffer(buf: T) -> Vec<(String, Color)> where T: BufRead { let mut out = vec![]; for xline in buf.lines() { let line = xline.unwrap(); if let Some((name,rgb)) = parse_rgb_name(&line) { out.push((name, Color::from_rgb255v(&rgb))); } else if let Some((name, color)) = parse_name_hex(&line) { out.push((name, color)) } else { //println!("Unknown line: {}", line); } } out } /// Read a file and return a Vec of names and colors pub fn read_file

(file: P) -> Vec<(String, Color)> where P: AsRef { let fp = File::open(file).unwrap(); let fp = BufReader::new(&fp); read_buffer(fp) } /// Load a buffer into the existing Named Color database. /// /// Existing colors will not be overwritten and a warning will be issued. pub fn load_rgb_buffer(buf: T) where T: BufRead { for (xname, color) in read_buffer(buf).into_iter() { let name = xname.to_lowercase(); if COLOR_MAP.lock().unwrap().contains_key(&name) { println!("warning: color already exists: {}", name); continue; } COLOR_MAP.lock().unwrap().insert(name, color); } } /// Load a file into the existing Named Color database. /// /// Existing colors will not be overwritten and a warning will be issued. pub fn load_rgb_file

(file: P) where P: AsRef { let fp = File::open(file).unwrap(); let fp = BufReader::new(&fp); load_rgb_buffer(fp); } lazy_static! { static ref COLOR_MAP: Mutex> = { let mut m : HashMap = HashMap::new(); for s in [COLORS_BASIC, COLORS_EXTENDED].iter() { for (ref xname, color) in read_buffer( Cursor::new( s ) ).into_iter() { let name = xname.to_lowercase(); if ! m.contains_key(&name) { m.insert(name, color); } } } Mutex::new(m) }; } /// Load colors from the XKCD Color Database pub fn xkcd() { load_rgb_buffer(Cursor::new(COLORS_XKCD)); } /// Return names of available named colors pub fn names() -> Vec { let map = COLOR_MAP.lock().unwrap(); map.keys().cloned().collect() } fn cmp3(a: (f64,f64,f64), b:(f64,f64,f64)) -> std::cmp::Ordering { if a.0 > b.0 { return std::cmp::Ordering::Greater; } else if a.0 < b.0 { return std::cmp::Ordering::Less; } if a.1 > b.1 { return std::cmp::Ordering::Greater; } else if a.1 < b.1 { return std::cmp::Ordering::Less; } if a.2 > b.2 { return std::cmp::Ordering::Greater; } else if a.2 < b.2 { return std::cmp::Ordering::Less; } return std::cmp::Ordering::Equal; } /// Compare Colors by red, then green, then blue pub fn compare_by_rgb(a: &Color, b: &Color) -> std::cmp::Ordering { cmp3(a.to_rgb1(), b.to_rgb1()) } /// Compare Colors by hue, then saturation, then value pub fn compare_by_hsv(a: &Color, b: &Color) -> std::cmp::Ordering { cmp3(a.to_hsv(),b.to_hsv()) } // https://en.wikipedia.org/wiki/YIQ#From_RGB_to_YIQ // FCC NTSC Standard fn rgb2yiq(r: f64, g: f64, b: f64) -> (f64,f64,f64) { let y = 0.30 * r + 0.59 * g + 0.11 * b; let i = 0.74 * (r-y) - 0.27 * (b-y); let q = 0.48 * (r-y) + 0.41 * (b-y); (y,i,q) } fn yiq2rgb(y: f64, i: f64, q:f64) -> (f64,f64,f64) { let v33 = 1.7090069284064666; let v32 = -1.1085450346420322; let v22 = -0.27478764629897834; let v23 = -0.6356910791873801; let v13 = 0.6235565819861433; let v12 = 0.9468822170900693; let r = y + v12 * i + v13 * q; let g = y + v22 * i + v23 * q; let b = y + v32 * i + v33 * q; (r,g,b) } fn fmin(v: &[f64]) -> f64 { let mut val = v[0]; for vi in v { if *vi < val { val = *vi; } } val } fn fmax(v: &[f64]) -> f64 { let mut val = v[0]; for vi in v { if *vi > val { val = *vi; } } val } // https://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB // https://stackoverflow.com/a/6930407 /// h : [0, 360] /// s : [0, 1] /// v : [0, 1] fn rgb2hsv(r: f64, g: f64, b: f64) -> (f64,f64,f64) { let cmax = fmax(&[r,g,b]); let cmin = fmin(&[r,g,b]); if (cmax - cmin).abs() < 1e-5 { return (0.,0.,cmax); } let v = cmax; let delta = cmax - cmin; let s = delta / cmax; //println!("rgb2hsv: {} {} {} {}", r,g,b,cmax); let mut h = if r >= cmax { (g - b) / delta } else if g >= cmax { 2.0 + (b - r) / delta } else if b >= cmax { 4.0 + (r - g) / delta } else { 0.0 }; h *= 60.0; if h < 0.0 { h += 360.0; } (h, s, v) } fn hsv2rgb(h: f64, s: f64, v: f64) -> (f64, f64, f64) { //println!("hsv: {} {} {}", h,s,v); if s <= 0.0 { return (v,v,v); } let mut hh = h; if hh >= 360.0 { hh = 0.0; } hh = hh / 60.0; let i = hh.floor() as u64; let ff = hh - i as f64; let p = v * (1.0 - s); let q = v * (1.0 - (s * ff)); let t = v * (1.0 - (s * (1.0 - ff))); //println!("hsv: i {} {} {} {} {}", i, p,q,t,v); match i { 0 => (v,t,p), 1 => (q,v,p), 2 => (p,v,t), 3 => (p,q,v), 4 => (t,p,v), 5 => (v,p,q), _ => panic!("Unexpected value in hsv2rgb: i: {} h: {}", i, h), } } fn rgb2hsl(r: f64, g: f64, b: f64) -> (f64, f64, f64) { let cmax = fmax(&[r,g,b]); let cmin = fmin(&[r,g,b]); let l = (cmax + cmin)/2.0; if (cmax - cmin).abs() <= 1e-5 { return (0., 0., l); } let d = cmax - cmin; let mut s = d / (2.0 - cmax - cmin); if l <= 0.5 { s = d / (cmax + cmin); } let mut h = if r >= cmax { let dh = if g < b { 6.0 } else { 0.0 }; (g - b) / d + dh } else if g >= cmax { 2.0 + (b - r) / d } else if b >= cmax { 4.0 + (r - g) / d } else { 0.0 }; h = h / 6.0; (h,s,l) } fn hue2rgb(p: f64, q: f64, t: f64) -> f64 { let mut tt = t; if tt < 0.0 { tt += 1.0; } if tt > 1.0 { tt -= 1.0 } if tt < 1./6. { return p + (q - p) * 6.0 * tt; } if tt < 1./2. { return q; } if tt < 2./3. { return p + (q - p) * (2./3. - tt) * 6.0; } return p; } fn hsl2rgb(h: f64, s: f64, l: f64) -> (f64, f64, f64) { if s.abs() <= 1e-5 { return (l,l,l); } let q = if l < 0.5 { l * (1.0 + s) } else { l + s - (l * s) }; let p = 2.0 * l - q; let r = hue2rgb(p, q, h + 1./3.); let g = hue2rgb(p, q, h); let b = hue2rgb(p, q, h - 1./3.); (r,g,b) } //include!("extended.rs"); static COLORS_BASIC: &'static str = include_str!("w3c_basic.txt"); static COLORS_EXTENDED: &'static str = include_str!("w3c_extended.txt"); static COLORS_XKCD: &'static str = include_str!("xkcd.txt"); #[cfg(test)] mod tests { use super::*; #[test] fn basic() { assert_eq!(Color::name("black"), Some(Color::new(0.,0.,0.,1.))); assert_eq!(Color::name("white"), Some(Color::new(1.,1.,1.,1.))); assert_eq!(Color::name("red"), Some(Color::new(1.,0.,0.,1.))); assert_eq!(Color::name("green"), Some(Color::new(0.,128./255.,0.,1.))); assert_eq!(Color::name("blue"), Some(Color::new(0.,0.,1.,1.))); assert_eq!(Color::name("yellow"), Some(Color::new(1.,1.,0.,1.))); assert_eq!(Color::name("cyan"), Some(Color::new(0.,1.,1.,1.))); assert_eq!(Color::name("orange"), Some(Color::new(1.,165./255.,0.,1.))); assert_eq!(Color::name("fuchsia"), Some(Color::new(1.,0.,1.,1.))); for name in ["black","silver","gray","white","maroon", "red","purple", "fuchsia","green","lime","olive","yellow","navy","blue", "teal","aqua"].iter() { assert_eq!(Color::name(name).is_some(), true); } } #[test] fn hex() { assert_eq!(Color::name("black").unwrap().to_hex(), "#000000"); assert_eq!(Color::name("silver").unwrap().to_hex(), "#c0c0c0"); assert_eq!(Color::name("gray").unwrap().to_hex(), "#808080"); assert_eq!(Color::name("white").unwrap().to_hex(), "#ffffff"); assert_eq!(Color::name("maroon").unwrap().to_hex(), "#800000"); assert_eq!(Color::name("red").unwrap().to_hex(), "#ff0000"); assert_eq!(Color::name("purple").unwrap().to_hex(), "#800080"); assert_eq!(Color::name("fuchsia").unwrap().to_hex(), "#ff00ff"); assert_eq!(Color::name("green").unwrap().to_hex(), "#008000"); assert_eq!(Color::name("lime").unwrap().to_hex(), "#00ff00"); assert_eq!(Color::name("olive").unwrap().to_hex(), "#808000"); assert_eq!(Color::name("yellow").unwrap().to_hex(), "#ffff00"); assert_eq!(Color::name("navy").unwrap().to_hex(), "#000080"); assert_eq!(Color::name("blue").unwrap().to_hex(), "#0000ff"); assert_eq!(Color::name("teal").unwrap().to_hex(), "#008080"); assert_eq!(Color::name("aqua").unwrap().to_hex(), "#00ffff"); assert_eq!(Color::name("cyan").unwrap().to_hex(), "#00ffff"); assert_eq!(Color::name("orange").unwrap().to_hex(), "#ffa500"); } #[test] fn extended() { let ext_names = ["aliceblue","antiquewhite","aqua","aquamarine","azure", "beige","bisque","black","blanchedalmond","blue","blueviolet", "brown","burlywood","cadetblue","chartreuse","chocolate", "coral","cornflowerblue","cornsilk","crimson","cyan", "darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen", "darkgrey","darkkhaki","darkmagenta","darkolivegreen", "darkorange","darkorchid","darkred","darksalmon", "darkseagreen","darkslateblue","darkslategray","darkslategrey", "darkturquoise","darkviolet","deeppink","deepskyblue","dimgray", "dimgrey","dodgerblue","firebrick","floralwhite","forestgreen", "fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray", "green","greenyellow","grey","honeydew","hotpink","indianred", "indigo","ivory","khaki","lavender","lavenderblush","lawngreen", "lemonchiffon","lightblue","lightcoral","lightcyan", "lightgoldenrodyellow","lightgray","lightgreen","lightgrey", "lightpink","lightsalmon","lightseagreen","lightskyblue", "lightslategray","lightslategrey","lightsteelblue","lightyellow", "lime","limegreen","linen","magenta","maroon","mediumaquamarine", "mediumblue","mediumorchid","mediumpurple","mediumseagreen", "mediumslateblue","mediumspringgreen","mediumturquoise", "mediumvioletred","midnightblue","mintcream","mistyrose", "moccasin","navajowhite","navy","oldlace","olive","olivedrab", "orange","orangered","orchid","palegoldenrod","palegreen", "paleturquoise","palevioletred","papayawhip","peachpuff","peru", "pink","plum","powderblue","purple","red","rosybrown","royalblue", "saddlebrown","salmon","sandybrown","seagreen","seashell", "sienna","silver","skyblue","slateblue","slategray","slategrey", "snow","springgreen","steelblue","tan","teal","thistle","tomato", "turquoise","violet","wheat","white","whitesmoke","yellow", "yellowgreen"]; for name in ext_names.iter() { assert_eq!(Color::name(name).is_some(), true); } } #[test] fn bad_name() { assert_eq!(Color::name("asdf").is_none(), true); } #[test] fn test_xkcd() { xkcd(); assert_eq!(Color::name("toxic green").is_some(), true); assert_eq!(Color::name("blood").is_some(), true); assert_eq!(Color::name("vomit").is_some(), true); assert_eq!(Color::name("baby poop").is_some(), true); } #[test] fn test_from() { let red = Color::name("red").unwrap(); assert_eq!(Color::from("#ff0000"), red); assert_eq!(Color::from("#ff0000".to_string()), red); assert_eq!(Color::from((255,0,0)), red); assert_eq!(Color::from(&[255,0,0]), red); assert_eq!(Color::from(&[1.,0.,0.]), red); let rgb = vec![1.,0.,0.]; assert_eq!(Color::from(&rgb), red); assert_eq!(Color::from(rgb), red); let rgb = vec![1.0f32,0.,0.]; assert_eq!(Color::from(&rgb), red); assert_eq!(Color::from(rgb), red); assert_eq!(Color::from("red"), red); assert_eq!(Color::from("red".to_string()), red); } #[test] fn test_into() { let red = Color::name("red").unwrap(); assert_eq!(red, (255,0,0).into()); assert_eq!(red, "red".into()); assert_eq!(red, "#ff0000".into()); assert_eq!(red, (1.0,0.0,0.0).into()); } #[test] fn test_display() { let red = Color::name("red").unwrap(); assert_eq!(format!("{}", red), "(1.000, 0.000, 0.000, 1.000)"); } fn assert_tol(a: (f64,f64,f64), b: (f64,f64,f64), tol: f64) { if (a.0-b.0).abs() > tol { assert_eq!(a,b); } if (a.1-b.1).abs() > tol { assert_eq!(a,b); } if (a.2-b.2).abs() > tol { assert_eq!(a,b); } } /* fn cprint(c0: (f64,f64,f64),c1:(f64,f64,f64),c2:(f64,f64,f64),c3:(i64,i64,i64)) { println!("{:.5} {:.5} {:.5} -> {:.5} {:.5} {:.5} -> {:.5} {:.5} {:.5} ({:3} {:3} {:3})", c0.0,c0.1,c0.2, c1.0,c1.1,c1.2, c2.0,c2.1,c2.2, c3.0,c3.1,c3.2) } */ #[test] #[ignore] fn yiq() { for r in 0..256 { for g in 0..256 { for b in 0..256 { let rf = r as f64/ 255.0; let gf = g as f64/ 255.0; let bf = b as f64/ 255.0; let (y,i,q) = rgb2yiq(rf,gf,bf); let (r0,g0,b0) = yiq2rgb(y,i,q); //cprint((rf,gf,bf),(y,i,q),(r0,g0,b0),(r,g,b)); assert_tol((rf,gf,bf),(r0,g0,b0), 1e-13); } } } } #[test] #[ignore] fn hsl() { for r in 0..256 { for g in 0..256 { for b in 0..256 { let rf = r as f64/ 255.0; let gf = g as f64/ 255.0; let bf = b as f64/ 255.0; let (h,s,l) = rgb2hsl(rf,gf,bf); let (r0,g0,b0) = hsl2rgb(h,s,l); //cprint((rf,gf,bf),(h,s,l),(r0,g0,b0),(r,g,b)); assert_tol((rf,gf,bf),(r0,g0,b0), 1e-13); } } } } #[test] #[ignore] fn hsv() { assert_eq!(rgb2hsv(0.,0.,0.), (0.,0.,0.)); assert_eq!(rgb2hsv(1.,0.,0.), (0.,1.,1.)); assert_eq!(rgb2hsv(0.,1.,0.), (120.,1.,1.)); assert_eq!(rgb2hsv(0.,0.,1.), (240.,1.,1.)); assert_eq!(rgb2hsv(1.,1.,0.), (60.,1.,1.)); assert_eq!(rgb2hsv(1.,0.,1.), (300.,1.,1.)); assert_eq!(rgb2hsv(0.,1.,1.), (180.,1.,1.)); assert_eq!(rgb2hsv(1.0,0.0,std::f64::EPSILON), (360.,1.0,1.0)); assert_eq!(rgb2hsv(1./255.,1./255.,2./255.), (240.,0.5, 2./255.)); assert_eq!(hsv2rgb(240.,0.5,2./255.), (1./255.,1./255., 2./255.)); assert_eq!(rgb2hsv(1./255.,0./255.,1./255.), (300.,1., 1./255.)); assert_eq!(hsv2rgb(300.,1.0,1./255.), (1./255.,0./255., 1./255.)); for r in 0..256 { for g in 0..256 { for b in 0..256 { let rf = r as f64/ 255.0; let gf = g as f64/ 255.0; let bf = b as f64/ 255.0; let (h,s,v) = rgb2hsv(rf,gf,bf); let (r0,g0,b0) = hsv2rgb(h,s,v); //cprint((rf,gf,bf),(h,s,v),(r0,g0,b0),(r,g,b)); assert_tol((rf,gf,bf),(r0,g0,b0), 1e-13); } } } } } tint-1.0.1/src/w3c_basic.txt01006440000765000002400000000452131666672440014113 0ustar0000000000000000# https://www.w3.org/TR/css3-color/#html4 black #000000 silver #C0C0C0 gray #808080 white #FFFFFF maroon #800000 red #FF0000 purple #800080 fuchsia #FF00FF green #008000 lime #00FF00 olive #808000 yellow #FFFF00 navy #000080 blue #0000FF teal #008080 aqua #00FFFF tint-1.0.1/src/w3c_extended.txt01006440000765000002400000010325131666675600014633 0ustar0000000000000000# https://www.w3.org/TR/css3-color/#svg-color aliceblue #f0f8ff antiquewhite #faebd7 aqua #00ffff aquamarine #7fffd4 azure #f0ffff beige #f5f5dc bisque #ffe4c4 black #000000 blanchedalmond #ffebcd blue #0000ff blueviolet #8a2be2 brown #a52a2a burlywood #deb887 cadetblue #5f9ea0 chartreuse #7fff00 chocolate #d2691e coral #ff7f50 cornflowerblue #6495ed cornsilk #fff8dc crimson #dc143c cyan #00ffff darkblue #00008b darkcyan #008b8b darkgoldenrod #b8860b darkgray #a9a9a9 darkgreen #006400 darkgrey #a9a9a9 darkkhaki #bdb76b darkmagenta #8b008b darkolivegreen #556b2f darkorange #ff8c00 darkorchid #9932cc darkred #8b0000 darksalmon #e9967a darkseagreen #8fbc8f darkslateblue #483d8b darkslategray #2f4f4f darkslategrey #2f4f4f darkturquoise #00ced1 darkviolet #9400d3 deeppink #ff1493 deepskyblue #00bfff dimgray #696969 dimgrey #696969 dodgerblue #1e90ff firebrick #b22222 floralwhite #fffaf0 forestgreen #228b22 fuchsia #ff00ff gainsboro #dcdcdc ghostwhite #f8f8ff gold #ffd700 goldenrod #daa520 gray #808080 green #008000 greenyellow #adff2f grey #808080 honeydew #f0fff0 hotpink #ff69b4 indianred #cd5c5c indigo #4b0082 ivory #fffff0 khaki #f0e68c lavender #e6e6fa lavenderblush #fff0f5 lawngreen #7cfc00 lemonchiffon #fffacd lightblue #add8e6 lightcoral #f08080 lightcyan #e0ffff lightgoldenrodyellow #fafad2 lightgray #d3d3d3 lightgreen #90ee90 lightgrey #d3d3d3 lightpink #ffb6c1 lightsalmon #ffa07a lightseagreen #20b2aa lightskyblue #87cefa lightslategray #778899 lightslategrey #778899 lightsteelblue #b0c4de lightyellow #ffffe0 lime #00ff00 limegreen #32cd32 linen #faf0e6 magenta #ff00ff maroon #800000 mediumaquamarine #66cdaa mediumblue #0000cd mediumorchid #ba55d3 mediumpurple #9370db mediumseagreen #3cb371 mediumslateblue #7b68ee mediumspringgreen #00fa9a mediumturquoise #48d1cc mediumvioletred #c71585 midnightblue #191970 mintcream #f5fffa mistyrose #ffe4e1 moccasin #ffe4b5 navajowhite #ffdead navy #000080 oldlace #fdf5e6 olive #808000 olivedrab #6b8e23 orange #ffa500 orangered #ff4500 orchid #da70d6 palegoldenrod #eee8aa palegreen #98fb98 paleturquoise #afeeee palevioletred #db7093 papayawhip #ffefd5 peachpuff #ffdab9 peru #cd853f pink #ffc0cb plum #dda0dd powderblue #b0e0e6 purple #800080 red #ff0000 rosybrown #bc8f8f royalblue #4169e1 saddlebrown #8b4513 salmon #fa8072 sandybrown #f4a460 seagreen #2e8b57 seashell #fff5ee sienna #a0522d silver #c0c0c0 skyblue #87ceeb slateblue #6a5acd slategray #708090 slategrey #708090 snow #fffafa springgreen #00ff7f steelblue #4682b4 tan #d2b48c teal #008080 thistle #d8bfd8 tomato #ff6347 turquoise #40e0d0 violet #ee82ee wheat #f5deb3 white #ffffff whitesmoke #f5f5f5 yellow #ffff00 yellowgreen #9acd32 tint-1.0.1/src/xkcd.txt01006440000765000002400000101314131667374410013203 0ustar0000000000000000# xkcd RGB Database: https://xkcd.com/color/rgb/ # Source file: http://xkcd.com/color/rgb.txt # Note: Colors commented out appear in the w3c basic and extended files cloudy blue #acc2d9 dark pastel green #56ae57 dust #b2996e electric lime #a8ff04 fresh green #69d84f light eggplant #894585 nasty green #70b23f really light blue #d4ffff tea #65ab7c warm purple #952e8f yellowish tan #fcfc81 cement #a5a391 dark grass green #388004 dusty teal #4c9085 grey teal #5e9b8a macaroni and cheese #efb435 pinkish tan #d99b82 spruce #0a5f38 strong blue #0c06f7 toxic green #61de2a windows blue #3778bf blue blue #2242c7 blue with a hint of purple #533cc6 booger #9bb53c bright sea green #05ffa6 dark green blue #1f6357 deep turquoise #017374 green teal #0cb577 strong pink #ff0789 bland #afa88b deep aqua #08787f lavender pink #dd85d7 light moss green #a6c875 light seafoam green #a7ffb5 olive yellow #c2b709 pig pink #e78ea5 deep lilac #966ebd desert #ccad60 dusty lavender #ac86a8 purpley grey #947e94 purply #983fb2 candy pink #ff63e9 light pastel green #b2fba5 boring green #63b365 kiwi green #8ee53f light grey green #b7e1a1 orange pink #ff6f52 tea green #bdf8a3 very light brown #d3b683 egg shell #fffcc4 eggplant purple #430541 powder pink #ffb2d0 reddish grey #997570 baby shit brown #ad900d liliac #c48efd stormy blue #507b9c ugly brown #7d7103 custard #fffd78 darkish pink #da467d deep brown #410200 greenish beige #c9d179 manilla #fffa86 off blue #5684ae battleship grey #6b7c85 browny green #6f6c0a bruise #7e4071 kelley green #009337 sickly yellow #d0e429 sunny yellow #fff917 azul #1d5dec # darkgreen #054907 green/yellow #b5ce08 lichen #8fb67b light light green #c8ffb0 pale gold #fdde6c sun yellow #ffdf22 tan green #a9be70 burple #6832e3 butterscotch #fdb147 toupe #c7ac7d dark cream #fff39a indian red #850e04 light lavendar #efc0fe poison green #40fd14 baby puke green #b6c406 bright yellow green #9dff00 charcoal grey #3c4142 squash #f2ab15 cinnamon #ac4f06 light pea green #c4fe82 radioactive green #2cfa1f raw sienna #9a6200 baby purple #ca9bf7 cocoa #875f42 light royal blue #3a2efe orangeish #fd8d49 rust brown #8b3103 sand brown #cba560 swamp #698339 tealish green #0cdc73 burnt siena #b75203 camo #7f8f4e dusk blue #26538d fern #63a950 old rose #c87f89 pale light green #b1fc99 peachy pink #ff9a8a rosy pink #f6688e light bluish green #76fda8 light bright green #53fe5c light neon green #4efd54 light seafoam #a0febf tiffany blue #7bf2da washed out green #bcf5a6 browny orange #ca6b02 nice blue #107ab0 sapphire #2138ab greyish teal #719f91 orangey yellow #fdb915 parchment #fefcaf straw #fcf679 very dark brown #1d0200 terracota #cb6843 ugly blue #31668a clear blue #247afd creme #ffffb6 foam green #90fda9 grey/green #86a17d light gold #fddc5c seafoam blue #78d1b6 topaz #13bbaf violet pink #fb5ffc wintergreen #20f986 yellow tan #ffe36e dark fuchsia #9d0759 indigo blue #3a18b1 light yellowish green #c2ff89 pale magenta #d767ad rich purple #720058 sunflower yellow #ffda03 green/blue #01c08d leather #ac7434 racing green #014600 vivid purple #9900fa dark royal blue #02066f hazel #8e7618 muted pink #d1768f booger green #96b403 canary #fdff63 cool grey #95a3a6 dark taupe #7f684e darkish purple #751973 true green #089404 coral pink #ff6163 dark sage #598556 dark slate blue #214761 flat blue #3c73a8 mushroom #ba9e88 rich blue #021bf9 dirty purple #734a65 greenblue #23c48b icky green #8fae22 light khaki #e6f2a2 warm blue #4b57db dark hot pink #d90166 deep sea blue #015482 carmine #9d0216 dark yellow green #728f02 pale peach #ffe5ad plum purple #4e0550 golden rod #f9bc08 neon red #ff073a old pink #c77986 very pale blue #d6fffe blood orange #fe4b03 grapefruit #fd5956 sand yellow #fce166 clay brown #b2713d dark blue grey #1f3b4d flat green #699d4c light green blue #56fca2 warm pink #fb5581 dodger blue #3e82fc gross green #a0bf16 ice #d6fffa metallic blue #4f738e pale salmon #ffb19a sap green #5c8b15 algae #54ac68 bluey grey #89a0b0 greeny grey #7ea07a highlighter green #1bfc06 light light blue #cafffb light mint #b6ffbb raw umber #a75e09 vivid blue #152eff deep lavender #8d5eb7 dull teal #5f9e8f light greenish blue #63f7b4 mud green #606602 pinky #fc86aa red wine #8c0034 shit green #758000 tan brown #ab7e4c # darkblue #030764 rosa #fe86a4 lipstick #d5174e pale mauve #fed0fc claret #680018 dandelion #fedf08 # orangered #fe420f poop green #6f7c00 ruby #ca0147 dark #1b2431 greenish turquoise #00fbb0 pastel red #db5856 piss yellow #ddd618 bright cyan #41fdfe dark coral #cf524e algae green #21c36f darkish red #a90308 reddy brown #6e1005 blush pink #fe828c camouflage green #4b6113 lawn green #4da409 putty #beae8a vibrant blue #0339f8 dark sand #a88f59 purple/blue #5d21d0 saffron #feb209 twilight #4e518b warm brown #964e02 bluegrey #85a3b2 bubble gum pink #ff69af duck egg blue #c3fbf4 greenish cyan #2afeb7 petrol #005f6a royal #0c1793 butter #ffff81 dusty orange #f0833a off yellow #f1f33f pale olive green #b1d27b orangish #fc824a leaf #71aa34 light blue grey #b7c9e2 dried blood #4b0101 lightish purple #a552e6 rusty red #af2f0d lavender blue #8b88f8 light grass green #9af764 light mint green #a6fbb2 sunflower #ffc512 velvet #750851 brick orange #c14a09 lightish red #fe2f4a pure blue #0203e2 twilight blue #0a437a violet red #a50055 yellowy brown #ae8b0c carnation #fd798f muddy yellow #bfac05 dark seafoam green #3eaf76 deep rose #c74767 dusty red #b9484e grey/blue #647d8e lemon lime #bffe28 purple/pink #d725de brown yellow #b29705 purple brown #673a3f wisteria #a87dc2 banana yellow #fafe4b lipstick red #c0022f water blue #0e87cc brown grey #8d8468 vibrant purple #ad03de baby green #8cff9e barf green #94ac02 eggshell blue #c4fff7 sandy yellow #fdee73 cool green #33b864 pale #fff9d0 blue/grey #758da3 hot magenta #f504c9 greyblue #77a1b5 purpley #8756e4 baby shit green #889717 brownish pink #c27e79 dark aquamarine #017371 diarrhea #9f8303 light mustard #f7d560 pale sky blue #bdf6fe turtle green #75b84f bright olive #9cbb04 dark grey blue #29465b greeny brown #696006 lemon green #adf802 light periwinkle #c1c6fc seaweed green #35ad6b sunshine yellow #fffd37 ugly purple #a442a0 medium pink #f36196 puke brown #947706 very light pink #fff4f2 viridian #1e9167 bile #b5c306 faded yellow #feff7f very pale green #cffdbc vibrant green #0add08 bright lime #87fd05 spearmint #1ef876 light aquamarine #7bfdc7 light sage #bcecac # yellowgreen #bbf90f baby poo #ab9004 dark seafoam #1fb57a deep teal #00555a heather #a484ac rust orange #c45508 dirty blue #3f829d fern green #548d44 bright lilac #c95efb weird green #3ae57f peacock blue #016795 avocado green #87a922 faded orange #f0944d grape purple #5d1451 hot green #25ff29 lime yellow #d0fe1d mango #ffa62b shamrock #01b44c bubblegum #ff6cb5 purplish brown #6b4247 vomit yellow #c7c10c pale cyan #b7fffa key lime #aeff6e tomato red #ec2d01 # lightgreen #76ff7b merlot #730039 night blue #040348 purpleish pink #df4ec8 apple #6ecb3c baby poop green #8f9805 green apple #5edc1f heliotrope #d94ff5 yellow/green #c8fd3d almost black #070d0d cool blue #4984b8 leafy green #51b73b mustard brown #ac7e04 dusk #4e5481 dull brown #876e4b frog green #58bc08 vivid green #2fef10 bright light green #2dfe54 fluro green #0aff02 kiwi #9cef43 seaweed #18d17b navy green #35530a ultramarine blue #1805db iris #6258c4 pastel orange #ff964f yellowish orange #ffab0f perrywinkle #8f8ce7 tealish #24bca8 dark plum #3f012c pear #cbf85f pinkish orange #ff724c midnight purple #280137 light urple #b36ff6 dark mint #48c072 greenish tan #bccb7a light burgundy #a8415b turquoise blue #06b1c4 ugly pink #cd7584 sandy #f1da7a electric pink #ff0490 muted purple #805b87 mid green #50a747 greyish #a8a495 neon yellow #cfff04 banana #ffff7e carnation pink #ff7fa7 # tomato #ef4026 sea #3c9992 muddy brown #886806 turquoise green #04f489 buff #fef69e fawn #cfaf7b muted blue #3b719f pale rose #fdc1c5 dark mint green #20c073 amethyst #9b5fc0 blue/green #0f9b8e chestnut #742802 sick green #9db92c pea #a4bf20 rusty orange #cd5909 stone #ada587 rose red #be013c pale aqua #b8ffeb deep orange #dc4d01 earth #a2653e mossy green #638b27 grassy green #419c03 pale lime green #b1ff65 light grey blue #9dbcd4 pale grey #fdfdfe asparagus #77ab56 blueberry #464196 purple red #990147 pale lime #befd73 greenish teal #32bf84 caramel #af6f09 deep magenta #a0025c light peach #ffd8b1 milk chocolate #7f4e1e ocher #bf9b0c off green #6ba353 purply pink #f075e6 # lightblue #7bc8f6 dusky blue #475f94 golden #f5bf03 light beige #fffeb6 butter yellow #fffd74 dusky purple #895b7b french blue #436bad ugly yellow #d0c101 greeny yellow #c6f808 orangish red #f43605 shamrock green #02c14d orangish brown #b25f03 tree green #2a7e19 deep violet #490648 gunmetal #536267 blue/purple #5a06ef cherry #cf0234 sandy brown #c4a661 warm grey #978a84 dark indigo #1f0954 midnight #03012d bluey green #2bb179 grey pink #c3909b soft purple #a66fb5 blood #770001 brown red #922b05 medium grey #7d7f7c berry #990f4b poo #8f7303 purpley pink #c83cb9 light salmon #fea993 snot #acbb0d easter purple #c071fe light yellow green #ccfd7f dark navy blue #00022e drab #828344 light rose #ffc5cb rouge #ab1239 purplish red #b0054b slime green #99cc04 baby poop #937c00 irish green #019529 pink/purple #ef1de7 dark navy #000435 greeny blue #42b395 light plum #9d5783 pinkish grey #c8aca9 dirty orange #c87606 rust red #aa2704 pale lilac #e4cbff orangey red #fa4224 primary blue #0804f9 kermit green #5cb200 brownish purple #76424e murky green #6c7a0e # wheat #fbdd7e very dark purple #2a0134 bottle green #044a05 watermelon #fd4659 deep sky blue #0d75f8 fire engine red #fe0002 yellow ochre #cb9d06 pumpkin orange #fb7d07 pale olive #b9cc81 light lilac #edc8ff lightish green #61e160 carolina blue #8ab8fe mulberry #920a4e shocking pink #fe02a2 auburn #9a3001 bright lime green #65fe08 celadon #befdb7 pinkish brown #b17261 poo brown #885f01 bright sky blue #02ccfe celery #c1fd95 dirt brown #836539 strawberry #fb2943 dark lime #84b701 copper #b66325 medium brown #7f5112 muted green #5fa052 robin's egg #6dedfd bright aqua #0bf9ea bright lavender #c760ff # ivory #ffffcb very light purple #f6cefc light navy #155084 pink red #f5054f olive brown #645403 poop brown #7a5901 mustard green #a8b504 ocean green #3d9973 very dark blue #000133 dusty green #76a973 light navy blue #2e5a88 minty green #0bf77d adobe #bd6c48 barney #ac1db8 jade green #2baf6a bright light blue #26f7fd light lime #aefd6c dark khaki #9b8f55 orange yellow #ffad01 ocre #c69c04 maize #f4d054 faded pink #de9dac british racing green #05480d sandstone #c9ae74 mud brown #60460f light sea green #98f6b0 robin egg blue #8af1fe aqua marine #2ee8bb dark sea green #11875d soft pink #fdb0c0 orangey brown #b16002 cherry red #f7022a burnt yellow #d5ab09 brownish grey #86775f camel #c69f59 purplish grey #7a687f marine #042e60 greyish pink #c88d94 pale turquoise #a5fbd5 pastel yellow #fffe71 bluey purple #6241c7 canary yellow #fffe40 faded red #d3494e sepia #985e2b coffee #a6814c bright magenta #ff08e8 mocha #9d7651 ecru #feffca purpleish #98568d cranberry #9e003a darkish green #287c37 brown orange #b96902 dusky rose #ba6873 melon #ff7855 sickly green #94b21c # silver #c5c9c7 purply blue #661aee purpleish blue #6140ef hospital green #9be5aa shit brown #7b5804 mid blue #276ab3 amber #feb308 easter green #8cfd7e soft blue #6488ea cerulean blue #056eee golden brown #b27a01 bright turquoise #0ffef9 red pink #fa2a55 red purple #820747 greyish brown #7a6a4f vermillion #f4320c russet #a13905 steel grey #6f828a lighter purple #a55af4 bright violet #ad0afd prussian blue #004577 slate green #658d6d dirty pink #ca7b80 dark blue green #005249 pine #2b5d34 yellowy green #bff128 dark gold #b59410 bluish #2976bb darkish blue #014182 dull red #bb3f3f pinky red #fc2647 bronze #a87900 pale teal #82cbb2 military green #667c3e barbie pink #fe46a5 bubblegum pink #fe83cc pea soup green #94a617 dark mustard #a88905 shit #7f5f00 medium purple #9e43a2 very dark green #062e03 dirt #8a6e45 dusky pink #cc7a8b red violet #9e0168 lemon yellow #fdff38 pistachio #c0fa8b dull yellow #eedc5b dark lime green #7ebd01 denim blue #3b5b92 teal blue #01889f lightish blue #3d7afd purpley blue #5f34e7 light indigo #6d5acf swamp green #748500 brown green #706c11 dark maroon #3c0008 hot purple #cb00f5 dark forest green #002d04 faded blue #658cbb drab green #749551 light lime green #b9ff66 snot green #9dc100 yellowish #faee66 light blue green #7efbb3 bordeaux #7b002c light mauve #c292a1 ocean #017b92 marigold #fcc006 muddy green #657432 dull orange #d8863b steel #738595 electric purple #aa23ff fluorescent green #08ff08 yellowish brown #9b7a01 blush #f29e8e soft green #6fc276 bright orange #ff5b00 lemon #fdff52 purple grey #866f85 acid green #8ffe09 pale lavender #eecffe violet blue #510ac9 light forest green #4f9153 burnt red #9f2305 khaki green #728639 cerise #de0c62 faded purple #916e99 apricot #ffb16d dark olive green #3c4d03 grey brown #7f7053 green grey #77926f true blue #010fcc pale violet #ceaefa periwinkle blue #8f99fb light sky blue #c6fcff blurple #5539cc green brown #544e03 bluegreen #017a79 bright teal #01f9c6 brownish yellow #c9b003 pea soup #929901 forest #0b5509 barney purple #a00498 ultramarine #2000b1 purplish #94568c puke yellow #c2be0e bluish grey #748b97 dark periwinkle #665fd1 dark lilac #9c6da5 reddish #c44240 light maroon #a24857 dusty purple #825f87 terra cotta #c9643b avocado #90b134 marine blue #01386a teal green #25a36f slate grey #59656d lighter green #75fd63 electric green #21fc0d dusty blue #5a86ad golden yellow #fec615 bright yellow #fffd01 light lavender #dfc5fe umber #b26400 poop #7f5e00 dark peach #de7e5d jungle green #048243 eggshell #ffffd4 denim #3b638c yellow brown #b79400 dull purple #84597e chocolate brown #411900 wine red #7b0323 neon blue #04d9ff dirty green #667e2c light tan #fbeeac ice blue #d7fffe cadet blue #4e7496 dark mauve #874c62 very light blue #d5ffff grey purple #826d8c pastel pink #ffbacd very light green #d1ffbd dark sky blue #448ee4 evergreen #05472a dull pink #d5869d aubergine #3d0734 mahogany #4a0100 reddish orange #f8481c deep green #02590f vomit green #89a203 purple pink #e03fd8 dusty pink #d58a94 faded green #7bb274 camo green #526525 pinky purple #c94cbe pink purple #db4bda brownish red #9e3623 dark rose #b5485d mud #735c12 brownish #9c6d57 emerald green #028f1e pale brown #b1916e dull blue #49759c burnt umber #a0450e medium green #39ad48 clay #b66a50 light aqua #8cffdb light olive green #a4be5c brownish orange #cb7723 dark aqua #05696b purplish pink #ce5dae dark salmon #c85a53 greenish grey #96ae8d jade #1fa774 ugly green #7a9703 dark beige #ac9362 emerald #01a049 pale red #d9544d light magenta #fa5ff7 sky #82cafc light cyan #acfffc yellow orange #fcb001 reddish purple #910951 reddish pink #fe2c54 # orchid #c875c4 dirty yellow #cdc50a orange red #fd411e deep red #9a0200 orange brown #be6400 cobalt blue #030aa7 neon pink #fe019a rose pink #f7879a greyish purple #887191 raspberry #b00149 aqua green #12e193 salmon pink #fe7b7c tangerine #ff9408 brownish green #6a6e09 red brown #8b2e16 greenish brown #696112 pumpkin #e17701 pine green #0a481e charcoal #343837 baby pink #ffb7ce cornflower #6a79f7 blue violet #5d06e9 # chocolate #3d1c02 greyish green #82a67d scarlet #be0119 green yellow #c9ff27 dark olive #373e02 # sienna #a9561e pastel purple #caa0ff terracotta #ca6641 aqua blue #02d8e9 sage green #88b378 blood red #980002 deep pink #cb0162 grass #5cac2d moss #769958 pastel blue #a2bffe bluish green #10a674 green blue #06b48b dark tan #af884a greenish blue #0b8b87 pale orange #ffa756 vomit #a2a415 forrest green #154406 dark lavender #856798 dark violet #34013f purple blue #632de9 dark cyan #0a888a olive drab #6f7632 pinkish #d46a7e cobalt #1e488f neon purple #bc13fe light turquoise #7ef4cc apple green #76cd26 dull green #74a662 wine #80013f powder blue #b1d1fc off white #ffffe4 electric blue #0652ff dark turquoise #045c5a blue purple #5729ce # azure #069af3 bright red #ff000d pinkish red #f10c45 cornflower blue #5170d7 light olive #acbf69 grape #6c3461 greyish blue #5e819d purplish blue #601ef9 yellowish green #b0dd16 greenish yellow #cdfd02 medium blue #2c6fbb dusty rose #c0737a light violet #d6b4fc midnight blue #020035 bluish purple #703be7 red orange #fd3c06 dark magenta #960056 greenish #40a368 ocean blue #03719c # coral #fc5a50 cream #ffffc2 reddish brown #7f2b0a burnt sienna #b04e0f brick #a03623 sage #87ae73 grey green #789b73 # white #ffffff robin's egg blue #98eff9 moss green #658b38 steel blue #5a7d9a eggplant #380835 light yellow #fffe7a leaf green #5ca904 light grey #d8dcd6 puke #a5a502 pinkish purple #d648d7 sea blue #047495 pale purple #b790d4 slate blue #5b7c99 blue grey #607c8e hunter green #0b4008 # fuchsia #ed0dd9 # crimson #8c000f pale yellow #ffff84 ochre #bf9005 mustard yellow #d2bd0a light red #ff474c cerulean #0485d1 pale pink #ffcfdc deep blue #040273 rust #a83c09 light teal #90e4c1 slate #516572 # goldenrod #fac205 dark yellow #d5b60a dark grey #363737 army green #4b5d16 grey blue #6b8ba4 seafoam #80f9ad puce #a57e52 spring green #a9f971 dark orange #c65102 sand #e2ca76 pastel green #b0ff9d mint #9ffeb0 light orange #fdaa48 bright pink #fe01b1 # chartreuse #c1f80a deep purple #36013f dark brown #341c02 taupe #b9a281 pea green #8eab12 puke green #9aae07 kelly green #02ab2e seafoam green #7af9ab blue green #137e6d # khaki #aaa662 burgundy #610023 dark teal #014d4e brick red #8f1402 royal purple #4b006e # plum #580f41 mint green #8fff9f # gold #dbb40c baby blue #a2cffe yellow green #c0fb2d bright purple #be03fd dark red #840000 pale blue #d0fefe grass green #3f9b0b # navy #01153e # aquamarine #04d8b2 burnt orange #c04e01 neon green #0cff0c bright blue #0165fc rose #cf6275 light pink #ffd1df mustard #ceb301 # indigo #380282 # lime #aaff32 sea green #53fca1 periwinkle #8e82fe dark pink #cb416b olive green #677a04 peach #ffb07c pale green #c7fdb5 light brown #ad8150 hot pink #ff028d # black #000000 lilac #cea2fd navy blue #001146 royal blue #0504aa # beige #e6daa6 # salmon #ff796c # olive #6e750e # maroon #650021 bright green #01ff07 dark purple #35063e mauve #ae7181 forest green #06470c # aqua #13eac9 # cyan #00ffff # tan #d1b26f dark blue #00035b # lavender #c79fef # turquoise #06c2ac dark green #033500 # violet #9a0eea light purple #bf77f6 lime green #89fe05 # grey #929591 sky blue #75bbfd # yellow #ffff14 # magenta #c20078 light green #96f97b # orange #f97306 # teal #029386 # light blue #95d0fc # red #e50000 # brown #653700 # pink #ff81c0 # blue #0343df # green #15b01a # purple #7e1e9c tint-1.0.1/tests/sort.rs01006440000765000002400000001522131706667360013424 0ustar0000000000000000 extern crate tint; fn by_rgb(a: &str, b: &str) -> std::cmp::Ordering { let ca = tint::Color::from(a); let cb = tint::Color::from(b); tint::compare_by_rgb(&ca, &cb) } fn by_hsv(a: &str, b: &str) -> std::cmp::Ordering { let ca = tint::Color::from(a); let cb = tint::Color::from(b); tint::compare_by_hsv(&ca, &cb) } #[test] fn sort_rgb() { let mut keys = tint::names(); keys.sort_by(|a, b| by_rgb(a,b)); for k in keys.iter() { let c = tint::Color::from(k); println!("{:20}: {} {}", k, c, c.to_hex()); } } #[test] fn sort_hue() { let mut keys = tint::names(); keys.sort_by(|a, b| by_hsv(a,b)); for k in keys.iter() { let c = tint::Color::from(k); let hsv = c.to_hsv(); println!("{:20}: {} {} {:.3} {:.3} {:.3}", k, c, c.to_hex(), hsv.0,hsv.1,hsv.2); } } tint-1.0.1/tests/table.rs01006440000765000002400000000676131706670330013524 0ustar0000000000000000 extern crate tint; #[test] fn table() { println!("| Name | Color |"); println!("|----------------------|--------------------------------------------------------|"); for name in tint::names() { let color = tint::Color::from(&name); println!("| {name:20} | ![{hex}](https://placehold.it/100x15/{hex}?text=+) |", name=name, hex=color.to_hex()); } }