aboutsummaryrefslogtreecommitdiffstats
path: root/lib/color.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/color.js')
-rw-r--r--lib/color.js236
1 files changed, 236 insertions, 0 deletions
diff --git a/lib/color.js b/lib/color.js
new file mode 100644
index 0000000..2da2fa7
--- /dev/null
+++ b/lib/color.js
@@ -0,0 +1,236 @@
+// Released under the MIT/X11 license
+// http://www.opensource.org/licenses/mit-license.php
+"use strict";
+// ============================================================================
+// Color management methods
+// originally from
+// http://www.mjijackson.com/2008/02\
+// /rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
+var Color = exports.Color = function Color(r, g, b) {
+ this.Luminosity = 0.85;
+ this.Desaturated = 0.4;
+
+ if (r instanceof Array) {
+ this.r = r[0];
+ this.g = r[1];
+ this.b = r[2];
+ } else {
+ this.r = r;
+ this.g = g;
+ this.b = b;
+ }
+}
+
+Color.prototype.update = function(r, g, b) {
+ this.r = r;
+ this.g = g;
+ this.b = b;
+};
+
+Color.prototype.hs = function(nStr) {
+ if (Number(nStr) === 0) {
+ return "00";
+ } else if (nStr.length < 2) {
+ return "0" + nStr;
+ } else {
+ return nStr;
+ }
+};
+
+Color.prototype.toString = function() {
+ let rH = Number(this.r.toFixed()).toString(16);
+ let gH = Number(this.g.toFixed()).toString(16);
+ let bH = Number(this.b.toFixed()).toString(16);
+ return "#" + this.hs(rH) + this.hs(gH) + this.hs(bH);
+};
+
+/**
+ * Converts an RGB color value to HSL. Conversion formula adapted from
+ * http://en.wikipedia.org/wiki/HSL_color_space. Assumes r, g, and b are
+ * contained in the set [0, 255] and returns h, s, and l in the set [0, 1].4343
+ *
+ * @param Number r The red color value
+ * @param Number g The green color value
+ * @param Number b The blue color value
+ * @return Array The HSL representation
+ */
+Color.prototype.hsl = function() {
+ let r = this.r / 255;
+ let g = this.g / 255;
+ let b = this.b / 255;
+ let max = Math.max(r, g, b), min = Math.min(r, g, b);
+ let h, s, l = (max + min) / 2;
+
+ if (max === min) {
+ h = s = 0; // achromatic
+ } else {
+ let d = max - min;
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+ switch (max) {
+ case r:
+ h = (g - b) / d + (g < b ? 6 : 0);
+ break;
+ case g:
+ h = (b - r) / d + 2;
+ break;
+ case b:
+ h = (r - g) / d + 4;
+ break;
+ }
+ h /= 6;
+ }
+
+ return [ h, s, l ];
+};
+
+/**
+ * Converts an HSL color value to RGB. Conversion formula adapted from
+ * http://en.wikipedia.org/wiki/HSL_color_space. Assumes h, s, and l are
+ * contained in the set [0, 1] and returns r, g, and b in the set [0, 255].
+ *
+ * @param Number h The hue
+ * @param Number s The saturation
+ * @param Number l The lightness
+ * @return Array The RGB representation
+ */
+Color.prototype.hslToRgb = function(h, s, l) {
+ function hue2rgb(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;
+ }
+
+ let r, g, b;
+
+ if (s === 0) {
+ r = g = b = l; // achromatic
+ } else {
+ let q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+ let p = 2 * l - q;
+ r = hue2rgb(p, q, h + 1 / 3);
+ g = hue2rgb(p, q, h);
+ b = hue2rgb(p, q, h - 1 / 3);
+ }
+
+ return [ r * 255, g * 255, b * 255 ];
+};
+
+/**
+ * Converts an RGB color value to HSV. Conversion formula adapted from
+ * http://en.wikipedia.org/wiki/HSV_color_space. Assumes r, g, and b are
+ * contained in the set [0, 255] and returns h, s, and v in the set [0, 1].
+ *
+ * @param Number r The red color value
+ * @param Number g The green color value
+ * @param Number b The blue color value
+ * @return Array The HSV representation
+ */
+Color.prototype.hsv = function() {
+ let r = this.r / 255;
+ let g = this.g / 255;
+ let b = this.b / 255;
+ let max = Math.max(r, g, b), min = Math.min(r, g, b);
+ let h, s, v = max;
+
+ let d = max - min;
+ s = max === 0 ? 0 : d / max;
+
+ if (max === min) {
+ h = 0; // achromatic
+ } else {
+ switch (max) {
+ case r:
+ h = (g - b) / d + (g < b ? 6 : 0);
+ break;
+ case g:
+ h = (b - r) / d + 2;
+ break;
+ case b:
+ h = (r - g) / d + 4;
+ break;
+ }
+ h /= 6;
+ }
+
+ return [ h, s, v ];
+};
+
+/**
+ * Converts an HSV color value to RGB. Conversion formula adapted from
+ * http://en.wikipedia.org/wiki/HSV_color_space. Assumes h, s, and v are
+ * contained in the set [0, 1] and returns r, g, and b in the set [0, 255].
+ *
+ * @param Number h The hue
+ * @param Number s The saturation
+ * @param Number v The value
+ * @return Array The RGB representation
+ */
+Color.prototype.hsvToRgb = function(h, s, v) {
+ let r, g, b;
+
+ let i = Math.floor(h * 6);
+ let f = h * 6 - i;
+ let p = v * (1 - s);
+ let q = v * (1 - f * s);
+ let t = v * (1 - (1 - f) * s);
+
+ switch (i % 6) {
+ case 0:
+ r = v;
+ g = t;
+ b = p;
+ break;
+ case 1:
+ r = q;
+ g = v;
+ b = p;
+ break;
+ case 2:
+ r = p;
+ g = v;
+ b = t;
+ break;
+ case 3:
+ r = p;
+ g = q;
+ b = v;
+ break;
+ case 4:
+ r = t;
+ g = p;
+ b = v;
+ break;
+ case 5:
+ r = v;
+ g = p;
+ b = q;
+ break;
+ }
+
+ return [ r * 255, g * 255, b * 255 ];
+};
+
+/**
+ * Provide
+ */
+Color.prototype.lightColor = function() {
+ let hslArray = this.hsl();
+ let h = Number(hslArray[0]);
+ let s = Number(hslArray[1]) * this.Desaturated;
+ let l = this.Luminosity;
+ let desA = this.hslToRgb(h, s, l);
+ return new Color(desA[0], desA[1], desA[2]);
+};