aboutsummaryrefslogblamecommitdiffstats
path: root/lib/color.js
blob: 2da2fa727995f5d766211cee5019f2db644e54d4 (plain) (tree)
1
2
3
4
5
6
7
8
9







                                                                               
                                                     


































































































































































































































                                                                               
// 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]);
};