|
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 } |