1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 | 1 9 21 1 1 21 21 5 21 21 21 21 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 | /* * Photo Editor SDK - photoeditorsdk.com * Copyright (c) 2013-2015 9elements GmbH * * Released under Attribution-NonCommercial 3.0 Unported * http://creativecommons.org/licenses/by-nc/3.0/ * * For commercial use, please contact us at contact@9elements.com */ /** * Represents a color * @class * @alias ImglyKit.Color * @param {Number} r * @param {Number} g * @param {Number} b * @param {Number} [a] * @private */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); // istanbul ignore next var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; Eif ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { Eif (protoProps) defineProperties(Constructor.prototype, protoProps); Iif (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); // istanbul ignore next function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } var Color = (function () { function Color(r, g, b, a) { _classCallCheck(this, Color); if (typeof a === 'undefined') { a = 1.0; } this.r = r; this.g = g; this.b = b; this.a = a; } /** * Returns an rgba() representation of this color * @return {String} */ _createClass(Color, [{ key: 'toRGBA', value: function toRGBA() { var colors = [Math.round(this.r * 255), Math.round(this.g * 255), Math.round(this.b * 255), this.a]; return 'rgba(' + colors.join(',') + ')'; } /** * Returns a hex representation of this color * @return {String} */ }, { key: 'toHex', value: function toHex() { var components = [this._componentToHex(Math.round(this.r * 255)), this._componentToHex(Math.round(this.g * 255)), this._componentToHex(Math.round(this.b * 255))]; return '#' + components.join(''); } /** * Returns an array with 4 values (0...1) * @return {Array.<Number>} */ }, { key: 'toGLColor', value: function toGLColor() { return [this.r, this.g, this.b, this.a]; } /** * Returns an array with 3 values (0...1) * @return {Array.<Number>} */ }, { key: 'toRGBGLColor', value: function toRGBGLColor() { return [this.r, this.g, this.b]; } /** * Converts the RGB value to HSV * @return {Array.<Number>} */ }, { key: 'toHSV', value: function toHSV() { var max = Math.max(this.r, this.g, this.b); var min = Math.min(this.r, this.g, this.b); var h = undefined; var s = undefined; var v = max; var d = max - min; s = max === 0 ? 0 : d / max; Iif (max === min) { h = 0; // achromatic } else { switch (max) { case this.r: h = (this.g - this.b) / d + (this.g < this.b ? 6 : 0); break; case this.g: h = (this.b - this.r) / d + 2; break; case this.b: h = (this.r - this.g) / d + 4; break; } h /= 6; } return [h, s, v]; } /** * Sets the RGB values of this color to match the given HSV values * @param {Number} h * @param {Number} s * @param {Number} v */ }, { key: 'fromHSV', value: function fromHSV(h, s, v) { var r = this.r; var g = this.g; var b = this.b; var i = Math.floor(h * 6); var f = h * 6 - i; var p = v * (1 - s); var q = v * (1 - f * s); var t = v * (1 - (1 - f) * s); switch (i % 6) { 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; } this.r = r; this.g = g; this.b = b; } /** * Returns a clone of the current color * @return {Color} */ }, { key: 'clone', value: function clone() { return new Color(this.r, this.g, this.b, this.a); } /** * Returns the given number as hex * @param {Number} component * @return {String} * @private */ }, { key: '_componentToHex', value: function _componentToHex(component) { var hex = component.toString(16); return hex.length === 1 ? '0' + hex : hex; } /** * Returns the string representation of this color * @returns {String} */ }, { key: 'toString', value: function toString() { return 'Color(' + this.r + ', ' + this.g + ', ' + this.b + ', ' + this.a + ')'; } }]); return Color; })(); exports['default'] = Color; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9yb290L1NFUlZFUi9pbWdseS1zZGstaHRtbDUvc3JjL2pzL2xpYi9jb2xvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFvQk0sS0FBSztBQUNHLFdBRFIsS0FBSyxDQUNJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTswQkFEckIsS0FBSzs7QUFFUCxRQUFJLE9BQU8sQ0FBQyxLQUFLLFdBQVcsRUFBRTtBQUM1QixPQUFDLEdBQUcsR0FBRyxDQUFBO0tBQ1I7O0FBRUQsUUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDVixRQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNWLFFBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ1YsUUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7R0FDWDs7Ozs7OztlQVZHLEtBQUs7O1dBZ0JGLGtCQUFHO0FBQ1IsVUFBSSxNQUFNLEdBQUcsQ0FDWCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUN4QixJQUFJLENBQUMsQ0FBQyxDQUNQLENBQUE7QUFDRCxhQUFPLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtLQUN4Qzs7Ozs7Ozs7V0FNSyxpQkFBRztBQUNQLFVBQUksVUFBVSxHQUFHLENBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFDOUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMs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R0FBRyxDQUFDLENBQUE7S0FDWDs7Ozs7Ozs7V0FNSyxpQkFBRztBQUNQLGFBQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2pEOzs7Ozs7Ozs7O1dBUWUseUJBQUMsU0FBUyxFQUFFO0FBQzFCLFVBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDaEMsYUFBTyxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQTtLQUMxQzs7Ozs7Ozs7V0FNUSxvQkFBRztBQUNWLHdCQUFnQixJQUFJLENBQUMsQ0FBQyxVQUFLLElBQUksQ0FBQyxDQUFDLFVBQUssSUFBSSxDQUFDLENBQUMsVUFBSyxJQUFJLENBQUMsQ0FBQyxPQUFHO0tBQzNEOzs7U0F0S0csS0FBSzs7O3FCQXlLSSxLQUFLIiwiZmlsZSI6Ii9yb290L1NFUlZFUi9pbWdseS1zZGstaHRtbDUvc3JjL2pzL2xpYi9jb2xvci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQaG90byBFZGl0b3IgU0RLIC0gcGhvdG9lZGl0b3JzZGsuY29tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSA5ZWxlbWVudHMgR21iSFxuICpcbiAqIFJlbGVhc2VkIHVuZGVyIEF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwgMy4wIFVucG9ydGVkXG4gKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy8zLjAvXG4gKlxuICogRm9yIGNvbW1lcmNpYWwgdXNlLCBwbGVhc2UgY29udGFjdCB1cyBhdCBjb250YWN0QDllbGVtZW50cy5jb21cbiAqL1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb2xvclxuICogQGNsYXNzXG4gKiBAYWxpYXMgSW1nbHlLaXQuQ29sb3JcbiAqIEBwYXJhbSB7TnVtYmVyfSByXG4gKiBAcGFyYW0ge051bWJlcn0gZ1xuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbYV1cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvbG9yIHtcbiAgY29uc3RydWN0b3IgKHIsIGcsIGIsIGEpIHtcbiAgICBpZiAodHlwZW9mIGEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBhID0gMS4wXG4gICAgfVxuXG4gICAgdGhpcy5yID0gclxuICAgIHRoaXMuZyA9IGdcbiAgICB0aGlzLmIgPSBiXG4gICAgdGhpcy5hID0gYVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gcmdiYSgpIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29sb3JcbiAgICogQHJldHVybiB7U3RyaW5nfVxuICAgKi9cbiAgdG9SR0JBICgpIHtcbiAgICB2YXIgY29sb3JzID0gW1xuICAgICAgTWF0aC5yb3VuZCh0aGlzLnIgKiAyNTUpLFxuICAgICAgTWF0aC5yb3VuZCh0aGlzLmcgKiAyNTUpLFxuICAgICAgTWF0aC5yb3VuZCh0aGlzLmIgKiAyNTUpLFxuICAgICAgdGhpcy5hXG4gICAgXVxuICAgIHJldHVybiAncmdiYSgnICsgY29sb3JzLmpvaW4oJywnKSArICcpJ1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBoZXggcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb2xvclxuICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAqL1xuICB0b0hleCAoKSB7XG4gICAgdmFyIGNvbXBvbmVudHMgPSBbXG4gICAgICB0aGlzLl9jb21wb25lbnRUb0hleChNYXRoLnJvdW5kKHRoaXMuciAqIDI1NSkpLFxuICAgICAgdGhpcy5fY29tcG9uZW50VG9IZXgoTWF0aC5yb3VuZCh0aGlzLmcgKiAyNTUpKSxcbiAgICAgIHRoaXMuX2NvbXBvbmVudFRvSGV4KE1hdGgucm91bmQodGhpcy5iICogMjU1KSlcbiAgICBdXG4gICAgcmV0dXJuICcjJyArIGNvbXBvbmVudHMuam9pbignJylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggNCB2YWx1ZXMgKDAuLi4xKVxuICAgKiBAcmV0dXJuIHtBcnJheS48TnVtYmVyPn1cbiAgICovXG4gIHRvR0xDb2xvciAoKSB7XG4gICAgcmV0dXJuIFt0aGlzLnIsIHRoaXMuZywgdGhpcy5iLCB0aGlzLmFdXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSB3aXRoIDMgdmFsdWVzICgwLi4uMSlcbiAgICogQHJldHVybiB7QXJyYXkuPE51bWJlcj59XG4gICAqL1xuICB0b1JHQkdMQ29sb3IgKCkge1xuICAgIHJldHVybiBbdGhpcy5yLCB0aGlzLmcsIHRoaXMuYl1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgUkdCIHZhbHVlIHRvIEhTVlxuICAgKiBAcmV0dXJuIHtBcnJheS48TnVtYmVyPn1cbiAgICovXG4gIHRvSFNWICgpIHtcbiAgICBsZXQgbWF4ID0gTWF0aC5tYXgodGhpcy5yLCB0aGlzLmcsIHRoaXMuYilcbiAgICBsZXQgbWluID0gTWF0aC5taW4odGhpcy5yLCB0aGlzLmcsIHRoaXMuYilcbiAgICBsZXQgaFxuICAgIGxldCBzXG4gICAgbGV0IHYgPSBtYXhcbiAgICBsZXQgZCA9IG1heCAtIG1pblxuICAgIHMgPSBtYXggPT09IDAgPyAwIDogZCAvIG1heFxuXG4gICAgaWYgKG1heCA9PT0gbWluKSB7XG4gICAgICBoID0gMCAvLyBhY2hyb21hdGljXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAobWF4KSB7XG4gICAgICAgIGNhc2UgdGhpcy5yOlxuICAgICAgICAgIGggPSAodGhpcy5nIC0gdGhpcy5iKSAvIGQgKyAodGhpcy5nIDwgdGhpcy5iID8gNiA6IDApXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSB0aGlzLmc6XG4gICAgICAgICAgaCA9ICh0aGlzLmIgLSB0aGlzLnIpIC8gZCArIDJcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIHRoaXMuYjpcbiAgICAgICAgICBoID0gKHRoaXMuciAtIHRoaXMuZykgLyBkICsgNFxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBoIC89IDZcbiAgICB9XG5cbiAgICByZXR1cm4gW2gsIHMsIHZdXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgUkdCIHZhbHVlcyBvZiB0aGlzIGNvbG9yIHRvIG1hdGNoIHRoZSBnaXZlbiBIU1YgdmFsdWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB2XG4gICAqL1xuICBmcm9tSFNWIChoLCBzLCB2KSB7XG4gICAgbGV0IHtyLCBnLCBifSA9IHRoaXNcblxuICAgIGxldCBpID0gTWF0aC5mbG9vcihoICogNilcbiAgICBsZXQgZiA9IGggKiA2IC0gaVxuICAgIGxldCBwID0gdiAqICgxIC0gcylcbiAgICBsZXQgcSA9IHYgKiAoMSAtIGYgKiBzKVxuICAgIGxldCB0ID0gdiAqICgxIC0gKDEgLSBmKSAqIHMpXG5cbiAgICBzd2l0Y2ggKGkgJSA2KSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHIgPSB2XG4gICAgICAgIGcgPSB0XG4gICAgICAgIGIgPSBwXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDE6XG4gICAgICAgIHIgPSBxXG4gICAgICAgIGcgPSB2XG4gICAgICAgIGIgPSBwXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDI6XG4gICAgICAgIHIgPSBwXG4gICAgICAgIGcgPSB2XG4gICAgICAgIGIgPSB0XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDM6XG4gICAgICAgIHIgPSBwXG4gICAgICAgIGcgPSBxXG4gICAgICAgIGIgPSB2XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHIgPSB0XG4gICAgICAgIGcgPSBwXG4gICAgICAgIGIgPSB2XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDU6XG4gICAgICAgIHIgPSB2XG4gICAgICAgIGcgPSBwXG4gICAgICAgIGIgPSBxXG4gICAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgdGhpcy5yID0gclxuICAgIHRoaXMuZyA9IGdcbiAgICB0aGlzLmIgPSBiXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNsb25lIG9mIHRoZSBjdXJyZW50IGNvbG9yXG4gICAqIEByZXR1cm4ge0NvbG9yfVxuICAgKi9cbiAgY2xvbmUgKCkge1xuICAgIHJldHVybiBuZXcgQ29sb3IodGhpcy5yLCB0aGlzLmcsIHRoaXMuYiwgdGhpcy5hKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGdpdmVuIG51bWJlciBhcyBoZXhcbiAgICogQHBhcmFtICB7TnVtYmVyfSBjb21wb25lbnRcbiAgICogQHJldHVybiB7U3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NvbXBvbmVudFRvSGV4IChjb21wb25lbnQpIHtcbiAgICB2YXIgaGV4ID0gY29tcG9uZW50LnRvU3RyaW5nKDE2KVxuICAgIHJldHVybiBoZXgubGVuZ3RoID09PSAxID8gJzAnICsgaGV4IDogaGV4XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29sb3JcbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICovXG4gIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gYENvbG9yKCR7dGhpcy5yfSwgJHt0aGlzLmd9LCAke3RoaXMuYn0sICR7dGhpcy5hfSlgXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29sb3JcbiJdfQ== |