/* * * * (c) 2010-2019 Torstein Honsi * * License: www.highcharts.com/license * * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!! * * */ 'use strict'; var _Globals = require('./Globals.js'); var _Globals2 = _interopRequireDefault(_Globals); var _Utilities = require('./Utilities.js'); var _Utilities2 = _interopRequireDefault(_Utilities); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var isNumber = _Utilities2.default.isNumber, pInt = _Utilities2.default.pInt; /** * A valid color to be parsed and handled by Highcharts. Highcharts internally * supports hex colors like `#ffffff`, rgb colors like `rgb(255,255,255)` and * rgba colors like `rgba(255,255,255,1)`. Other colors may be supported by the * browsers and displayed correctly, but Highcharts is not able to process them * and apply concepts like opacity and brightening. * * @typedef {string} Highcharts.ColorString */ /** * A valid color type than can be parsed and handled by Highcharts. It can be a * color string, a gradient object, or a pattern object. * * @typedef {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject} Highcharts.ColorType */ /** * Gradient options instead of a solid color. * * @example * // Linear gradient used as a color option * color: { * linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 }, * stops: [ * [0, '#003399'], // start * [0.5, '#ffffff'], // middle * [1, '#3366AA'] // end * ] * } * * @interface Highcharts.GradientColorObject */ /** * Holds an object that defines the start position and the end position relative * to the shape. * @name Highcharts.GradientColorObject#linearGradient * @type {Highcharts.LinearGradientColorObject|undefined} */ /** * Holds an object that defines the center position and the radius. * @name Highcharts.GradientColorObject#radialGradient * @type {Highcharts.RadialGradientColorObject|undefined} */ /** * The first item in each tuple is the position in the gradient, where 0 is the * start of the gradient and 1 is the end of the gradient. Multiple stops can be * applied. The second item is the color for each stop. This color can also be * given in the rgba format. * @name Highcharts.GradientColorObject#stops * @type {Array} */ /** * Color stop tuple. * * @see Highcharts.GradientColorObject * * @interface Highcharts.GradientColorStopObject */ /** * @name Highcharts.GradientColorStopObject#0 * @type {number} */ /** * @name Highcharts.GradientColorStopObject#1 * @type {Highcharts.ColorString} */ /** * @name Highcharts.GradoentColorStopObject#color * @type {Highcharts.Color|undefined} */ /** * Defines the start position and the end position for a gradient relative * to the shape. Start position (x1, y1) and end position (x2, y2) are relative * to the shape, where 0 means top/left and 1 is bottom/right. * * @interface Highcharts.LinearGradientColorObject */ /** * Start horizontal position of the gradient. Float ranges 0-1. * @name Highcharts.LinearGradientColorObject#x1 * @type {number} */ /** * End horizontal position of the gradient. Float ranges 0-1. * @name Highcharts.LinearGradientColorObject#x2 * @type {number} */ /** * Start vertical position of the gradient. Float ranges 0-1. * @name Highcharts.LinearGradientColorObject#y1 * @type {number} */ /** * End vertical position of the gradient. Float ranges 0-1. * @name Highcharts.LinearGradientColorObject#y2 * @type {number} */ /** * Defines the center position and the radius for a gradient. * * @interface Highcharts.RadialGradientColorObject */ /** * Center horizontal position relative to the shape. Float ranges 0-1. * @name Highcharts.RadialGradientColorObject#cx * @type {number} */ /** * Center vertical position relative to the shape. Float ranges 0-1. * @name Highcharts.RadialGradientColorObject#cy * @type {number} */ /** * Radius relative to the shape. Float ranges 0-1. * @name Highcharts.RadialGradientColorObject#r * @type {number} */ var merge = _Globals2.default.merge; /* eslint-disable no-invalid-this, valid-jsdoc */ /** * Handle color operations. Some object methods are chainable. * * @class * @name Highcharts.Color * * @param {Highcharts.ColorType} input * The input color in either rbga or hex format */ _Globals2.default.Color = function (input) { // Backwards compatibility, allow instanciation without new if (!(this instanceof _Globals2.default.Color)) { return new _Globals2.default.Color(input); } // Initialize this.init(input); }; _Globals2.default.Color.prototype = { // Collection of parsers. This can be extended from the outside by pushing // parsers to Highcharts.Color.prototype.parsers. parsers: [{ // RGBA color // eslint-disable-next-line max-len regex: /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/, parse: function parse(result) { return [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)]; } }, { // RGB color regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/, parse: function parse(result) { return [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1]; } }], // Collection of named colors. Can be extended from the outside by adding // colors to Highcharts.Color.prototype.names. names: { white: '#ffffff', black: '#000000' }, /** * Parse the input color to rgba array * * @private * @function Highcharts.Color#init * * @param {Highcharts.ColorType} input * The input color in either rbga or hex format * * @return {void} */ init: function init(input) { var result, rgba, i, parser, len; this.input = input = this.names[input && input.toLowerCase ? input.toLowerCase() : ''] || input; // Gradients if (input && input.stops) { this.stops = input.stops.map(function (stop) { return new _Globals2.default.Color(stop[1]); }); // Solid colors } else { // Bitmasking as input[0] is not working for legacy IE. if (input && input.charAt && input.charAt() === '#') { len = input.length; input = parseInt(input.substr(1), 16); // Handle long-form, e.g. #AABBCC if (len === 7) { rgba = [(input & 0xFF0000) >> 16, (input & 0xFF00) >> 8, input & 0xFF, 1]; // Handle short-form, e.g. #ABC // In short form, the value is assumed to be the same // for both nibbles for each component. e.g. #ABC = #AABBCC } else if (len === 4) { rgba = [(input & 0xF00) >> 4 | (input & 0xF00) >> 8, (input & 0xF0) >> 4 | input & 0xF0, (input & 0xF) << 4 | input & 0xF, 1]; } } // Otherwise, check regex parsers if (!rgba) { i = this.parsers.length; while (i-- && !rgba) { parser = this.parsers[i]; result = parser.regex.exec(input); if (result) { rgba = parser.parse(result); } } } } this.rgba = rgba || []; }, /** * Return the color or gradient stops in the specified format * * @function Highcharts.Color#get * * @param {string} [format] * Possible values are 'a', 'rgb', 'rgba' (default). * * @return {Highcharts.ColorType} * This color as a string or gradient stops. */ get: function get(format) { var input = this.input, rgba = this.rgba, ret; if (this.stops) { ret = merge(input); ret.stops = [].concat(ret.stops); this.stops.forEach(function (stop, i) { ret.stops[i] = [ret.stops[i][0], stop.get(format)]; }); // it's NaN if gradient colors on a column chart } else if (rgba && isNumber(rgba[0])) { if (format === 'rgb' || !format && rgba[3] === 1) { ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')'; } else if (format === 'a') { ret = rgba[3]; } else { ret = 'rgba(' + rgba.join(',') + ')'; } } else { ret = input; } return ret; }, /** * Brighten the color instance. * * @function Highcharts.Color#brighten * * @param {number} alpha * The alpha value. * * @return {Highcharts.Color} * This color with modifications. */ brighten: function brighten(alpha) { var i, rgba = this.rgba; if (this.stops) { this.stops.forEach(function (stop) { stop.brighten(alpha); }); } else if (isNumber(alpha) && alpha !== 0) { for (i = 0; i < 3; i++) { rgba[i] += pInt(alpha * 255); if (rgba[i] < 0) { rgba[i] = 0; } if (rgba[i] > 255) { rgba[i] = 255; } } } return this; }, /** * Set the color's opacity to a given alpha value. * * @function Highcharts.Color#setOpacity * * @param {number} alpha * Opacity between 0 and 1. * * @return {Highcharts.Color} * Color with modifications. */ setOpacity: function setOpacity(alpha) { this.rgba[3] = alpha; return this; }, /** * Return an intermediate color between two colors. * * @function Highcharts.Color#tweenTo * * @param {Highcharts.Color} to * The color object to tween to. * * @param {number} pos * The intermediate position, where 0 is the from color (current * color item), and 1 is the `to` color. * * @return {Highcharts.ColorString} * The intermediate color in rgba notation. */ tweenTo: function tweenTo(to, pos) { // Check for has alpha, because rgba colors perform worse due to lack of // support in WebKit. var fromRgba = this.rgba, toRgba = to.rgba, hasAlpha, ret; // Unsupported color, return to-color (#3920, #7034) if (!toRgba.length || !fromRgba || !fromRgba.length) { ret = to.input || 'none'; // Interpolate } else { hasAlpha = toRgba[3] !== 1 || fromRgba[3] !== 1; ret = (hasAlpha ? 'rgba(' : 'rgb(') + Math.round(toRgba[0] + (fromRgba[0] - toRgba[0]) * (1 - pos)) + ',' + Math.round(toRgba[1] + (fromRgba[1] - toRgba[1]) * (1 - pos)) + ',' + Math.round(toRgba[2] + (fromRgba[2] - toRgba[2]) * (1 - pos)) + (hasAlpha ? ',' + (toRgba[3] + (fromRgba[3] - toRgba[3]) * (1 - pos)) : '') + ')'; } return ret; } }; /** * Creates a color instance out of a color string. * * @function Highcharts.color * * @param {Highcharts.ColorType} input * The input color in either rbga or hex format * * @return {Highcharts.Color} * Color instance */ _Globals2.default.color = function (input) { return new _Globals2.default.Color(input); };