app/javascripts/yahoo.color.js
/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */
var YAHOO = function() { return {util: {}} } ();
YAHOO.util.Color = new function() {
// Adapted from http://www.easyrgb.com/math.html
// hsv values = 0 - 1
// rgb values 0 - 255
this.hsv2rgb = function (h, s, v) {
var r, g, b;
if ( s == 0 ) {
r = v * 255;
g = v * 255;
b = v * 255;
} else {
// h must be < 1
var var_h = h * 6;
if ( var_h == 6 ) {
var_h = 0;
}
//Or ... var_i = floor( var_h )
var var_i = Math.floor( var_h );
var var_1 = v * ( 1 - s );
var var_2 = v * ( 1 - s * ( var_h - var_i ) );
var var_3 = v * ( 1 - s * ( 1 - ( var_h - var_i ) ) );
if ( var_i == 0 ) {
var_r = v;
var_g = var_3;
var_b = var_1;
} else if ( var_i == 1 ) {
var_r = var_2;
var_g = v;
var_b = var_1;
} else if ( var_i == 2 ) {
var_r = var_1;
var_g = v;
var_b = var_3
} else if ( var_i == 3 ) {
var_r = var_1;
var_g = var_2;
var_b = v;
} else if ( var_i == 4 ) {
var_r = var_3;
var_g = var_1;
var_b = v;
} else {
var_r = v;
var_g = var_1;
var_b = var_2
}
r = var_r * 255 //rgb results = 0 ÷ 255
g = var_g * 255
b = var_b * 255
}
return [Math.round(r), Math.round(g), Math.round(b)];
};
// added by Matthias Platzer AT knallgrau.at
this.rgb2hsv = function (r, g, b) {
var r = ( r / 255 ); //RGB values = 0 ÷ 255
var g = ( g / 255 );
var b = ( b / 255 );
var min = Math.min( r, g, b ); //Min. value of RGB
var max = Math.max( r, g, b ); //Max. value of RGB
deltaMax = max - min; //Delta RGB value
var v = max;
var s, h;
var deltaRed, deltaGreen, deltaBlue;
if ( deltaMax == 0 ) //This is a gray, no chroma...
{
h = 0; //HSV results = 0 ÷ 1
s = 0;
}
else //Chromatic data...
{
s = deltaMax / max;
deltaRed = ( ( ( max - r ) / 6 ) + ( deltaMax / 2 ) ) / deltaMax;
deltaGreen = ( ( ( max - g ) / 6 ) + ( deltaMax / 2 ) ) / deltaMax;
deltaBlue = ( ( ( max - b ) / 6 ) + ( deltaMax / 2 ) ) / deltaMax;
if ( r == max ) h = deltaBlue - deltaGreen;
else if ( g == max ) h = ( 1 / 3 ) + deltaRed - deltaBlue;
else if ( b == max ) h = ( 2 / 3 ) + deltaGreen - deltaRed;
if ( h < 0 ) h += 1;
if ( h > 1 ) h -= 1;
}
return [h, s, v];
}
this.rgb2hex = function (r,g,b) {
return this.toHex(r) + this.toHex(g) + this.toHex(b);
};
this.hexchars = "0123456789ABCDEF";
this.toHex = function(n) {
n = n || 0;
n = parseInt(n, 10);
if (isNaN(n)) n = 0;
n = Math.round(Math.min(Math.max(0, n), 255));
return this.hexchars.charAt((n - n % 16) / 16) + this.hexchars.charAt(n % 16);
};
this.toDec = function(hexchar) {
return this.hexchars.indexOf(hexchar.toUpperCase());
};
this.hex2rgb = function(str) {
var rgb = [];
rgb[0] = (this.toDec(str.substr(0, 1)) * 16) +
this.toDec(str.substr(1, 1));
rgb[1] = (this.toDec(str.substr(2, 1)) * 16) +
this.toDec(str.substr(3, 1));
rgb[2] = (this.toDec(str.substr(4, 1)) * 16) +
this.toDec(str.substr(5, 1));
// gLogger.debug("hex2rgb: " + str + ", " + rgb.toString());
return rgb;
};
this.isValidRGB = function(a) {
if ((!a[0] && a[0] !=0) || isNaN(a[0]) || a[0] < 0 || a[0] > 255) return false;
if ((!a[1] && a[1] !=0) || isNaN(a[1]) || a[1] < 0 || a[1] > 255) return false;
if ((!a[2] && a[2] !=0) || isNaN(a[2]) || a[2] < 0 || a[2] > 255) return false;
return true;
};
}