toolkit/javascript/d3/src/core/hsl.js
changeset 47 c0b4a8b5a012
equal deleted inserted replaced
46:efd9c589177a 47:c0b4a8b5a012
       
     1 d3.hsl = function(h, s, l) {
       
     2   return arguments.length === 1
       
     3       ? (h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l)
       
     4       : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl))
       
     5       : d3_hsl(+h, +s, +l);
       
     6 };
       
     7 
       
     8 function d3_hsl(h, s, l) {
       
     9   return new d3_Hsl(h, s, l);
       
    10 }
       
    11 
       
    12 function d3_Hsl(h, s, l) {
       
    13   this.h = h;
       
    14   this.s = s;
       
    15   this.l = l;
       
    16 }
       
    17 
       
    18 d3_Hsl.prototype.brighter = function(k) {
       
    19   k = Math.pow(0.7, arguments.length ? k : 1);
       
    20   return d3_hsl(this.h, this.s, this.l / k);
       
    21 };
       
    22 
       
    23 d3_Hsl.prototype.darker = function(k) {
       
    24   k = Math.pow(0.7, arguments.length ? k : 1);
       
    25   return d3_hsl(this.h, this.s, k * this.l);
       
    26 };
       
    27 
       
    28 d3_Hsl.prototype.rgb = function() {
       
    29   return d3_hsl_rgb(this.h, this.s, this.l);
       
    30 };
       
    31 
       
    32 d3_Hsl.prototype.toString = function() {
       
    33   return this.rgb().toString();
       
    34 };
       
    35 
       
    36 function d3_hsl_rgb(h, s, l) {
       
    37   var m1,
       
    38       m2;
       
    39 
       
    40   /* Some simple corrections for h, s and l. */
       
    41   h = h % 360; if (h < 0) h += 360;
       
    42   s = s < 0 ? 0 : s > 1 ? 1 : s;
       
    43   l = l < 0 ? 0 : l > 1 ? 1 : l;
       
    44 
       
    45   /* From FvD 13.37, CSS Color Module Level 3 */
       
    46   m2 = l <= .5 ? l * (1 + s) : l + s - l * s;
       
    47   m1 = 2 * l - m2;
       
    48 
       
    49   function v(h) {
       
    50     if (h > 360) h -= 360;
       
    51     else if (h < 0) h += 360;
       
    52     if (h < 60) return m1 + (m2 - m1) * h / 60;
       
    53     if (h < 180) return m2;
       
    54     if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
       
    55     return m1;
       
    56   }
       
    57 
       
    58   function vv(h) {
       
    59     return Math.round(v(h) * 255);
       
    60   }
       
    61 
       
    62   return d3_rgb(vv(h + 120), vv(h), vv(h - 120));
       
    63 }