aboutsummaryrefslogblamecommitdiffstats
path: root/data/lib/color.js
blob: 0031c5c8ca92bff1a43a0382686468659ca7f378 (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
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() {
  var rH = Number(this.r.toFixed()).toString(16);
  var gH = Number(this.g.toFixed()).toString(16);
  var 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() {
  var r = this.r / 255;
  var g = this.g / 255;
  var b = this.b / 255;
  var max = Math.max(r, g, b), min = Math.min(r, g, b);
  var h, s, l = (max + min) / 2;

  if (max === min) {
    h = s = 0; // achromatic
  }
  else {
    var 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;
  }

  var r, g, b;

  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 = 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() {
  var r = this.r / 255;
  var g = this.g / 255;
  var b = this.b / 255;
  var max = Math.max(r, g, b), min = Math.min(r, g, b);
  var h, s, v = max;

  var 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) {
  var r, g, b;

  var i = Math.floor(h * 6);
  var f = h * 6 - i;
  var p = v * (1 - s);
  var q = v * (1 - f * s);
  var 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() {
  var hslArray = this.hsl();
  var h = Number(hslArray[0]);
  var s = Number(hslArray[1]) * this.Desaturated;
  var l = this.Luminosity;
  var desA = this.hslToRgb(h, s, l);
  return new Color(desA[0], desA[1], desA[2]);
};