1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/testing/mochitest/MochiKit/Color.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,902 @@ 1.4 +/*** 1.5 + 1.6 +MochiKit.Color 1.4 1.7 + 1.8 +See <http://mochikit.com/> for documentation, downloads, license, etc. 1.9 + 1.10 +(c) 2005 Bob Ippolito and others. All rights Reserved. 1.11 + 1.12 +***/ 1.13 + 1.14 +if (typeof(dojo) != 'undefined') { 1.15 + dojo.provide('MochiKit.Color'); 1.16 + dojo.require('MochiKit.Base'); 1.17 + dojo.require('MochiKit.DOM'); 1.18 + dojo.require('MochiKit.Style'); 1.19 +} 1.20 + 1.21 +if (typeof(JSAN) != 'undefined') { 1.22 + JSAN.use("MochiKit.Base", []); 1.23 + JSAN.use("MochiKit.DOM", []); 1.24 + JSAN.use("MochiKit.Style", []); 1.25 +} 1.26 + 1.27 +try { 1.28 + if (typeof(MochiKit.Base) == 'undefined') { 1.29 + throw ""; 1.30 + } 1.31 +} catch (e) { 1.32 + throw "MochiKit.Color depends on MochiKit.Base"; 1.33 +} 1.34 + 1.35 +try { 1.36 + if (typeof(MochiKit.Base) == 'undefined') { 1.37 + throw ""; 1.38 + } 1.39 +} catch (e) { 1.40 + throw "MochiKit.Color depends on MochiKit.DOM"; 1.41 +} 1.42 + 1.43 +try { 1.44 + if (typeof(MochiKit.Base) == 'undefined') { 1.45 + throw ""; 1.46 + } 1.47 +} catch (e) { 1.48 + throw "MochiKit.Color depends on MochiKit.Style"; 1.49 +} 1.50 + 1.51 +if (typeof(MochiKit.Color) == "undefined") { 1.52 + MochiKit.Color = {}; 1.53 +} 1.54 + 1.55 +MochiKit.Color.NAME = "MochiKit.Color"; 1.56 +MochiKit.Color.VERSION = "1.4"; 1.57 + 1.58 +MochiKit.Color.__repr__ = function () { 1.59 + return "[" + this.NAME + " " + this.VERSION + "]"; 1.60 +}; 1.61 + 1.62 +MochiKit.Color.toString = function () { 1.63 + return this.__repr__(); 1.64 +}; 1.65 + 1.66 + 1.67 +/** @id MochiKit.Color.Color */ 1.68 +MochiKit.Color.Color = function (red, green, blue, alpha) { 1.69 + if (typeof(alpha) == 'undefined' || alpha === null) { 1.70 + alpha = 1.0; 1.71 + } 1.72 + this.rgb = { 1.73 + r: red, 1.74 + g: green, 1.75 + b: blue, 1.76 + a: alpha 1.77 + }; 1.78 +}; 1.79 + 1.80 + 1.81 +// Prototype methods 1.82 + 1.83 +MochiKit.Color.Color.prototype = { 1.84 + 1.85 + __class__: MochiKit.Color.Color, 1.86 + 1.87 + /** @id MochiKit.Color.Color.prototype.colorWithAlpha */ 1.88 + colorWithAlpha: function (alpha) { 1.89 + var rgb = this.rgb; 1.90 + var m = MochiKit.Color; 1.91 + return m.Color.fromRGB(rgb.r, rgb.g, rgb.b, alpha); 1.92 + }, 1.93 + 1.94 + /** @id MochiKit.Color.Color.prototype.colorWithHue */ 1.95 + colorWithHue: function (hue) { 1.96 + // get an HSL model, and set the new hue... 1.97 + var hsl = this.asHSL(); 1.98 + hsl.h = hue; 1.99 + var m = MochiKit.Color; 1.100 + // convert back to RGB... 1.101 + return m.Color.fromHSL(hsl); 1.102 + }, 1.103 + 1.104 + /** @id MochiKit.Color.Color.prototype.colorWithSaturation */ 1.105 + colorWithSaturation: function (saturation) { 1.106 + // get an HSL model, and set the new hue... 1.107 + var hsl = this.asHSL(); 1.108 + hsl.s = saturation; 1.109 + var m = MochiKit.Color; 1.110 + // convert back to RGB... 1.111 + return m.Color.fromHSL(hsl); 1.112 + }, 1.113 + 1.114 + /** @id MochiKit.Color.Color.prototype.colorWithLightness */ 1.115 + colorWithLightness: function (lightness) { 1.116 + // get an HSL model, and set the new hue... 1.117 + var hsl = this.asHSL(); 1.118 + hsl.l = lightness; 1.119 + var m = MochiKit.Color; 1.120 + // convert back to RGB... 1.121 + return m.Color.fromHSL(hsl); 1.122 + }, 1.123 + 1.124 + /** @id MochiKit.Color.Color.prototype.darkerColorWithLevel */ 1.125 + darkerColorWithLevel: function (level) { 1.126 + var hsl = this.asHSL(); 1.127 + hsl.l = Math.max(hsl.l - level, 0); 1.128 + var m = MochiKit.Color; 1.129 + return m.Color.fromHSL(hsl); 1.130 + }, 1.131 + 1.132 + /** @id MochiKit.Color.Color.prototype.lighterColorWithLevel */ 1.133 + lighterColorWithLevel: function (level) { 1.134 + var hsl = this.asHSL(); 1.135 + hsl.l = Math.min(hsl.l + level, 1); 1.136 + var m = MochiKit.Color; 1.137 + return m.Color.fromHSL(hsl); 1.138 + }, 1.139 + 1.140 + /** @id MochiKit.Color.Color.prototype.blendedColor */ 1.141 + blendedColor: function (other, /* optional */ fraction) { 1.142 + if (typeof(fraction) == 'undefined' || fraction === null) { 1.143 + fraction = 0.5; 1.144 + } 1.145 + var sf = 1.0 - fraction; 1.146 + var s = this.rgb; 1.147 + var d = other.rgb; 1.148 + var df = fraction; 1.149 + return MochiKit.Color.Color.fromRGB( 1.150 + (s.r * sf) + (d.r * df), 1.151 + (s.g * sf) + (d.g * df), 1.152 + (s.b * sf) + (d.b * df), 1.153 + (s.a * sf) + (d.a * df) 1.154 + ); 1.155 + }, 1.156 + 1.157 + /** @id MochiKit.Color.Color.prototype.compareRGB */ 1.158 + compareRGB: function (other) { 1.159 + var a = this.asRGB(); 1.160 + var b = other.asRGB(); 1.161 + return MochiKit.Base.compare( 1.162 + [a.r, a.g, a.b, a.a], 1.163 + [b.r, b.g, b.b, b.a] 1.164 + ); 1.165 + }, 1.166 + 1.167 + /** @id MochiKit.Color.Color.prototype.isLight */ 1.168 + isLight: function () { 1.169 + return this.asHSL().b > 0.5; 1.170 + }, 1.171 + 1.172 + /** @id MochiKit.Color.Color.prototype.isDark */ 1.173 + isDark: function () { 1.174 + return (!this.isLight()); 1.175 + }, 1.176 + 1.177 + /** @id MochiKit.Color.Color.prototype.toHSLString */ 1.178 + toHSLString: function () { 1.179 + var c = this.asHSL(); 1.180 + var ccc = MochiKit.Color.clampColorComponent; 1.181 + var rval = this._hslString; 1.182 + if (!rval) { 1.183 + var mid = ( 1.184 + ccc(c.h, 360).toFixed(0) 1.185 + + "," + ccc(c.s, 100).toPrecision(4) + "%" 1.186 + + "," + ccc(c.l, 100).toPrecision(4) + "%" 1.187 + ); 1.188 + var a = c.a; 1.189 + if (a >= 1) { 1.190 + a = 1; 1.191 + rval = "hsl(" + mid + ")"; 1.192 + } else { 1.193 + if (a <= 0) { 1.194 + a = 0; 1.195 + } 1.196 + rval = "hsla(" + mid + "," + a + ")"; 1.197 + } 1.198 + this._hslString = rval; 1.199 + } 1.200 + return rval; 1.201 + }, 1.202 + 1.203 + /** @id MochiKit.Color.Color.prototype.toRGBString */ 1.204 + toRGBString: function () { 1.205 + var c = this.rgb; 1.206 + var ccc = MochiKit.Color.clampColorComponent; 1.207 + var rval = this._rgbString; 1.208 + if (!rval) { 1.209 + var mid = ( 1.210 + ccc(c.r, 255).toFixed(0) 1.211 + + "," + ccc(c.g, 255).toFixed(0) 1.212 + + "," + ccc(c.b, 255).toFixed(0) 1.213 + ); 1.214 + if (c.a != 1) { 1.215 + rval = "rgba(" + mid + "," + c.a + ")"; 1.216 + } else { 1.217 + rval = "rgb(" + mid + ")"; 1.218 + } 1.219 + this._rgbString = rval; 1.220 + } 1.221 + return rval; 1.222 + }, 1.223 + 1.224 + /** @id MochiKit.Color.Color.prototype.asRGB */ 1.225 + asRGB: function () { 1.226 + return MochiKit.Base.clone(this.rgb); 1.227 + }, 1.228 + 1.229 + /** @id MochiKit.Color.Color.prototype.toHexString */ 1.230 + toHexString: function () { 1.231 + var m = MochiKit.Color; 1.232 + var c = this.rgb; 1.233 + var ccc = MochiKit.Color.clampColorComponent; 1.234 + var rval = this._hexString; 1.235 + if (!rval) { 1.236 + rval = ("#" + 1.237 + m.toColorPart(ccc(c.r, 255)) + 1.238 + m.toColorPart(ccc(c.g, 255)) + 1.239 + m.toColorPart(ccc(c.b, 255)) 1.240 + ); 1.241 + this._hexString = rval; 1.242 + } 1.243 + return rval; 1.244 + }, 1.245 + 1.246 + /** @id MochiKit.Color.Color.prototype.asHSV */ 1.247 + asHSV: function () { 1.248 + var hsv = this.hsv; 1.249 + var c = this.rgb; 1.250 + if (typeof(hsv) == 'undefined' || hsv === null) { 1.251 + hsv = MochiKit.Color.rgbToHSV(this.rgb); 1.252 + this.hsv = hsv; 1.253 + } 1.254 + return MochiKit.Base.clone(hsv); 1.255 + }, 1.256 + 1.257 + /** @id MochiKit.Color.Color.prototype.asHSL */ 1.258 + asHSL: function () { 1.259 + var hsl = this.hsl; 1.260 + var c = this.rgb; 1.261 + if (typeof(hsl) == 'undefined' || hsl === null) { 1.262 + hsl = MochiKit.Color.rgbToHSL(this.rgb); 1.263 + this.hsl = hsl; 1.264 + } 1.265 + return MochiKit.Base.clone(hsl); 1.266 + }, 1.267 + 1.268 + /** @id MochiKit.Color.Color.prototype.toString */ 1.269 + toString: function () { 1.270 + return this.toRGBString(); 1.271 + }, 1.272 + 1.273 + /** @id MochiKit.Color.Color.prototype.repr */ 1.274 + repr: function () { 1.275 + var c = this.rgb; 1.276 + var col = [c.r, c.g, c.b, c.a]; 1.277 + return this.__class__.NAME + "(" + col.join(", ") + ")"; 1.278 + } 1.279 + 1.280 +}; 1.281 + 1.282 +// Constructor methods 1.283 + 1.284 +MochiKit.Base.update(MochiKit.Color.Color, { 1.285 + /** @id MochiKit.Color.Color.fromRGB */ 1.286 + fromRGB: function (red, green, blue, alpha) { 1.287 + // designated initializer 1.288 + var Color = MochiKit.Color.Color; 1.289 + if (arguments.length == 1) { 1.290 + var rgb = red; 1.291 + red = rgb.r; 1.292 + green = rgb.g; 1.293 + blue = rgb.b; 1.294 + if (typeof(rgb.a) == 'undefined') { 1.295 + alpha = undefined; 1.296 + } else { 1.297 + alpha = rgb.a; 1.298 + } 1.299 + } 1.300 + return new Color(red, green, blue, alpha); 1.301 + }, 1.302 + 1.303 + /** @id MochiKit.Color.Color.fromHSL */ 1.304 + fromHSL: function (hue, saturation, lightness, alpha) { 1.305 + var m = MochiKit.Color; 1.306 + return m.Color.fromRGB(m.hslToRGB.apply(m, arguments)); 1.307 + }, 1.308 + 1.309 + /** @id MochiKit.Color.Color.fromHSV */ 1.310 + fromHSV: function (hue, saturation, value, alpha) { 1.311 + var m = MochiKit.Color; 1.312 + return m.Color.fromRGB(m.hsvToRGB.apply(m, arguments)); 1.313 + }, 1.314 + 1.315 + /** @id MochiKit.Color.Color.fromName */ 1.316 + fromName: function (name) { 1.317 + var Color = MochiKit.Color.Color; 1.318 + // Opera 9 seems to "quote" named colors(?!) 1.319 + if (name.charAt(0) == '"') { 1.320 + name = name.substr(1, name.length - 2); 1.321 + } 1.322 + var htmlColor = Color._namedColors[name.toLowerCase()]; 1.323 + if (typeof(htmlColor) == 'string') { 1.324 + return Color.fromHexString(htmlColor); 1.325 + } else if (name == "transparent") { 1.326 + return Color.transparentColor(); 1.327 + } 1.328 + return null; 1.329 + }, 1.330 + 1.331 + /** @id MochiKit.Color.Color.fromString */ 1.332 + fromString: function (colorString) { 1.333 + var self = MochiKit.Color.Color; 1.334 + var three = colorString.substr(0, 3); 1.335 + if (three == "rgb") { 1.336 + return self.fromRGBString(colorString); 1.337 + } else if (three == "hsl") { 1.338 + return self.fromHSLString(colorString); 1.339 + } else if (colorString.charAt(0) == "#") { 1.340 + return self.fromHexString(colorString); 1.341 + } 1.342 + return self.fromName(colorString); 1.343 + }, 1.344 + 1.345 + 1.346 + /** @id MochiKit.Color.Color.fromHexString */ 1.347 + fromHexString: function (hexCode) { 1.348 + if (hexCode.charAt(0) == '#') { 1.349 + hexCode = hexCode.substring(1); 1.350 + } 1.351 + var components = []; 1.352 + var i, hex; 1.353 + if (hexCode.length == 3) { 1.354 + for (i = 0; i < 3; i++) { 1.355 + hex = hexCode.substr(i, 1); 1.356 + components.push(parseInt(hex + hex, 16) / 255.0); 1.357 + } 1.358 + } else { 1.359 + for (i = 0; i < 6; i += 2) { 1.360 + hex = hexCode.substr(i, 2); 1.361 + components.push(parseInt(hex, 16) / 255.0); 1.362 + } 1.363 + } 1.364 + var Color = MochiKit.Color.Color; 1.365 + return Color.fromRGB.apply(Color, components); 1.366 + }, 1.367 + 1.368 + 1.369 + _fromColorString: function (pre, method, scales, colorCode) { 1.370 + // parses either HSL or RGB 1.371 + if (colorCode.indexOf(pre) === 0) { 1.372 + colorCode = colorCode.substring(colorCode.indexOf("(", 3) + 1, colorCode.length - 1); 1.373 + } 1.374 + var colorChunks = colorCode.split(/\s*,\s*/); 1.375 + var colorFloats = []; 1.376 + for (var i = 0; i < colorChunks.length; i++) { 1.377 + var c = colorChunks[i]; 1.378 + var val; 1.379 + var three = c.substring(c.length - 3); 1.380 + if (c.charAt(c.length - 1) == '%') { 1.381 + val = 0.01 * parseFloat(c.substring(0, c.length - 1)); 1.382 + } else if (three == "deg") { 1.383 + val = parseFloat(c) / 360.0; 1.384 + } else if (three == "rad") { 1.385 + val = parseFloat(c) / (Math.PI * 2); 1.386 + } else { 1.387 + val = scales[i] * parseFloat(c); 1.388 + } 1.389 + colorFloats.push(val); 1.390 + } 1.391 + return this[method].apply(this, colorFloats); 1.392 + }, 1.393 + 1.394 + /** @id MochiKit.Color.Color.fromComputedStyle */ 1.395 + fromComputedStyle: function (elem, style) { 1.396 + var d = MochiKit.DOM; 1.397 + var cls = MochiKit.Color.Color; 1.398 + for (elem = d.getElement(elem); elem; elem = elem.parentNode) { 1.399 + var actualColor = MochiKit.Style.computedStyle.apply(d, arguments); 1.400 + if (!actualColor) { 1.401 + continue; 1.402 + } 1.403 + var color = cls.fromString(actualColor); 1.404 + if (!color) { 1.405 + break; 1.406 + } 1.407 + if (color.asRGB().a > 0) { 1.408 + return color; 1.409 + } 1.410 + } 1.411 + return null; 1.412 + }, 1.413 + 1.414 + /** @id MochiKit.Color.Color.fromBackground */ 1.415 + fromBackground: function (elem) { 1.416 + var cls = MochiKit.Color.Color; 1.417 + return cls.fromComputedStyle( 1.418 + elem, "backgroundColor", "background-color") || cls.whiteColor(); 1.419 + }, 1.420 + 1.421 + /** @id MochiKit.Color.Color.fromText */ 1.422 + fromText: function (elem) { 1.423 + var cls = MochiKit.Color.Color; 1.424 + return cls.fromComputedStyle( 1.425 + elem, "color", "color") || cls.blackColor(); 1.426 + }, 1.427 + 1.428 + /** @id MochiKit.Color.Color.namedColors */ 1.429 + namedColors: function () { 1.430 + return MochiKit.Base.clone(MochiKit.Color.Color._namedColors); 1.431 + } 1.432 +}); 1.433 + 1.434 + 1.435 +// Module level functions 1.436 + 1.437 +MochiKit.Base.update(MochiKit.Color, { 1.438 + /** @id MochiKit.Color.clampColorComponent */ 1.439 + clampColorComponent: function (v, scale) { 1.440 + v *= scale; 1.441 + if (v < 0) { 1.442 + return 0; 1.443 + } else if (v > scale) { 1.444 + return scale; 1.445 + } else { 1.446 + return v; 1.447 + } 1.448 + }, 1.449 + 1.450 + _hslValue: function (n1, n2, hue) { 1.451 + if (hue > 6.0) { 1.452 + hue -= 6.0; 1.453 + } else if (hue < 0.0) { 1.454 + hue += 6.0; 1.455 + } 1.456 + var val; 1.457 + if (hue < 1.0) { 1.458 + val = n1 + (n2 - n1) * hue; 1.459 + } else if (hue < 3.0) { 1.460 + val = n2; 1.461 + } else if (hue < 4.0) { 1.462 + val = n1 + (n2 - n1) * (4.0 - hue); 1.463 + } else { 1.464 + val = n1; 1.465 + } 1.466 + return val; 1.467 + }, 1.468 + 1.469 + /** @id MochiKit.Color.hsvToRGB */ 1.470 + hsvToRGB: function (hue, saturation, value, alpha) { 1.471 + if (arguments.length == 1) { 1.472 + var hsv = hue; 1.473 + hue = hsv.h; 1.474 + saturation = hsv.s; 1.475 + value = hsv.v; 1.476 + alpha = hsv.a; 1.477 + } 1.478 + var red; 1.479 + var green; 1.480 + var blue; 1.481 + if (saturation === 0) { 1.482 + red = 0; 1.483 + green = 0; 1.484 + blue = 0; 1.485 + } else { 1.486 + var i = Math.floor(hue * 6); 1.487 + var f = (hue * 6) - i; 1.488 + var p = value * (1 - saturation); 1.489 + var q = value * (1 - (saturation * f)); 1.490 + var t = value * (1 - (saturation * (1 - f))); 1.491 + switch (i) { 1.492 + case 1: red = q; green = value; blue = p; break; 1.493 + case 2: red = p; green = value; blue = t; break; 1.494 + case 3: red = p; green = q; blue = value; break; 1.495 + case 4: red = t; green = p; blue = value; break; 1.496 + case 5: red = value; green = p; blue = q; break; 1.497 + case 6: // fall through 1.498 + case 0: red = value; green = t; blue = p; break; 1.499 + } 1.500 + } 1.501 + return { 1.502 + r: red, 1.503 + g: green, 1.504 + b: blue, 1.505 + a: alpha 1.506 + }; 1.507 + }, 1.508 + 1.509 + /** @id MochiKit.Color.hslToRGB */ 1.510 + hslToRGB: function (hue, saturation, lightness, alpha) { 1.511 + if (arguments.length == 1) { 1.512 + var hsl = hue; 1.513 + hue = hsl.h; 1.514 + saturation = hsl.s; 1.515 + lightness = hsl.l; 1.516 + alpha = hsl.a; 1.517 + } 1.518 + var red; 1.519 + var green; 1.520 + var blue; 1.521 + if (saturation === 0) { 1.522 + red = lightness; 1.523 + green = lightness; 1.524 + blue = lightness; 1.525 + } else { 1.526 + var m2; 1.527 + if (lightness <= 0.5) { 1.528 + m2 = lightness * (1.0 + saturation); 1.529 + } else { 1.530 + m2 = lightness + saturation - (lightness * saturation); 1.531 + } 1.532 + var m1 = (2.0 * lightness) - m2; 1.533 + var f = MochiKit.Color._hslValue; 1.534 + var h6 = hue * 6.0; 1.535 + red = f(m1, m2, h6 + 2); 1.536 + green = f(m1, m2, h6); 1.537 + blue = f(m1, m2, h6 - 2); 1.538 + } 1.539 + return { 1.540 + r: red, 1.541 + g: green, 1.542 + b: blue, 1.543 + a: alpha 1.544 + }; 1.545 + }, 1.546 + 1.547 + /** @id MochiKit.Color.rgbToHSV */ 1.548 + rgbToHSV: function (red, green, blue, alpha) { 1.549 + if (arguments.length == 1) { 1.550 + var rgb = red; 1.551 + red = rgb.r; 1.552 + green = rgb.g; 1.553 + blue = rgb.b; 1.554 + alpha = rgb.a; 1.555 + } 1.556 + var max = Math.max(Math.max(red, green), blue); 1.557 + var min = Math.min(Math.min(red, green), blue); 1.558 + var hue; 1.559 + var saturation; 1.560 + var value = max; 1.561 + if (min == max) { 1.562 + hue = 0; 1.563 + saturation = 0; 1.564 + } else { 1.565 + var delta = (max - min); 1.566 + saturation = delta / max; 1.567 + 1.568 + if (red == max) { 1.569 + hue = (green - blue) / delta; 1.570 + } else if (green == max) { 1.571 + hue = 2 + ((blue - red) / delta); 1.572 + } else { 1.573 + hue = 4 + ((red - green) / delta); 1.574 + } 1.575 + hue /= 6; 1.576 + if (hue < 0) { 1.577 + hue += 1; 1.578 + } 1.579 + if (hue > 1) { 1.580 + hue -= 1; 1.581 + } 1.582 + } 1.583 + return { 1.584 + h: hue, 1.585 + s: saturation, 1.586 + v: value, 1.587 + a: alpha 1.588 + }; 1.589 + }, 1.590 + 1.591 + /** @id MochiKit.Color.rgbToHSL */ 1.592 + rgbToHSL: function (red, green, blue, alpha) { 1.593 + if (arguments.length == 1) { 1.594 + var rgb = red; 1.595 + red = rgb.r; 1.596 + green = rgb.g; 1.597 + blue = rgb.b; 1.598 + alpha = rgb.a; 1.599 + } 1.600 + var max = Math.max(red, Math.max(green, blue)); 1.601 + var min = Math.min(red, Math.min(green, blue)); 1.602 + var hue; 1.603 + var saturation; 1.604 + var lightness = (max + min) / 2.0; 1.605 + var delta = max - min; 1.606 + if (delta === 0) { 1.607 + hue = 0; 1.608 + saturation = 0; 1.609 + } else { 1.610 + if (lightness <= 0.5) { 1.611 + saturation = delta / (max + min); 1.612 + } else { 1.613 + saturation = delta / (2 - max - min); 1.614 + } 1.615 + if (red == max) { 1.616 + hue = (green - blue) / delta; 1.617 + } else if (green == max) { 1.618 + hue = 2 + ((blue - red) / delta); 1.619 + } else { 1.620 + hue = 4 + ((red - green) / delta); 1.621 + } 1.622 + hue /= 6; 1.623 + if (hue < 0) { 1.624 + hue += 1; 1.625 + } 1.626 + if (hue > 1) { 1.627 + hue -= 1; 1.628 + } 1.629 + 1.630 + } 1.631 + return { 1.632 + h: hue, 1.633 + s: saturation, 1.634 + l: lightness, 1.635 + a: alpha 1.636 + }; 1.637 + }, 1.638 + 1.639 + /** @id MochiKit.Color.toColorPart */ 1.640 + toColorPart: function (num) { 1.641 + num = Math.round(num); 1.642 + var digits = num.toString(16); 1.643 + if (num < 16) { 1.644 + return '0' + digits; 1.645 + } 1.646 + return digits; 1.647 + }, 1.648 + 1.649 + __new__: function () { 1.650 + var m = MochiKit.Base; 1.651 + /** @id MochiKit.Color.fromRGBString */ 1.652 + this.Color.fromRGBString = m.bind( 1.653 + this.Color._fromColorString, this.Color, "rgb", "fromRGB", 1.654 + [1.0/255.0, 1.0/255.0, 1.0/255.0, 1] 1.655 + ); 1.656 + /** @id MochiKit.Color.fromHSLString */ 1.657 + this.Color.fromHSLString = m.bind( 1.658 + this.Color._fromColorString, this.Color, "hsl", "fromHSL", 1.659 + [1.0/360.0, 0.01, 0.01, 1] 1.660 + ); 1.661 + 1.662 + var third = 1.0 / 3.0; 1.663 + /** @id MochiKit.Color.colors */ 1.664 + var colors = { 1.665 + // NSColor colors plus transparent 1.666 + /** @id MochiKit.Color.blackColor */ 1.667 + black: [0, 0, 0], 1.668 + /** @id MochiKit.Color.blueColor */ 1.669 + blue: [0, 0, 1], 1.670 + /** @id MochiKit.Color.brownColor */ 1.671 + brown: [0.6, 0.4, 0.2], 1.672 + /** @id MochiKit.Color.cyanColor */ 1.673 + cyan: [0, 1, 1], 1.674 + /** @id MochiKit.Color.darkGrayColor */ 1.675 + darkGray: [third, third, third], 1.676 + /** @id MochiKit.Color.grayColor */ 1.677 + gray: [0.5, 0.5, 0.5], 1.678 + /** @id MochiKit.Color.greenColor */ 1.679 + green: [0, 1, 0], 1.680 + /** @id MochiKit.Color.lightGrayColor */ 1.681 + lightGray: [2 * third, 2 * third, 2 * third], 1.682 + /** @id MochiKit.Color.magentaColor */ 1.683 + magenta: [1, 0, 1], 1.684 + /** @id MochiKit.Color.orangeColor */ 1.685 + orange: [1, 0.5, 0], 1.686 + /** @id MochiKit.Color.purpleColor */ 1.687 + purple: [0.5, 0, 0.5], 1.688 + /** @id MochiKit.Color.redColor */ 1.689 + red: [1, 0, 0], 1.690 + /** @id MochiKit.Color.transparentColor */ 1.691 + transparent: [0, 0, 0, 0], 1.692 + /** @id MochiKit.Color.whiteColor */ 1.693 + white: [1, 1, 1], 1.694 + /** @id MochiKit.Color.yellowColor */ 1.695 + yellow: [1, 1, 0] 1.696 + }; 1.697 + 1.698 + var makeColor = function (name, r, g, b, a) { 1.699 + var rval = this.fromRGB(r, g, b, a); 1.700 + this[name] = function () { return rval; }; 1.701 + return rval; 1.702 + }; 1.703 + 1.704 + for (var k in colors) { 1.705 + var name = k + "Color"; 1.706 + var bindArgs = m.concat( 1.707 + [makeColor, this.Color, name], 1.708 + colors[k] 1.709 + ); 1.710 + this.Color[name] = m.bind.apply(null, bindArgs); 1.711 + } 1.712 + 1.713 + var isColor = function () { 1.714 + for (var i = 0; i < arguments.length; i++) { 1.715 + if (!(arguments[i] instanceof Color)) { 1.716 + return false; 1.717 + } 1.718 + } 1.719 + return true; 1.720 + }; 1.721 + 1.722 + var compareColor = function (a, b) { 1.723 + return a.compareRGB(b); 1.724 + }; 1.725 + 1.726 + m.nameFunctions(this); 1.727 + 1.728 + m.registerComparator(this.Color.NAME, isColor, compareColor); 1.729 + 1.730 + this.EXPORT_TAGS = { 1.731 + ":common": this.EXPORT, 1.732 + ":all": m.concat(this.EXPORT, this.EXPORT_OK) 1.733 + }; 1.734 + 1.735 + } 1.736 +}); 1.737 + 1.738 +MochiKit.Color.EXPORT = [ 1.739 + "Color" 1.740 +]; 1.741 + 1.742 +MochiKit.Color.EXPORT_OK = [ 1.743 + "clampColorComponent", 1.744 + "rgbToHSL", 1.745 + "hslToRGB", 1.746 + "rgbToHSV", 1.747 + "hsvToRGB", 1.748 + "toColorPart" 1.749 +]; 1.750 + 1.751 +MochiKit.Color.__new__(); 1.752 + 1.753 +MochiKit.Base._exportSymbols(this, MochiKit.Color); 1.754 + 1.755 +// Full table of css3 X11 colors <http://www.w3.org/TR/css3-color/#X11COLORS> 1.756 + 1.757 +MochiKit.Color.Color._namedColors = { 1.758 + aliceblue: "#f0f8ff", 1.759 + antiquewhite: "#faebd7", 1.760 + aqua: "#00ffff", 1.761 + aquamarine: "#7fffd4", 1.762 + azure: "#f0ffff", 1.763 + beige: "#f5f5dc", 1.764 + bisque: "#ffe4c4", 1.765 + black: "#000000", 1.766 + blanchedalmond: "#ffebcd", 1.767 + blue: "#0000ff", 1.768 + blueviolet: "#8a2be2", 1.769 + brown: "#a52a2a", 1.770 + burlywood: "#deb887", 1.771 + cadetblue: "#5f9ea0", 1.772 + chartreuse: "#7fff00", 1.773 + chocolate: "#d2691e", 1.774 + coral: "#ff7f50", 1.775 + cornflowerblue: "#6495ed", 1.776 + cornsilk: "#fff8dc", 1.777 + crimson: "#dc143c", 1.778 + cyan: "#00ffff", 1.779 + darkblue: "#00008b", 1.780 + darkcyan: "#008b8b", 1.781 + darkgoldenrod: "#b8860b", 1.782 + darkgray: "#a9a9a9", 1.783 + darkgreen: "#006400", 1.784 + darkgrey: "#a9a9a9", 1.785 + darkkhaki: "#bdb76b", 1.786 + darkmagenta: "#8b008b", 1.787 + darkolivegreen: "#556b2f", 1.788 + darkorange: "#ff8c00", 1.789 + darkorchid: "#9932cc", 1.790 + darkred: "#8b0000", 1.791 + darksalmon: "#e9967a", 1.792 + darkseagreen: "#8fbc8f", 1.793 + darkslateblue: "#483d8b", 1.794 + darkslategray: "#2f4f4f", 1.795 + darkslategrey: "#2f4f4f", 1.796 + darkturquoise: "#00ced1", 1.797 + darkviolet: "#9400d3", 1.798 + deeppink: "#ff1493", 1.799 + deepskyblue: "#00bfff", 1.800 + dimgray: "#696969", 1.801 + dimgrey: "#696969", 1.802 + dodgerblue: "#1e90ff", 1.803 + firebrick: "#b22222", 1.804 + floralwhite: "#fffaf0", 1.805 + forestgreen: "#228b22", 1.806 + fuchsia: "#ff00ff", 1.807 + gainsboro: "#dcdcdc", 1.808 + ghostwhite: "#f8f8ff", 1.809 + gold: "#ffd700", 1.810 + goldenrod: "#daa520", 1.811 + gray: "#808080", 1.812 + green: "#008000", 1.813 + greenyellow: "#adff2f", 1.814 + grey: "#808080", 1.815 + honeydew: "#f0fff0", 1.816 + hotpink: "#ff69b4", 1.817 + indianred: "#cd5c5c", 1.818 + indigo: "#4b0082", 1.819 + ivory: "#fffff0", 1.820 + khaki: "#f0e68c", 1.821 + lavender: "#e6e6fa", 1.822 + lavenderblush: "#fff0f5", 1.823 + lawngreen: "#7cfc00", 1.824 + lemonchiffon: "#fffacd", 1.825 + lightblue: "#add8e6", 1.826 + lightcoral: "#f08080", 1.827 + lightcyan: "#e0ffff", 1.828 + lightgoldenrodyellow: "#fafad2", 1.829 + lightgray: "#d3d3d3", 1.830 + lightgreen: "#90ee90", 1.831 + lightgrey: "#d3d3d3", 1.832 + lightpink: "#ffb6c1", 1.833 + lightsalmon: "#ffa07a", 1.834 + lightseagreen: "#20b2aa", 1.835 + lightskyblue: "#87cefa", 1.836 + lightslategray: "#778899", 1.837 + lightslategrey: "#778899", 1.838 + lightsteelblue: "#b0c4de", 1.839 + lightyellow: "#ffffe0", 1.840 + lime: "#00ff00", 1.841 + limegreen: "#32cd32", 1.842 + linen: "#faf0e6", 1.843 + magenta: "#ff00ff", 1.844 + maroon: "#800000", 1.845 + mediumaquamarine: "#66cdaa", 1.846 + mediumblue: "#0000cd", 1.847 + mediumorchid: "#ba55d3", 1.848 + mediumpurple: "#9370db", 1.849 + mediumseagreen: "#3cb371", 1.850 + mediumslateblue: "#7b68ee", 1.851 + mediumspringgreen: "#00fa9a", 1.852 + mediumturquoise: "#48d1cc", 1.853 + mediumvioletred: "#c71585", 1.854 + midnightblue: "#191970", 1.855 + mintcream: "#f5fffa", 1.856 + mistyrose: "#ffe4e1", 1.857 + moccasin: "#ffe4b5", 1.858 + navajowhite: "#ffdead", 1.859 + navy: "#000080", 1.860 + oldlace: "#fdf5e6", 1.861 + olive: "#808000", 1.862 + olivedrab: "#6b8e23", 1.863 + orange: "#ffa500", 1.864 + orangered: "#ff4500", 1.865 + orchid: "#da70d6", 1.866 + palegoldenrod: "#eee8aa", 1.867 + palegreen: "#98fb98", 1.868 + paleturquoise: "#afeeee", 1.869 + palevioletred: "#db7093", 1.870 + papayawhip: "#ffefd5", 1.871 + peachpuff: "#ffdab9", 1.872 + peru: "#cd853f", 1.873 + pink: "#ffc0cb", 1.874 + plum: "#dda0dd", 1.875 + powderblue: "#b0e0e6", 1.876 + purple: "#800080", 1.877 + red: "#ff0000", 1.878 + rosybrown: "#bc8f8f", 1.879 + royalblue: "#4169e1", 1.880 + saddlebrown: "#8b4513", 1.881 + salmon: "#fa8072", 1.882 + sandybrown: "#f4a460", 1.883 + seagreen: "#2e8b57", 1.884 + seashell: "#fff5ee", 1.885 + sienna: "#a0522d", 1.886 + silver: "#c0c0c0", 1.887 + skyblue: "#87ceeb", 1.888 + slateblue: "#6a5acd", 1.889 + slategray: "#708090", 1.890 + slategrey: "#708090", 1.891 + snow: "#fffafa", 1.892 + springgreen: "#00ff7f", 1.893 + steelblue: "#4682b4", 1.894 + tan: "#d2b48c", 1.895 + teal: "#008080", 1.896 + thistle: "#d8bfd8", 1.897 + tomato: "#ff6347", 1.898 + turquoise: "#40e0d0", 1.899 + violet: "#ee82ee", 1.900 + wheat: "#f5deb3", 1.901 + white: "#ffffff", 1.902 + whitesmoke: "#f5f5f5", 1.903 + yellow: "#ffff00", 1.904 + yellowgreen: "#9acd32" 1.905 +};