/**
Color provides static methods for color conversion hsv values.
Y.Color.toHSV('f00'); // hsv(0, 100%, 100%)
Y.Color.toHSVA('rgb(255, 255, 0'); // hsva(60, 100%, 100%, 1)
@module color
@submodule color-hsv
@class HSV
@namespace Color
@since 3.8.0
**/
Color = {
/**
@static
@property REGEX_HSV
@type RegExp
@default /hsva?\(([.\d]*), ?([.\d]*)%, ?([.\d]*)%,? ?([.\d]*)?\)/
@since 3.8.0
**/
REGEX_HSV: /hsva?\(([.\d]*), ?([.\d]*)%, ?([.\d]*)%,? ?([.\d]*)?\)/,
/**
@static
@property STR_HSV
@type String
@default hsv({*}, {*}%, {*}%)
@since 3.8.0
**/
STR_HSV: 'hsv({*}, {*}%, {*}%)',
/**
@static
@property STR_HSVA
@type String
@default hsva({*}, {*}%, {*}%, {*})
@since 3.8.0
**/
STR_HSVA: 'hsva({*}, {*}%, {*}%, {*})',
/**
Converts provided color value to an HSV string.
@public
@method toHSV
@param {String} str
@return {String}
@since 3.8.0
**/
toHSV: function (str) {
var clr = Y.Color._convertTo(str, 'hsv');
return clr.toLowerCase();
},
/**
Converts provided color value to an HSVA string.
@public
@method toHSVA
@param {String} str
@return {String}
@since 3.8.0
**/
toHSVA: function (str) {
var clr = Y.Color._convertTo(str, 'hsva');
return clr.toLowerCase();
},
/**
Parses the RGB string into h, s, v values. Will return an Array
of values or an HSV string.
@protected
@method _rgbToHsv
@param {String} str
@param {Boolean} [toArray]
@return {String|Array}
@since 3.8.0
**/
_rgbToHsv: function (str, toArray) {
var h, s, v,
rgb = Y.Color.REGEX_RGB.exec(str),
r = rgb[1] / 255,
g = rgb[2] / 255,
b = rgb[3] / 255,
max = Math.max(r, g, b),
min = Math.min(r, g, b),
delta = max - min;
if (max === min) {
h = 0;
} else if (max === r) {
h = 60 * (g - b) / delta;
} else if (max === g) {
h = (60 * (b - r) / delta) + 120;
} else { // max === b
h = (60 * (r - g) / delta) + 240;
}
s = (max === 0) ? 0 : 1 - (min / max);
// ensure h is between 0 and 360
while (h < 0) {
h += 360;
}
h %= 360;
h = Math.round(h);
// saturation is percentage
s = Math.round(s * 100);
// value is percentage
v = Math.round(max * 100);
if (toArray) {
return [h, s, v];
}
return Y.Color.fromArray([h, s, v], Y.Color.TYPES.HSV);
},
/**
Parses the HSV string into r, b, g values. Will return an Array
of values or an RGB string.
@protected
@method _hsvToRgb
@param {String} str
@param {Boolean} [toArray]
@return {String|Array}
@since 3.8.0
**/
_hsvToRgb: function (str, toArray) {
var hsv = Y.Color.REGEX_HSV.exec(str),
h = parseInt(hsv[1], 10),
s = parseInt(hsv[2], 10) / 100, // 0 - 1
v = parseInt(hsv[3], 10) / 100, // 0 - 1
r,
g,
b,
i = Math.floor(h / 60) % 6,
f = (h / 60) - i,
p = v * (1 - s),
q = v * (1 - (s * f)),
t = v * (1 - (s * (1 - f)));
if (s === 0) {
r = v;
g = v;
b = v;
} else {
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;
}
}
r = Math.min(255, Math.round(r * 256));
g = Math.min(255, Math.round(g * 256));
b = Math.min(255, Math.round(b * 256));
if (toArray) {
return [r, g, b];
}
return Y.Color.fromArray([r, g, b], Y.Color.TYPES.RGB);
}
};
Y.Color = Y.mix(Color, Y.Color);
Y.Color.TYPES = Y.mix(Y.Color.TYPES, {'HSV':'hsv', 'HSVA':'hsva'});
Y.Color.CONVERTS = Y.mix(Y.Color.CONVERTS, {'hsv': 'toHSV', 'hsva': 'toHSVA'});