summaryrefslogtreecommitdiff
path: root/client/lib/color.js
blob: 4299c4b8ad087b0a868bbee55928d475c7431dab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
const palettes = [
  [[0.5, 0.5, 0.5], [0.5, 0.5, 0.5], [1.0, 1.0, 1.0], [0.00, 0.33, 0.67]],
  [[0.5, 0.5, 0.5], [0.5, 0.5, 0.5], [1.0, 1.0, 1.0], [0.00, 0.10, 0.20]],
  [[0.5, 0.5, 0.5], [0.5, 0.5, 0.5], [1.0, 1.0, 1.0], [0.30, 0.20, 0.20]],
  [[0.5, 0.5, 0.5], [0.5, 0.5, 0.5], [1.0, 1.0, 0.5], [0.80, 0.90, 0.30]],
  [[0.5, 0.5, 0.5], [0.5, 0.5, 0.5], [1.0, 0.7, 0.4], [0.00, 0.15, 0.20]],
  [[0.5, 0.5, 0.5], [0.5, 0.5, 0.5], [2.0, 1.0, 0.0], [0.50, 0.20, 0.25]],
  [[0.8, 0.5, 0.4], [0.2, 0.4, 0.2], [2.0, 1.0, 1.0], [0.00, 0.25, 0.25]],
]

let palette = palettes[0]

function channel (t, a, b, c, d, add, mul) {
  return a + b * Math.cos(2 * Math.PI * (c * t + d)) * mul + add
}

function color (t, add, mul, alpha) {
  add = add || 0
  mul = mul || 1
  let a, b, c, d
  const rgb = []
  for (var i = 0; i < 3; i++) {
    a = palette[0][i]
    b = palette[1][i]
    c = palette[2][i]
    d = palette[3][i]
    rgb[i] = Math.round(channel(t, a, b, c, d, add, mul) * 255)
  }
  return 'rgba(' + rgb + ',' + alpha + ')'
}

function hsl2rgb (H, S, L) {
  var R,G,B;
  var var_1, var_2;
  if ( S == 0 ) {                     //HSL from 0 to 1
     R = L * 255                      //RGB results from 0 to 255
     G = L * 255
     B = L * 255
  }
  else {
     if ( L < 0.5 ) var_2 = L * ( 1 + S )
     else           var_2 = ( L + S ) - ( S * L )

     var_1 = 2 * L - var_2

     R = 255 * hue2rgb( var_1, var_2, H + ( 1 / 3 ) ) 
     G = 255 * hue2rgb( var_1, var_2, H )
     B = 255 * hue2rgb( var_1, var_2, H - ( 1 / 3 ) )
  }
  return [R,G,B]
}
function hue2rgb( v1, v2, vH ) {
   if ( vH < 0 ) vH += 1
   if ( vH > 1 ) vH -= 1
   if ( ( 6 * vH ) < 1 ) return ( v1 + ( v2 - v1 ) * 6 * vH )
   if ( ( 2 * vH ) < 1 ) return ( v2 )
   if ( ( 3 * vH ) < 2 ) return ( v1 + ( v2 - v1 ) * ( ( 2 / 3 ) - vH ) * 6 )
   return ( v1 )
}

export default { color, hsl2rgb }