toolkit/javascript/d3/src/core/rgb.js
changeset 47 c0b4a8b5a012
equal deleted inserted replaced
46:efd9c589177a 47:c0b4a8b5a012
       
     1 d3.rgb = function(r, g, b) {
       
     2   return arguments.length === 1
       
     3       ? (r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b)
       
     4       : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb))
       
     5       : d3_rgb(~~r, ~~g, ~~b);
       
     6 };
       
     7 
       
     8 function d3_rgb(r, g, b) {
       
     9   return new d3_Rgb(r, g, b);
       
    10 }
       
    11 
       
    12 function d3_Rgb(r, g, b) {
       
    13   this.r = r;
       
    14   this.g = g;
       
    15   this.b = b;
       
    16 }
       
    17 
       
    18 d3_Rgb.prototype.brighter = function(k) {
       
    19   k = Math.pow(0.7, arguments.length ? k : 1);
       
    20   var r = this.r,
       
    21       g = this.g,
       
    22       b = this.b,
       
    23       i = 30;
       
    24   if (!r && !g && !b) return d3_rgb(i, i, i);
       
    25   if (r && r < i) r = i;
       
    26   if (g && g < i) g = i;
       
    27   if (b && b < i) b = i;
       
    28   return d3_rgb(
       
    29       Math.min(255, Math.floor(r / k)),
       
    30       Math.min(255, Math.floor(g / k)),
       
    31       Math.min(255, Math.floor(b / k)));
       
    32 };
       
    33 
       
    34 d3_Rgb.prototype.darker = function(k) {
       
    35   k = Math.pow(0.7, arguments.length ? k : 1);
       
    36   return d3_rgb(
       
    37       Math.floor(k * this.r),
       
    38       Math.floor(k * this.g),
       
    39       Math.floor(k * this.b));
       
    40 };
       
    41 
       
    42 d3_Rgb.prototype.hsl = function() {
       
    43   return d3_rgb_hsl(this.r, this.g, this.b);
       
    44 };
       
    45 
       
    46 d3_Rgb.prototype.toString = function() {
       
    47   return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);
       
    48 };
       
    49 
       
    50 function d3_rgb_hex(v) {
       
    51   return v < 0x10
       
    52       ? "0" + Math.max(0, v).toString(16)
       
    53       : Math.min(255, v).toString(16);
       
    54 }
       
    55 
       
    56 function d3_rgb_parse(format, rgb, hsl) {
       
    57   var r = 0, // red channel; int in [0, 255]
       
    58       g = 0, // green channel; int in [0, 255]
       
    59       b = 0, // blue channel; int in [0, 255]
       
    60       m1, // CSS color specification match
       
    61       m2, // CSS color specification type (e.g., rgb)
       
    62       name;
       
    63 
       
    64   /* Handle hsl, rgb. */
       
    65   m1 = /([a-z]+)\((.*)\)/i.exec(format);
       
    66   if (m1) {
       
    67     m2 = m1[2].split(",");
       
    68     switch (m1[1]) {
       
    69       case "hsl": {
       
    70         return hsl(
       
    71           parseFloat(m2[0]), // degrees
       
    72           parseFloat(m2[1]) / 100, // percentage
       
    73           parseFloat(m2[2]) / 100 // percentage
       
    74         );
       
    75       }
       
    76       case "rgb": {
       
    77         return rgb(
       
    78           d3_rgb_parseNumber(m2[0]),
       
    79           d3_rgb_parseNumber(m2[1]),
       
    80           d3_rgb_parseNumber(m2[2])
       
    81         );
       
    82       }
       
    83     }
       
    84   }
       
    85 
       
    86   /* Named colors. */
       
    87   if (name = d3_rgb_names[format]) return rgb(name.r, name.g, name.b);
       
    88 
       
    89   /* Hexadecimal colors: #rgb and #rrggbb. */
       
    90   if (format != null && format.charAt(0) === "#") {
       
    91     if (format.length === 4) {
       
    92       r = format.charAt(1); r += r;
       
    93       g = format.charAt(2); g += g;
       
    94       b = format.charAt(3); b += b;
       
    95     } else if (format.length === 7) {
       
    96       r = format.substring(1, 3);
       
    97       g = format.substring(3, 5);
       
    98       b = format.substring(5, 7);
       
    99     }
       
   100     r = parseInt(r, 16);
       
   101     g = parseInt(g, 16);
       
   102     b = parseInt(b, 16);
       
   103   }
       
   104 
       
   105   return rgb(r, g, b);
       
   106 }
       
   107 
       
   108 function d3_rgb_hsl(r, g, b) {
       
   109   var min = Math.min(r /= 255, g /= 255, b /= 255),
       
   110       max = Math.max(r, g, b),
       
   111       d = max - min,
       
   112       h,
       
   113       s,
       
   114       l = (max + min) / 2;
       
   115   if (d) {
       
   116     s = l < .5 ? d / (max + min) : d / (2 - max - min);
       
   117     if (r == max) h = (g - b) / d + (g < b ? 6 : 0);
       
   118     else if (g == max) h = (b - r) / d + 2;
       
   119     else h = (r - g) / d + 4;
       
   120     h *= 60;
       
   121   } else {
       
   122     s = h = 0;
       
   123   }
       
   124   return d3_hsl(h, s, l);
       
   125 }
       
   126 
       
   127 function d3_rgb_parseNumber(c) { // either integer or percentage
       
   128   var f = parseFloat(c);
       
   129   return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;
       
   130 }
       
   131 
       
   132 var d3_rgb_names = {
       
   133   aliceblue: "#f0f8ff",
       
   134   antiquewhite: "#faebd7",
       
   135   aqua: "#00ffff",
       
   136   aquamarine: "#7fffd4",
       
   137   azure: "#f0ffff",
       
   138   beige: "#f5f5dc",
       
   139   bisque: "#ffe4c4",
       
   140   black: "#000000",
       
   141   blanchedalmond: "#ffebcd",
       
   142   blue: "#0000ff",
       
   143   blueviolet: "#8a2be2",
       
   144   brown: "#a52a2a",
       
   145   burlywood: "#deb887",
       
   146   cadetblue: "#5f9ea0",
       
   147   chartreuse: "#7fff00",
       
   148   chocolate: "#d2691e",
       
   149   coral: "#ff7f50",
       
   150   cornflowerblue: "#6495ed",
       
   151   cornsilk: "#fff8dc",
       
   152   crimson: "#dc143c",
       
   153   cyan: "#00ffff",
       
   154   darkblue: "#00008b",
       
   155   darkcyan: "#008b8b",
       
   156   darkgoldenrod: "#b8860b",
       
   157   darkgray: "#a9a9a9",
       
   158   darkgreen: "#006400",
       
   159   darkgrey: "#a9a9a9",
       
   160   darkkhaki: "#bdb76b",
       
   161   darkmagenta: "#8b008b",
       
   162   darkolivegreen: "#556b2f",
       
   163   darkorange: "#ff8c00",
       
   164   darkorchid: "#9932cc",
       
   165   darkred: "#8b0000",
       
   166   darksalmon: "#e9967a",
       
   167   darkseagreen: "#8fbc8f",
       
   168   darkslateblue: "#483d8b",
       
   169   darkslategray: "#2f4f4f",
       
   170   darkslategrey: "#2f4f4f",
       
   171   darkturquoise: "#00ced1",
       
   172   darkviolet: "#9400d3",
       
   173   deeppink: "#ff1493",
       
   174   deepskyblue: "#00bfff",
       
   175   dimgray: "#696969",
       
   176   dimgrey: "#696969",
       
   177   dodgerblue: "#1e90ff",
       
   178   firebrick: "#b22222",
       
   179   floralwhite: "#fffaf0",
       
   180   forestgreen: "#228b22",
       
   181   fuchsia: "#ff00ff",
       
   182   gainsboro: "#dcdcdc",
       
   183   ghostwhite: "#f8f8ff",
       
   184   gold: "#ffd700",
       
   185   goldenrod: "#daa520",
       
   186   gray: "#808080",
       
   187   green: "#008000",
       
   188   greenyellow: "#adff2f",
       
   189   grey: "#808080",
       
   190   honeydew: "#f0fff0",
       
   191   hotpink: "#ff69b4",
       
   192   indianred: "#cd5c5c",
       
   193   indigo: "#4b0082",
       
   194   ivory: "#fffff0",
       
   195   khaki: "#f0e68c",
       
   196   lavender: "#e6e6fa",
       
   197   lavenderblush: "#fff0f5",
       
   198   lawngreen: "#7cfc00",
       
   199   lemonchiffon: "#fffacd",
       
   200   lightblue: "#add8e6",
       
   201   lightcoral: "#f08080",
       
   202   lightcyan: "#e0ffff",
       
   203   lightgoldenrodyellow: "#fafad2",
       
   204   lightgray: "#d3d3d3",
       
   205   lightgreen: "#90ee90",
       
   206   lightgrey: "#d3d3d3",
       
   207   lightpink: "#ffb6c1",
       
   208   lightsalmon: "#ffa07a",
       
   209   lightseagreen: "#20b2aa",
       
   210   lightskyblue: "#87cefa",
       
   211   lightslategray: "#778899",
       
   212   lightslategrey: "#778899",
       
   213   lightsteelblue: "#b0c4de",
       
   214   lightyellow: "#ffffe0",
       
   215   lime: "#00ff00",
       
   216   limegreen: "#32cd32",
       
   217   linen: "#faf0e6",
       
   218   magenta: "#ff00ff",
       
   219   maroon: "#800000",
       
   220   mediumaquamarine: "#66cdaa",
       
   221   mediumblue: "#0000cd",
       
   222   mediumorchid: "#ba55d3",
       
   223   mediumpurple: "#9370db",
       
   224   mediumseagreen: "#3cb371",
       
   225   mediumslateblue: "#7b68ee",
       
   226   mediumspringgreen: "#00fa9a",
       
   227   mediumturquoise: "#48d1cc",
       
   228   mediumvioletred: "#c71585",
       
   229   midnightblue: "#191970",
       
   230   mintcream: "#f5fffa",
       
   231   mistyrose: "#ffe4e1",
       
   232   moccasin: "#ffe4b5",
       
   233   navajowhite: "#ffdead",
       
   234   navy: "#000080",
       
   235   oldlace: "#fdf5e6",
       
   236   olive: "#808000",
       
   237   olivedrab: "#6b8e23",
       
   238   orange: "#ffa500",
       
   239   orangered: "#ff4500",
       
   240   orchid: "#da70d6",
       
   241   palegoldenrod: "#eee8aa",
       
   242   palegreen: "#98fb98",
       
   243   paleturquoise: "#afeeee",
       
   244   palevioletred: "#db7093",
       
   245   papayawhip: "#ffefd5",
       
   246   peachpuff: "#ffdab9",
       
   247   peru: "#cd853f",
       
   248   pink: "#ffc0cb",
       
   249   plum: "#dda0dd",
       
   250   powderblue: "#b0e0e6",
       
   251   purple: "#800080",
       
   252   red: "#ff0000",
       
   253   rosybrown: "#bc8f8f",
       
   254   royalblue: "#4169e1",
       
   255   saddlebrown: "#8b4513",
       
   256   salmon: "#fa8072",
       
   257   sandybrown: "#f4a460",
       
   258   seagreen: "#2e8b57",
       
   259   seashell: "#fff5ee",
       
   260   sienna: "#a0522d",
       
   261   silver: "#c0c0c0",
       
   262   skyblue: "#87ceeb",
       
   263   slateblue: "#6a5acd",
       
   264   slategray: "#708090",
       
   265   slategrey: "#708090",
       
   266   snow: "#fffafa",
       
   267   springgreen: "#00ff7f",
       
   268   steelblue: "#4682b4",
       
   269   tan: "#d2b48c",
       
   270   teal: "#008080",
       
   271   thistle: "#d8bfd8",
       
   272   tomato: "#ff6347",
       
   273   turquoise: "#40e0d0",
       
   274   violet: "#ee82ee",
       
   275   wheat: "#f5deb3",
       
   276   white: "#ffffff",
       
   277   whitesmoke: "#f5f5f5",
       
   278   yellow: "#ffff00",
       
   279   yellowgreen: "#9acd32"
       
   280 };
       
   281 
       
   282 for (var d3_rgb_name in d3_rgb_names) {
       
   283   d3_rgb_names[d3_rgb_name] = d3_rgb_parse(
       
   284       d3_rgb_names[d3_rgb_name],
       
   285       d3_rgb,
       
   286       d3_hsl_rgb);
       
   287 }