Created
December 13, 2012 00:20
-
-
Save anonymous/4272953 to your computer and use it in GitHub Desktop.
CoffeeScript Color parser
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
PopKit.Color = SC.Object.extend SC.Copyable, | |
rgb: (-> | |
PopKit.Color.hsbToRgb(@get("hsb")) | |
).property("hsb") | |
copy: -> PopKit.Color.create(hsb: @get("hsb")) | |
PopKit.Color.reopenClass | |
hsbToRgb: (hsb) -> | |
[h, s, b] = hsb | |
br = Math.round(b / 100 * 255) | |
if s == 0 | |
[br, br, br] | |
else | |
hue = h % 360 | |
f = hue % 60 | |
p = Math.round((hsb[2] * (100 - s)) / 10000 * 255) | |
q = Math.round((hsb[2] * (6000 - s * f)) / 600000 * 255) | |
t = Math.round((hsb[2] * (6000 - s * (60 - f))) / 600000 * 255) | |
switch Math.floor(hue / 60) | |
when 0 then [br, t, p] | |
when 1 then [q, br, p] | |
when 2 then [p, br, t] | |
when 3 then [p, q, br] | |
when 4 then [t, p, br] | |
when 5 then [br, p, q] | |
else false | |
rgbToHsb: (rgb) -> | |
[red, green, blue] = rgb | |
hue = 0 | |
max = Math.max(red, green, blue) | |
min = Math.min(red, green, blue) | |
delta = max - min | |
brightness = max / 255 | |
saturation = if (max != 0) then (delta / max) else 0 | |
if saturation != 0 | |
rr = (max - red) / delta | |
gr = (max - green) / delta | |
br = (max - blue) / delta | |
if (red == max) | |
hue = br - gr | |
else if (green == max) | |
hue = 2 + rr - br | |
else | |
hue = 4 + gr - rr | |
hue /= 6 | |
if (hue < 0) | |
hue++ | |
[ | |
Math.round(hue * 360) | |
Math.round(saturation * 100) | |
Math.round(brightness * 100) | |
] | |
hexToRgba: (hexString) -> | |
hex = hexString.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})(\w{1,2})?$/) | |
hex[4] ||= "ff" | |
parts = for part in hex.slice(1) | |
part += part if part.length == 1 | |
parseInt(part, 16) | |
nameMap: | |
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" | |
nameToRgba: (name) -> | |
@hexToRgba(@nameMap[name]) | |
rgbToHex: (args...) -> | |
args[3] = Math.ceil(args[3] * 255) if args[3] | |
hex = for arg in args | |
bit = (arg - 0).toString(16) | |
if (bit.length == 1) | |
"0#{bit}" | |
else | |
bit | |
"##{hex.join('')}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment