import “../arrays/map”; import “color”; import “hsl”; import “lab”; import “xyz”;

d3.rgb = function(r, g, b) {

return arguments.length === 1
    ? (r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b)
    : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb))
    : d3_rgb(~~r, ~~g, ~~b);

};

function d3_rgb(r, g, b) {

return new d3_Rgb(r, g, b);

}

function d3_Rgb(r, g, b) {

this.r = r;
this.g = g;
this.b = b;

}

var d3_rgbPrototype = d3_Rgb.prototype = new d3_Color;

d3_rgbPrototype.brighter = function(k) {

k = Math.pow(0.7, arguments.length ? k : 1);
var r = this.r,
    g = this.g,
    b = this.b,
    i = 30;
if (!r && !g && !b) return d3_rgb(i, i, i);
if (r && r < i) r = i;
if (g && g < i) g = i;
if (b && b < i) b = i;
return d3_rgb(
    Math.min(255, Math.floor(r / k)),
    Math.min(255, Math.floor(g / k)),
    Math.min(255, Math.floor(b / k)));

};

d3_rgbPrototype.darker = function(k) {

k = Math.pow(0.7, arguments.length ? k : 1);
return d3_rgb(
    Math.floor(k * this.r),
    Math.floor(k * this.g),
    Math.floor(k * this.b));

};

d3_rgbPrototype.hsl = function() {

return d3_rgb_hsl(this.r, this.g, this.b);

};

d3_rgbPrototype.toString = function() {

return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);

};

function d3_rgb_hex(v) {

return v < 0x10
    ? "0" + Math.max(0, v).toString(16)
    : Math.min(255, v).toString(16);

}

function d3_rgb_parse(format, rgb, hsl) {

var r = 0, // red channel; int in [0, 255]
    g = 0, // green channel; int in [0, 255]
    b = 0, // blue channel; int in [0, 255]
    m1, // CSS color specification match
    m2, // CSS color specification type (e.g., rgb)
    name;

/* Handle hsl, rgb. */
m1 = /([a-z]+)\((.*)\)/i.exec(format);
if (m1) {
  m2 = m1[2].split(",");
  switch (m1[1]) {
    case "hsl": {
      return hsl(
        parseFloat(m2[0]), // degrees
        parseFloat(m2[1]) / 100, // percentage
        parseFloat(m2[2]) / 100 // percentage
      );
    }
    case "rgb": {
      return rgb(
        d3_rgb_parseNumber(m2[0]),
        d3_rgb_parseNumber(m2[1]),
        d3_rgb_parseNumber(m2[2])
      );
    }
  }
}

/* Named colors. */
if (name = d3_rgb_names.get(format)) return rgb(name.r, name.g, name.b);

/* Hexadecimal colors: #rgb and #rrggbb. */
if (format != null && format.charAt(0) === "#") {
  if (format.length === 4) {
    r = format.charAt(1); r += r;
    g = format.charAt(2); g += g;
    b = format.charAt(3); b += b;
  } else if (format.length === 7) {
    r = format.substring(1, 3);
    g = format.substring(3, 5);
    b = format.substring(5, 7);
  }
  r = parseInt(r, 16);
  g = parseInt(g, 16);
  b = parseInt(b, 16);
}

return rgb(r, g, b);

}

function d3_rgb_hsl(r, g, b) {

var min = Math.min(r /= 255, g /= 255, b /= 255),
    max = Math.max(r, g, b),
    d = max - min,
    h,
    s,
    l = (max + min) / 2;
if (d) {
  s = l < .5 ? d / (max + min) : d / (2 - max - min);
  if (r == max) h = (g - b) / d + (g < b ? 6 : 0);
  else if (g == max) h = (b - r) / d + 2;
  else h = (r - g) / d + 4;
  h *= 60;
} else {
  h = NaN;
  s = l > 0 && l < 1 ? 0 : h;
}
return d3_hsl(h, s, l);

}

function d3_rgb_lab(r, g, b) {

r = d3_rgb_xyz(r);
g = d3_rgb_xyz(g);
b = d3_rgb_xyz(b);
var x = d3_xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / d3_lab_X),
    y = d3_xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / d3_lab_Y),
    z = d3_xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / d3_lab_Z);
return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));

}

function d3_rgb_xyz® {

return (r /= 255) <= 0.04045 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4);

}

function d3_rgb_parseNumber© { // either integer or percentage

var f = parseFloat(c);
return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;

}

var d3_rgb_names = d3.map({

aliceblue: "#f0f8ff",
antiquewhite: "#faebd7",
aqua: "#00ffff",
aquamarine: "#7fffd4",
azure: "#f0ffff",
beige: "#f5f5dc",
bisque: "#ffe4c4",
black: "#000000",
blanchedalmond: "#ffebcd",
blue: "#0000ff",
blueviolet: "#8a2be2",
brown: "#a52a2a",
burlywood: "#deb887",
cadetblue: "#5f9ea0",
chartreuse: "#7fff00",
chocolate: "#d2691e",
coral: "#ff7f50",
cornflowerblue: "#6495ed",
cornsilk: "#fff8dc",
crimson: "#dc143c",
cyan: "#00ffff",
darkblue: "#00008b",
darkcyan: "#008b8b",
darkgoldenrod: "#b8860b",
darkgray: "#a9a9a9",
darkgreen: "#006400",
darkgrey: "#a9a9a9",
darkkhaki: "#bdb76b",
darkmagenta: "#8b008b",
darkolivegreen: "#556b2f",
darkorange: "#ff8c00",
darkorchid: "#9932cc",
darkred: "#8b0000",
darksalmon: "#e9967a",
darkseagreen: "#8fbc8f",
darkslateblue: "#483d8b",
darkslategray: "#2f4f4f",
darkslategrey: "#2f4f4f",
darkturquoise: "#00ced1",
darkviolet: "#9400d3",
deeppink: "#ff1493",
deepskyblue: "#00bfff",
dimgray: "#696969",
dimgrey: "#696969",
dodgerblue: "#1e90ff",
firebrick: "#b22222",
floralwhite: "#fffaf0",
forestgreen: "#228b22",
fuchsia: "#ff00ff",
gainsboro: "#dcdcdc",
ghostwhite: "#f8f8ff",
gold: "#ffd700",
goldenrod: "#daa520",
gray: "#808080",
green: "#008000",
greenyellow: "#adff2f",
grey: "#808080",
honeydew: "#f0fff0",
hotpink: "#ff69b4",
indianred: "#cd5c5c",
indigo: "#4b0082",
ivory: "#fffff0",
khaki: "#f0e68c",
lavender: "#e6e6fa",
lavenderblush: "#fff0f5",
lawngreen: "#7cfc00",
lemonchiffon: "#fffacd",
lightblue: "#add8e6",
lightcoral: "#f08080",
lightcyan: "#e0ffff",
lightgoldenrodyellow: "#fafad2",
lightgray: "#d3d3d3",
lightgreen: "#90ee90",
lightgrey: "#d3d3d3",
lightpink: "#ffb6c1",
lightsalmon: "#ffa07a",
lightseagreen: "#20b2aa",
lightskyblue: "#87cefa",
lightslategray: "#778899",
lightslategrey: "#778899",
lightsteelblue: "#b0c4de",
lightyellow: "#ffffe0",
lime: "#00ff00",
limegreen: "#32cd32",
linen: "#faf0e6",
magenta: "#ff00ff",
maroon: "#800000",
mediumaquamarine: "#66cdaa",
mediumblue: "#0000cd",
mediumorchid: "#ba55d3",
mediumpurple: "#9370db",
mediumseagreen: "#3cb371",
mediumslateblue: "#7b68ee",
mediumspringgreen: "#00fa9a",
mediumturquoise: "#48d1cc",
mediumvioletred: "#c71585",
midnightblue: "#191970",
mintcream: "#f5fffa",
mistyrose: "#ffe4e1",
moccasin: "#ffe4b5",
navajowhite: "#ffdead",
navy: "#000080",
oldlace: "#fdf5e6",
olive: "#808000",
olivedrab: "#6b8e23",
orange: "#ffa500",
orangered: "#ff4500",
orchid: "#da70d6",
palegoldenrod: "#eee8aa",
palegreen: "#98fb98",
paleturquoise: "#afeeee",
palevioletred: "#db7093",
papayawhip: "#ffefd5",
peachpuff: "#ffdab9",
peru: "#cd853f",
pink: "#ffc0cb",
plum: "#dda0dd",
powderblue: "#b0e0e6",
purple: "#800080",
red: "#ff0000",
rosybrown: "#bc8f8f",
royalblue: "#4169e1",
saddlebrown: "#8b4513",
salmon: "#fa8072",
sandybrown: "#f4a460",
seagreen: "#2e8b57",
seashell: "#fff5ee",
sienna: "#a0522d",
silver: "#c0c0c0",
skyblue: "#87ceeb",
slateblue: "#6a5acd",
slategray: "#708090",
slategrey: "#708090",
snow: "#fffafa",
springgreen: "#00ff7f",
steelblue: "#4682b4",
tan: "#d2b48c",
teal: "#008080",
thistle: "#d8bfd8",
tomato: "#ff6347",
turquoise: "#40e0d0",
violet: "#ee82ee",
wheat: "#f5deb3",
white: "#ffffff",
whitesmoke: "#f5f5f5",
yellow: "#ffff00",
yellowgreen: "#9acd32"

});

d3_rgb_names.forEach(function(key, value) {

d3_rgb_names.set(key, d3_rgb_parse(value, d3_rgb, d3_hsl_rgb));

});