2013-09-30 07:44:31 +00:00
|
|
|
Elm.Native.Color = {};
|
|
|
|
Elm.Native.Color.make = function(elm) {
|
2013-10-10 19:14:01 +00:00
|
|
|
elm.Native = elm.Native || {};
|
|
|
|
elm.Native.Color = elm.Native.Color || {};
|
|
|
|
if (elm.Native.Color.values) return elm.Native.Color.values;
|
2013-03-09 08:22:42 +00:00
|
|
|
|
2013-10-10 19:14:01 +00:00
|
|
|
var Utils = Elm.Native.Utils.make(elm);
|
2013-05-17 20:46:08 +00:00
|
|
|
|
2014-03-02 04:08:38 +00:00
|
|
|
function toCss(c) {
|
|
|
|
return (c._3 === 1)
|
|
|
|
? ('rgb(' + c._0 + ', ' + c._1 + ', ' + c._2 + ')')
|
|
|
|
: ('rgba(' + c._0 + ', ' + c._1 + ', ' + c._2 + ', ' + c._3 + ')');
|
|
|
|
}
|
|
|
|
|
2013-10-10 19:14:01 +00:00
|
|
|
function complement(rgb) {
|
|
|
|
var hsv = toHSV(rgb);
|
|
|
|
hsv.hue = (hsv.hue + 180) % 360;
|
|
|
|
return toRGB(hsv);
|
|
|
|
}
|
2013-02-10 11:58:40 +00:00
|
|
|
|
2013-10-10 19:14:01 +00:00
|
|
|
function hsva(h,s,v,a) {
|
|
|
|
var degree = A2(Utils.mod, h * 180 / Math.PI, 360);
|
|
|
|
var clr = toRGB({hue:degree, saturation:s, value:v});
|
|
|
|
clr._3 = a;
|
|
|
|
return clr;
|
|
|
|
}
|
2013-02-10 11:58:40 +00:00
|
|
|
|
2013-10-10 19:14:01 +00:00
|
|
|
function hsv(h,s,v) {
|
|
|
|
var degree = A2(Utils.mod, h * 180 / Math.PI, 360);
|
|
|
|
return toRGB({hue:degree, saturation:s, value:v});
|
|
|
|
}
|
2013-02-10 11:58:40 +00:00
|
|
|
|
2013-10-10 19:14:01 +00:00
|
|
|
function toHSV(rgb) {
|
|
|
|
var hsv = {};
|
|
|
|
var r = rgb._0 / 255.0, g = rgb._1 / 255.0, b = rgb._2 / 255.0;
|
|
|
|
var M = Math.max(r,g,b);
|
|
|
|
var m = Math.min(r,g,b);
|
|
|
|
var c = M - m;
|
2013-02-10 11:58:40 +00:00
|
|
|
|
2013-10-10 19:14:01 +00:00
|
|
|
var h = 0;
|
|
|
|
if (c === 0) { h = 0; }
|
|
|
|
else if (M === r) { h = ((g - b) / c) % 6; }
|
|
|
|
else if (M === g) { h = ((b - r) / c) + 2; }
|
|
|
|
else if (M === b) { h = ((r - g) / c) + 4; }
|
|
|
|
h *= 60;
|
2013-02-10 11:58:40 +00:00
|
|
|
|
2013-10-10 19:14:01 +00:00
|
|
|
return { value : M, hue : h, saturation : (M === 0 ? 0 : c / M) };
|
|
|
|
}
|
2013-02-10 11:58:40 +00:00
|
|
|
|
2013-10-10 19:14:01 +00:00
|
|
|
function between(lo,hi,x) { return lo <= x && x < hi; }
|
|
|
|
function norm(n) { return Math.round(n*255); }
|
2013-02-10 11:58:40 +00:00
|
|
|
|
2013-10-10 19:14:01 +00:00
|
|
|
function toRGB(hsv) {
|
|
|
|
var c = hsv.value * hsv.saturation;
|
|
|
|
var hue = hsv.hue / 60;
|
|
|
|
var x = c * (1 - Math.abs((hue % 2) - 1));
|
|
|
|
var r = 0, g = 0, b = 0;
|
|
|
|
if (between(0,1,hue)) { r = c; g = x; b = 0; }
|
|
|
|
else if (between(1,2,hue)) { r = x; g = c; b = 0; }
|
|
|
|
else if (between(2,3,hue)) { r = 0; g = c; b = x; }
|
|
|
|
else if (between(3,4,hue)) { r = 0; g = x; b = c; }
|
|
|
|
else if (between(4,5,hue)) { r = x; g = 0; b = c; }
|
|
|
|
else if (between(5,6,hue)) { r = c; g = 0; b = x; }
|
2013-02-10 11:58:40 +00:00
|
|
|
|
2013-10-10 19:14:01 +00:00
|
|
|
var m = hsv.value - c;
|
|
|
|
return { ctor:"Color", _0:norm(r+m), _1:norm(g+m), _2:norm(b+m), _3:1 };
|
|
|
|
}
|
2013-02-10 11:58:40 +00:00
|
|
|
|
2013-10-10 19:14:01 +00:00
|
|
|
return elm.Native.Color.values = {
|
|
|
|
hsva:F4(hsva),
|
|
|
|
hsv:F3(hsv),
|
2014-03-02 04:08:38 +00:00
|
|
|
complement:complement,
|
|
|
|
toCss:toCss
|
2013-10-10 19:14:01 +00:00
|
|
|
};
|
2013-03-02 17:18:36 +00:00
|
|
|
|
2014-03-02 04:08:38 +00:00
|
|
|
};
|