summaryrefslogtreecommitdiff
path: root/static/js/colorutils.js
blob: 9bba39ad2a247042b73c0822ea2c51557b81d6cf (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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
 * This code is mostly from the old Etherpad. Please help us to comment this code. 
 * This helps other people to understand this code better and helps them to improve it.
 * TL;DR COMMENTS ON THIS FILE ARE HIGHLY APPRECIATED
 */

// DO NOT EDIT THIS FILE, edit infrastructure/ace/www/colorutils.js
// THIS FILE IS ALSO SERVED AS CLIENT-SIDE JS
/**
 * Copyright 2009 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS-IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

var colorutils = {};

// "#ffffff" or "#fff" or "ffffff" or "fff" to [1.0, 1.0, 1.0]
colorutils.css2triple = function(cssColor)
{
  var sixHex = colorutils.css2sixhex(cssColor);

  function hexToFloat(hh)
  {
    return Number("0x" + hh) / 255;
  }
  return [hexToFloat(sixHex.substr(0, 2)), hexToFloat(sixHex.substr(2, 2)), hexToFloat(sixHex.substr(4, 2))];
}

// "#ffffff" or "#fff" or "ffffff" or "fff" to "ffffff"
colorutils.css2sixhex = function(cssColor)
{
  var h = /[0-9a-fA-F]+/.exec(cssColor)[0];
  if (h.length != 6)
  {
    var a = h.charAt(0);
    var b = h.charAt(1);
    var c = h.charAt(2);
    h = a + a + b + b + c + c;
  }
  return h;
}

// [1.0, 1.0, 1.0] -> "#ffffff"
colorutils.triple2css = function(triple)
{
  function floatToHex(n)
  {
    var n2 = colorutils.clamp(Math.round(n * 255), 0, 255);
    return ("0" + n2.toString(16)).slice(-2);
  }
  return "#" + floatToHex(triple[0]) + floatToHex(triple[1]) + floatToHex(triple[2]);
}


colorutils.clamp = function(v, bot, top)
{
  return v < bot ? bot : (v > top ? top : v);
};
colorutils.min3 = function(a, b, c)
{
  return (a < b) ? (a < c ? a : c) : (b < c ? b : c);
};
colorutils.max3 = function(a, b, c)
{
  return (a > b) ? (a > c ? a : c) : (b > c ? b : c);
};
colorutils.colorMin = function(c)
{
  return colorutils.min3(c[0], c[1], c[2]);
};
colorutils.colorMax = function(c)
{
  return colorutils.max3(c[0], c[1], c[2]);
};
colorutils.scale = function(v, bot, top)
{
  return colorutils.clamp(bot + v * (top - bot), 0, 1);
};
colorutils.unscale = function(v, bot, top)
{
  return colorutils.clamp((v - bot) / (top - bot), 0, 1);
};

colorutils.scaleColor = function(c, bot, top)
{
  return [colorutils.scale(c[0], bot, top), colorutils.scale(c[1], bot, top), colorutils.scale(c[2], bot, top)];
}

colorutils.unscaleColor = function(c, bot, top)
{
  return [colorutils.unscale(c[0], bot, top), colorutils.unscale(c[1], bot, top), colorutils.unscale(c[2], bot, top)];
}

colorutils.luminosity = function(c)
{
  // rule of thumb for RGB brightness; 1.0 is white
  return c[0] * 0.30 + c[1] * 0.59 + c[2] * 0.11;
}

colorutils.saturate = function(c)
{
  var min = colorutils.colorMin(c);
  var max = colorutils.colorMax(c);
  if (max - min <= 0) return [1.0, 1.0, 1.0];
  return colorutils.unscaleColor(c, min, max);
}

colorutils.blend = function(c1, c2, t)
{
  return [colorutils.scale(t, c1[0], c2[0]), colorutils.scale(t, c1[1], c2[1]), colorutils.scale(t, c1[2], c2[2])];
}

exports.colorutils = colorutils;