on c136ea7 help sign in
elk/core/Native/Color.js
68 lines 1.9 kB history raw
1/**
2module Native.Color where
3**/
5(function() {
6"use strict";
8function extract(c) {
9 if (c._3 === 1) { return 'rgb(' + c._0 + ',' + c._1 + ',' + c._2 + ')'; }
10 return 'rgba(' + c._0 + ',' + c._1 + ',' + c._2 + ',' + c._3 + ')';
12function complement(rgb) {
13 var hsv = toHSV(rgb);
14 hsv.hue = (hsv.hue + 180) % 360;
15 return toRGB(hsv);
18function hsva(h) { return function(s) { return function(v) { return function(a) {
19 var clr = toRGB({hue:h, saturation:s, value:v});
20 clr._3 = a;
21 return clr;
22 }; }; };
25function hsv(h) { return function(s) { return function(v) {
26 return toRGB({hue:h, saturation:s, value:v}); }; }; }
28function toHSV(rgb) {
29 var hsv = {};
30 var r = rgb._0 / 255.0, g = rgb._1 / 255.0, b = rgb._2 / 255.0;
31 var M = Math.max(r,g,b);
32 var m = Math.min(r,g,b);
33 var c = M - m;
35 var h = 0;
36 if (c === 0) { h = 0; }
37 else if (M === r) { h = ((g - b) / c) % 6; }
38 else if (M === g) { h = ((b - r) / c) + 2; }
39 else if (M === b) { h = ((r - g) / c) + 4; }
40 h *= 60;
42 return { value : M, hue : h, saturation : (M === 0 ? 0 : c / M) };
45function between(lo,hi,x) { return lo <= x && x < hi; }
46function norm(n) { return Math.round(n*255); }
48function toRGB(hsv) {
49 var c = hsv.value * hsv.saturation;
50 var hue = hsv.hue / 60;
51 var x = c * (1 - Math.abs((hue % 2) - 1));
52 var r = 0, g = 0, b = 0;
53 if (between(0,1,hue)) { r = c; g = x; b = 0; }
54 else if (between(1,2,hue)) { r = x; g = c; b = 0; }
55 else if (between(2,3,hue)) { r = 0; g = c; b = x; }
56 else if (between(3,4,hue)) { r = 0; g = x; b = c; }
57 else if (between(4,5,hue)) { r = x; g = 0; b = c; }
58 else if (between(5,6,hue)) { r = c; g = 0; b = x; }
60 var m = hsv.value - c;
61 return { ctor:"Color", _0:norm(r+m), _1:norm(g+m), _2:norm(b+m), _3:1 };
64Elm.Native.Color = {hsva:hsva,
65 hsv:hsv,
66 complement:complement,
67 extract:extract};
68}());