#

API Docs for: 3.10.3
Show: Inherited Protected Private Deprecated

# File: color/js/color-hsv.js

    /**
    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'});