summaryrefslogtreecommitdiff
path: root/docs/assets/js/cielab.js
blob: 14c096f73d80a305bc716cbc0aca7d0a8a4b91ce (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
63
64
65
66
67
68
69
70
var cielab = (function(){
  var cielab = {}
  
  var xyz = [0,0,0]
  var rgb = [0,0,0]

  L_range = [0, 100]
  a_range = [-86.185, 98.254]
  b_range = [-107.863, 94.482]
  
  cielab.gradient = function (n) {
    n = n || 100
    var k = 0
    
    var L, a, b
    
    var L0 = randrange(L_range[0] + 50, L_range[1])
    var L1 = randrange(L_range[0]+ 50, L_range[1])
    var a0 = randrange(a_range[0], a_range[1])
    var a1 = randrange(a_range[0], a_range[1])
    var b0 = randrange(b_range[0], b_range[1])
    var b1 = randrange(b_range[0], b_range[1])
    return function next (aa){
      L = mix(k/n, L0, L1)
      a = mix(k/n, a0, a1)
      b = mix(k/n, b0, b1)
      rgb = xyz2rgb(hunterlab2xyz(L, a, b))
      k += 1
      return rgba_string(rgb, aa)
    }
  }
  function rgba_string (rgb, a) { return "rgba(" + rgb.map(Math.round).join(",")  + "," + a + ")" }
  function hex_string (rgb) { return "#" + rgb.map(Math.round).map(function(n){ var s = n.toString(16); return s.length == 1 ? "0"+s : s }).join("") }

  function mix(n,a,b){ return n*a + (1-n)*b }
  function clamp(n,a,b){ return n<a?a:n<b?n:b }
  function hunterlab2xyz (L,a,b) {
    var_Y = L / 10
    var_X = a / 17.5 * L / 10
    var_Z = b / 7 * L / 10

    Y = Math.pow(var_Y, 2)
    X = ( var_X + Y ) / 1.02
    Z = -( var_Z - Y ) / 0.847
    xyz = [X,Y,Z]
  }
  function xyz2rgb(){
    var var_X = xyz[0] / 100        //X from 0 to  95.047      (Observer = 2°, Illuminant = D65)
    var var_Y = xyz[1] / 100        //Y from 0 to 100.000
    var var_Z = xyz[2] / 100        //Z from 0 to 108.883

    var_R = var_X *  3.2406 + var_Y * -1.5372 + var_Z * -0.4986
    var_G = var_X * -0.9689 + var_Y *  1.8758 + var_Z *  0.0415
    var_B = var_X *  0.0557 + var_Y * -0.2040 + var_Z *  1.0570

    if ( var_R > 0.0031308 ) var_R = 1.055 * Math.pow( var_R, 1 / 2.4 ) - 0.055
    else                     var_R = 12.92 * var_R
    if ( var_G > 0.0031308 ) var_G = 1.055 * Math.pow( var_G, 1 / 2.4 ) - 0.055
    else                     var_G = 12.92 * var_G
    if ( var_B > 0.0031308 ) var_B = 1.055 * Math.pow( var_B, 1 / 2.4 ) - 0.055
    else                     var_B = 12.92 * var_B

    rgb[0] = clamp(var_R * 255, 0, 255)
    rgb[1] = clamp(var_G * 255, 0, 255)
    rgb[2] = clamp(var_B * 255, 0, 255)
    return rgb
  }

  return cielab
})()