Rev 1987 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*
Copyright (c) 2004-2006, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
dojo.provide("dojo.gfx.color.hsv");
dojo.require("dojo.lang.array");
dojo.require("dojo.math");
dojo.lang.extend(dojo.gfx.color.Color, {toHsv:function () {
return dojo.gfx.color.rgb2hsv(this.toRgb());
}});
dojo.gfx.color.rgb2hsv = function (r, g, b, options) {
if (dojo.lang.isArray(r)) {
if (g) {
options = g;
}
b = r[2] || 0;
g = r[1] || 0;
r = r[0] || 0;
}
var opt = {inputRange:(options && options.inputRange) ? options.inputRange : 255, outputRange:(options && options.outputRange) ? options.outputRange : [255, 255, 255]};
var h = null;
var s = null;
var v = null;
switch (opt.inputRange) {
case 1:
r = (r * 255);
g = (g * 255);
b = (b * 255);
break;
case 100:
r = (r / 100) * 255;
g = (g / 100) * 255;
b = (b / 100) * 255;
break;
default:
break;
}
var min = Math.min(r, g, b);
v = Math.max(r, g, b);
var delta = v - min;
s = (v == 0) ? 0 : delta / v;
if (s == 0) {
h = 0;
} else {
if (r == v) {
h = 60 * (g - b) / delta;
} else {
if (g == v) {
h = 120 + 60 * (b - r) / delta;
} else {
if (b == v) {
h = 240 + 60 * (r - g) / delta;
}
}
}
if (h <= 0) {
h += 360;
}
}
switch (opt.outputRange[0]) {
case 360:
break;
case 100:
h = (h / 360) * 100;
break;
case 1:
h = (h / 360);
break;
default:
h = (h / 360) * 255;
break;
}
switch (opt.outputRange[1]) {
case 100:
s = s * 100;
case 1:
break;
default:
s = s * 255;
break;
}
switch (opt.outputRange[2]) {
case 100:
v = (v / 255) * 100;
break;
case 1:
v = (v / 255);
break;
default:
break;
}
h = dojo.math.round(h);
s = dojo.math.round(s);
v = dojo.math.round(v);
return [h, s, v];
};
dojo.gfx.color.hsv2rgb = function (h, s, v, options) {
if (dojo.lang.isArray(h)) {
if (s) {
options = s;
}
v = h[2] || 0;
s = h[1] || 0;
h = h[0] || 0;
}
var opt = {inputRange:(options && options.inputRange) ? options.inputRange : [255, 255, 255], outputRange:(options && options.outputRange) ? options.outputRange : 255};
switch (opt.inputRange[0]) {
case 1:
h = h * 360;
break;
case 100:
h = (h / 100) * 360;
break;
case 360:
h = h;
break;
default:
h = (h / 255) * 360;
}
if (h == 360) {
h = 0;
}
switch (opt.inputRange[1]) {
case 100:
s /= 100;
break;
case 255:
s /= 255;
}
switch (opt.inputRange[2]) {
case 100:
v /= 100;
break;
case 255:
v /= 255;
}
var r = null;
var g = null;
var b = null;
if (s == 0) {
r = v;
g = v;
b = v;
} else {
var hTemp = h / 60;
var i = Math.floor(hTemp);
var f = hTemp - i;
var p = v * (1 - s);
var q = v * (1 - (s * f));
var t = v * (1 - (s * (1 - f)));
switch (i) {
case 0:
r = v;
g = t;
b = p;
break;
case 1:
r = q;
g = v;
b = p;
break;
case 2:
r = p;
g = v;
b = t;
break;
case 3:
r = p;
g = q;
b = v;
break;
case 4:
r = t;
g = p;
b = v;
break;
case 5:
r = v;
g = p;
b = q;
break;
}
}
switch (opt.outputRange) {
case 1:
r = dojo.math.round(r, 2);
g = dojo.math.round(g, 2);
b = dojo.math.round(b, 2);
break;
case 100:
r = Math.round(r * 100);
g = Math.round(g * 100);
b = Math.round(b * 100);
break;
default:
r = Math.round(r * 255);
g = Math.round(g * 255);
b = Math.round(b * 255);
}
return [r, g, b];
};