Blame view

node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js 1.38 KB
aaac7fed   liuqimichale   add
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
  // HSL to RGB converter. Both methods adapted from:
  // http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
  
  function hslToRgb(h, s, l) {
    var r, g, b;
  
    // normalize hue orientation b/w 0 and 360 degrees
    h = h % 360;
    if (h < 0)
      h += 360;
    h = ~~h / 360;
  
    if (s < 0)
      s = 0;
    else if (s > 100)
      s = 100;
    s = ~~s / 100;
  
    if (l < 0)
      l = 0;
    else if (l > 100)
      l = 100;
    l = ~~l / 100;
  
    if (s === 0) {
      r = g = b = l; // achromatic
    } else {
      var q = l < 0.5 ?
        l * (1 + s) :
        l + s - l * s;
      var p = 2 * l - q;
      r = hueToRgb(p, q, h + 1/3);
      g = hueToRgb(p, q, h);
      b = hueToRgb(p, q, h - 1/3);
    }
  
    return [~~(r * 255), ~~(g * 255), ~~(b * 255)];
  }
  
  function hueToRgb(p, q, t) {
    if (t < 0) t += 1;
    if (t > 1) t -= 1;
    if (t < 1/6) return p + (q - p) * 6 * t;
    if (t < 1/2) return q;
    if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
    return p;
  }
  
  function shortenHsl(hue, saturation, lightness) {
    var asRgb = hslToRgb(hue, saturation, lightness);
    var redAsHex = asRgb[0].toString(16);
    var greenAsHex = asRgb[1].toString(16);
    var blueAsHex = asRgb[2].toString(16);
  
    return '#' +
      ((redAsHex.length == 1 ? '0' : '') + redAsHex) +
      ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
      ((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
  }
  
  module.exports = shortenHsl;