Skip to content

Commit

Permalink
Auto merge of #34 - Ogeon:named, r=Ogeon
Browse files Browse the repository at this point in the history
Add color constants

This adds the SVG1.1/CSS3 keyword colors as constants, and a function which maps name strings to them. They are accessible through the `named` module and the documentation shows colored preview rectangles as descriptions. There are even more named colors out there (https://en.wikipedia.org/wiki/List_of_colors:_A%E2%80%93F, for example), but this is a good start.

The whole `named` module can be toggled with the `"named"` feature, and the `named::from_str` function can be toggled with `"named_from_str"`.

This closes #5.
  • Loading branch information
homu committed Feb 3, 2016
2 parents eb44ab1 + a401917 commit f58094f
Show file tree
Hide file tree
Showing 9 changed files with 316 additions and 0 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ branches:
script:
- cargo build -v --features strict
- cargo test -v --features strict
- bash scripts/test_features.sh
- cargo doc
after_success:
- sh scripts/upload_doc.sh
15 changes: 15 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,28 @@ readme = "README.md"
keywords = ["color", "colour", "space", "linear"]
license = "MIT OR Apache-2.0"

build = "build/main.rs"

[features]
default = ["named_from_str"]
named_from_str = ["named", "phf", "phf_codegen"]
named = []

#internal
strict = []

[dependencies]
num = "0.1"

[dependencies.phf]
version = "0.7"
optional = true

[dev-dependencies]
image = "0.4"
approx = "0.1"
clap = "1"

[build-dependencies.phf_codegen]
version = "0.7"
optional = true
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@ Add the following lines to your `Cargo.toml` file:
palette = "0.2"
```

###Optional Features

These features are enabled by default:

* `"named"` - Enables color constants, located in the `named` module.
* `"named_from_str"` - Enables the `named::from_str`, which maps name string to colors.

# Linear?

Colors in, for example, images are often "gamma corrected" or stored in sRGB
Expand Down
8 changes: 8 additions & 0 deletions build/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#[cfg(feature = "phf_codegen")]
extern crate phf_codegen;

mod named;

fn main() {
named::build();
}
54 changes: 54 additions & 0 deletions build/named.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
use std::fs::File;

#[cfg(feature = "named")]
pub fn build() {
use std::path::Path;
use std::io::{Write, BufRead, BufReader};

let out_dir = ::std::env::var("OUT_DIR").unwrap();
let dest_path = Path::new(&out_dir).join("named.rs");

let reader = BufReader::new(File::open("build/svg_colors.txt").expect("could not open svg_colors.txt"));
let mut writer = File::create(dest_path).expect("couldn't create named.rs");
let mut entries = vec![];

for line in reader.lines() {
let line = line.unwrap();
let mut parts = line.split('\t');
let name = parts.next().expect("couldn't get the color name");
let mut rgb = parts.next().expect(&format!("couldn't get color for {}", name)).split(", ");
let red: u8 = rgb.next().and_then(|r| r.trim().parse().ok()).expect(&format!("couldn't get red for {}", name));
let green: u8 = rgb.next().and_then(|r| r.trim().parse().ok()).expect(&format!("couldn't get green for {}", name));
let blue: u8 = rgb.next().and_then(|r| r.trim().parse().ok()).expect(&format!("couldn't get blue for {}", name));

writeln!(writer, "\n///<div style=\"display: inline-block; width: 3em; height: 1em; border: 1px solid black; background: {0};\"></div>", name).unwrap();
writeln!(writer, "pub const {}: (u8, u8, u8) = ({}, {}, {});", name.to_uppercase(), red, green, blue).unwrap();

entries.push((name.to_owned(), name.to_uppercase()));
}

gen_from_str(&mut writer, &entries)
}

#[cfg(feature = "named_from_str")]
fn gen_from_str(writer: &mut File, entries: &[(String, String)]) {
use std::io::Write;

write!(writer, "static COLORS: ::phf::Map<&'static str, (u8, u8, u8)> = ").unwrap();
let mut map = ::phf_codegen::Map::new();
for &(ref key, ref value) in entries {
map.entry(&**key, value);
}
map.build(writer).unwrap();
writeln!(writer, ";").unwrap();
}




#[cfg(not(feature = "named"))]
pub fn build() {}

#[allow(unused)]
#[cfg(not(feature = "named_from_str"))]
fn gen_from_str(_writer: &mut File, _entries: &[(String, String)]) {}
147 changes: 147 additions & 0 deletions build/svg_colors.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
aliceblue 240, 248, 255
antiquewhite 250, 235, 215
aqua 0, 255, 255
aquamarine 127, 255, 212
azure 240, 255, 255
beige 245, 245, 220
bisque 255, 228, 196
black 0, 0, 0
blanchedalmond 255, 235, 205
blue 0, 0, 255
blueviolet 138, 43, 226
brown 165, 42, 42
burlywood 222, 184, 135
cadetblue 95, 158, 160
chartreuse 127, 255, 0
chocolate 210, 105, 30
coral 255, 127, 80
cornflowerblue 100, 149, 237
cornsilk 255, 248, 220
crimson 220, 20, 60
cyan 0, 255, 255
darkblue 0, 0, 139
darkcyan 0, 139, 139
darkgoldenrod 184, 134, 11
darkgray 169, 169, 169
darkgreen 0, 100, 0
darkgrey 169, 169, 169
darkkhaki 189, 183, 107
darkmagenta 139, 0, 139
darkolivegreen 85, 107, 47
darkorange 255, 140, 0
darkorchid 153, 50, 204
darkred 139, 0, 0
darksalmon 233, 150, 122
darkseagreen 143, 188, 143
darkslateblue 72, 61, 139
darkslategray 47, 79, 79
darkslategrey 47, 79, 79
darkturquoise 0, 206, 209
darkviolet 148, 0, 211
deeppink 255, 20, 147
deepskyblue 0, 191, 255
dimgray 105, 105, 105
dimgrey 105, 105, 105
dodgerblue 30, 144, 255
firebrick 178, 34, 34
floralwhite 255, 250, 240
forestgreen 34, 139, 34
fuchsia 255, 0, 255
gainsboro 220, 220, 220
ghostwhite 248, 248, 255
gold 255, 215, 0
goldenrod 218, 165, 32
gray 128, 128, 128
grey 128, 128, 128
green 0, 128, 0
greenyellow 173, 255, 47
honeydew 240, 255, 240
hotpink 255, 105, 180
indianred 205, 92, 92
indigo 75, 0, 130
ivory 255, 255, 240
khaki 240, 230, 140
lavender 230, 230, 250
lavenderblush 255, 240, 245
lawngreen 124, 252, 0
lemonchiffon 255, 250, 205
lightblue 173, 216, 230
lightcoral 240, 128, 128
lightcyan 224, 255, 255
lightgoldenrodyellow 250, 250, 210
lightgray 211, 211, 211
lightgreen 144, 238, 144
lightgrey 211, 211, 211
lightpink 255, 182, 193
lightsalmon 255, 160, 122
lightseagreen 32, 178, 170
lightskyblue 135, 206, 250
lightslategray 119, 136, 153
lightslategrey 119, 136, 153
lightsteelblue 176, 196, 222
lightyellow 255, 255, 224
lime 0, 255, 0
limegreen 50, 205, 50
linen 250, 240, 230
magenta 255, 0, 255
maroon 128, 0, 0
mediumaquamarine 102, 205, 170
mediumblue 0, 0, 205
mediumorchid 186, 85, 211
mediumpurple 147, 112, 219
mediumseagreen 60, 179, 113
mediumslateblue 123, 104, 238
mediumspringgreen 0, 250, 154
mediumturquoise 72, 209, 204
mediumvioletred 199, 21, 133
midnightblue 25, 25, 112
mintcream 245, 255, 250
mistyrose 255, 228, 225
moccasin 255, 228, 181
navajowhite 255, 222, 173
navy 0, 0, 128
oldlace 253, 245, 230
olive 128, 128, 0
olivedrab 107, 142, 35
orange 255, 165, 0
orangered 255, 69, 0
orchid 218, 112, 214
palegoldenrod 238, 232, 170
palegreen 152, 251, 152
paleturquoise 175, 238, 238
palevioletred 219, 112, 147
papayawhip 255, 239, 213
peachpuff 255, 218, 185
peru 205, 133, 63
pink 255, 192, 203
plum 221, 160, 221
powderblue 176, 224, 230
purple 128, 0, 128
red 255, 0, 0
rosybrown 188, 143, 143
royalblue 65, 105, 225
saddlebrown 139, 69, 19
salmon 250, 128, 114
sandybrown 244, 164, 96
seagreen 46, 139, 87
seashell 255, 245, 238
sienna 160, 82, 45
silver 192, 192, 192
skyblue 135, 206, 235
slateblue 106, 90, 205
slategray 112, 128, 144
slategrey 112, 128, 144
snow 255, 250, 250
springgreen 0, 255, 127
steelblue 70, 130, 180
tan 210, 180, 140
teal 0, 128, 128
thistle 216, 191, 216
tomato 255, 99, 71
turquoise 64, 224, 208
violet 238, 130, 238
wheat 245, 222, 179
white 255, 255, 255
whitesmoke 245, 245, 245
yellow 255, 255, 0
yellowgreen 154, 205, 50
45 changes: 45 additions & 0 deletions scripts/test_features.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
set -e

#List of features to test
features=""

#Features that will always be activated
required_features="strict"


#Find features
walking_features=false
current_dependency=""

while read -r line || [[ -n "$line" ]]; do
if [[ "$line" == "[features]" ]]; then
walking_features=true
elif [[ $walking_features == true ]] && [[ "$line" == "#internal" ]]; then
walking_features=false
elif [[ $walking_features == true ]] && echo "$line" | grep -E "^\[.*\]" > /dev/null; then
walking_features=false
elif [[ $walking_features == true ]] && echo "$line" | grep -E ".*=.*" > /dev/null; then
feature="$(echo "$line" | cut -f1 -d"=")"
feature="$(echo -e "${feature}" | tr -d '[[:space:]]')"
if [[ "$feature" != "default" ]]; then
features="$features $feature"
fi
elif echo "$line" | grep -E "^\[dependencies\..*\]" > /dev/null; then
current_dependency="$(echo "$line" | sed 's/.*\[dependencies\.\([^]]*\)\].*/\1/g')"
elif [[ "$line" == "#feature" ]] && [[ "$current_dependency" != "" ]]; then
echo "found dependency feature '$current_dependency'"
features="$features $current_dependency"
fi
done < "Cargo.toml"

echo -e "features: $features\n"

#Test without any optional feature
echo compiling with --no-default-features --features "$required_features"
cargo build --no-default-features --features "$required_features"

#Isolated test of each optional feature
for feature in $features; do
echo compiling with --no-default-features --features "\"$feature $required_features\""
cargo build --no-default-features --features "$feature $required_features"
done
7 changes: 7 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,12 @@
#[cfg(test)]
#[macro_use]
extern crate approx;

extern crate num;

#[cfg(feature = "phf")]
extern crate phf;

use num::{Float, ToPrimitive, NumCast};

use pixel::{Srgb, GammaRgb};
Expand Down Expand Up @@ -276,6 +280,9 @@ macro_rules! assert_ranges {
pub mod gradient;
pub mod pixel;

#[cfg(feature = "named")]
pub mod named;

mod alpha;
mod rgb;
mod luma;
Expand Down
32 changes: 32 additions & 0 deletions src/named.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//!A collection of named color constants. Can be toggled with the `"named"`
//!Cargo feature.
//!
//!They are taken from the [SVG keyword
//!colors](https://www.w3.org/TR/SVG/types.html#ColorKeywords) (same as in
//!CSS3) and they can be used as if they were pixel values:
//!
//!```
//!use palette::Rgb;
//!use palette::pixel::Srgb;
//!use palette::named;
//!
//!//From constant
//!let from_const: Rgb = Srgb::from_pixel(&named::OLIVE).into();
//!
//!//From name string
//!let olive = named::from_str("olive").expect("unknown color");
//!let from_str: Rgb = Srgb::from_pixel(&olive).into();
//!
//!assert_eq!(from_const, from_str);
//!```
include!(concat!(env!("OUT_DIR"), "/named.rs"));

///Get a SVG/CSS3 color by name. Can be toggled with the `"named_from_str"`
///Cargo feature.
///
///The names are the same as the constants, but lower case.
#[cfg(feature = "named_from_str")]
pub fn from_str(name: &str) -> Option<(u8, u8, u8)> {
COLORS.get(name).cloned()
}

0 comments on commit f58094f

Please sign in to comment.