UNPKG

@mapgis/webclient-es6-mapboxgl

Version:

1,104 lines (1,012 loc) 35.3 kB
import { Common } from '@mapgis/webclient-es6-service'; const { Zondy } = Common; import {Util} from './Util'; /** * @private * @class Zondy.LevelRenderer.Tool.Color * @classdesc LevelRenderer 工具-颜色辅助类 */ class Color { constructor() { /** * @member {Zondy.LevelRenderer.Tool.Util} Zondy.LevelRenderer.Tool.Color.prototype.util * @description LevelRenderer 基础工具对象。 */ this.util = new Util(); /** * @member {Object} Zondy.LevelRenderer.Tool.Color.prototype._ctx * @description _ctx。 */ this._ctx = null; /** * @member {Array} Zondy.LevelRenderer.Tool.Color.prototype.palette * @description 默认色板。色板是一个包含图表默认颜色系列的数组,当色板中所有颜色被使用过后,又将从新回到色板中的第一个颜色。 */ this.palette = [ '#ff9277', ' #dddd00', ' #ffc877', ' #bbe3ff', ' #d5ffbb', '#bbbbff', ' #ddb000', ' #b0dd00', ' #e2bbff', ' #ffbbe3', '#ff7777', ' #ff9900', ' #83dd00', ' #77e3ff', ' #778fff', '#c877ff', ' #ff77ab', ' #ff6600', ' #aa8800', ' #77c7ff', '#ad77ff', ' #ff77ff', ' #dd0083', ' #777700', ' #00aa00', '#0088aa', ' #8400dd', ' #aa0088', ' #dd0000', ' #772e00' ]; /** * @member {Array} Zondy.LevelRenderer.Tool.Color.prototype._palette * @description 复位色板,用于复位 palette */ this._palette = this.palette; /** * @member {string} Zondy.LevelRenderer.Tool.Color.prototype.highlightColor * @description 高亮色 */ this.highlightColor = 'rgba(0,0,255,1)'; /** * @member {string} Zondy.LevelRenderer.Tool.Color.prototype._highlightColor * @description 复位高亮色 */ this._highlightColor = this.highlightColor; /** * @member {string} Zondy.LevelRenderer.Tool.Color.prototype.colorRegExp * @description 颜色格式,正则表达式。 */ this.colorRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i; /** * @member {string} Zondy.LevelRenderer.Tool.Color.prototype._nameColors * @description 颜色名。 */ this._nameColors = { aliceblue: '#f0f8ff', antiquewhite: '#faebd7', aqua: '#0ff', aquamarine: '#7fffd4', azure: '#f0ffff', beige: '#f5f5dc', bisque: '#ffe4c4', black: '#000', blanchedalmond: '#ffebcd', blue: '#00f', blueviolet: '#8a2be2', brown: '#a52a2a', burlywood: '#deb887', cadetblue: '#5f9ea0', chartreuse: '#7fff00', chocolate: '#d2691e', coral: '#ff7f50', cornflowerblue: '#6495ed', cornsilk: '#fff8dc', crimson: '#dc143c', cyan: '#0ff', darkblue: '#00008b', darkcyan: '#008b8b', darkgoldenrod: '#b8860b', darkgray: '#a9a9a9', darkgrey: '#a9a9a9', darkgreen: '#006400', darkkhaki: '#bdb76b', darkmagenta: '#8b008b', darkolivegreen: '#556b2f', darkorange: '#ff8c00', darkorchid: '#9932cc', darkred: '#8b0000', darksalmon: '#e9967a', darkseagreen: '#8fbc8f', darkslateblue: '#483d8b', darkslategray: '#2f4f4f', darkslategrey: '#2f4f4f', darkturquoise: '#00ced1', darkviolet: '#9400d3', deeppink: '#ff1493', deepskyblue: '#00bfff', dimgray: '#696969', dimgrey: '#696969', dodgerblue: '#1e90ff', firebrick: '#b22222', floralwhite: '#fffaf0', forestgreen: '#228b22', fuchsia: '#f0f', gainsboro: '#dcdcdc', ghostwhite: '#f8f8ff', gold: '#ffd700', goldenrod: '#daa520', gray: '#808080', grey: '#808080', green: '#008000', greenyellow: '#adff2f', honeydew: '#f0fff0', hotpink: '#ff69b4', indianred: '#cd5c5c', indigo: '#4b0082', ivory: '#fffff0', khaki: '#f0e68c', lavender: '#e6e6fa', lavenderblush: '#fff0f5', lawngreen: '#7cfc00', lemonchiffon: '#fffacd', lightblue: '#add8e6', lightcoral: '#f08080', lightcyan: '#e0ffff', lightgoldenrodyellow: '#fafad2', lightgray: '#d3d3d3', lightgrey: '#d3d3d3', lightgreen: '#90ee90', lightpink: '#ffb6c1', lightsalmon: '#ffa07a', lightseagreen: '#20b2aa', lightskyblue: '#87cefa', lightslategray: '#789', lightslategrey: '#789', lightsteelblue: '#b0c4de', lightyellow: '#ffffe0', lime: '#0f0', limegreen: '#32cd32', linen: '#faf0e6', magenta: '#f0f', maroon: '#800000', mediumaquamarine: '#66cdaa', mediumblue: '#0000cd', mediumorchid: '#ba55d3', mediumpurple: '#9370d8', mediumseagreen: '#3cb371', mediumslateblue: '#7b68ee', mediumspringgreen: '#00fa9a', mediumturquoise: '#48d1cc', mediumvioletred: '#c71585', midnightblue: '#191970', mintcream: '#f5fffa', mistyrose: '#ffe4e1', moccasin: '#ffe4b5', navajowhite: '#ffdead', navy: '#000080', oldlace: '#fdf5e6', olive: '#808000', olivedrab: '#6b8e23', orange: '#ffa500', orangered: '#ff4500', orchid: '#da70d6', palegoldenrod: '#eee8aa', palegreen: '#98fb98', paleturquoise: '#afeeee', palevioletred: '#d87093', papayawhip: '#ffefd5', peachpuff: '#ffdab9', peru: '#cd853f', pink: '#ffc0cb', plum: '#dda0dd', powderblue: '#b0e0e6', purple: '#800080', red: '#f00', rosybrown: '#bc8f8f', royalblue: '#4169e1', saddlebrown: '#8b4513', salmon: '#fa8072', sandybrown: '#f4a460', seagreen: '#2e8b57', seashell: '#fff5ee', sienna: '#a0522d', silver: '#c0c0c0', skyblue: '#87ceeb', slateblue: '#6a5acd', slategray: '#708090', slategrey: '#708090', snow: '#fffafa', springgreen: '#00ff7f', steelblue: '#4682b4', tan: '#d2b48c', teal: '#008080', thistle: '#d8bfd8', tomato: '#ff6347', turquoise: '#40e0d0', violet: '#ee82ee', wheat: '#f5deb3', white: '#fff', whitesmoke: '#f5f5f5', yellow: '#ff0', yellowgreen: '#9acd32' }; this.CLASS_NAME = "Zondy.LevelRenderer.Tool.Color"; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.customPalette * @description 自定义调色板。 * @param {Array} userPalete - 颜色板。 */ customPalette(userPalete) { this.palette = userPalete; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.resetPalette * @description 复位默认色板。 */ resetPalette() { this.palette = this._palette; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.getColor * @description 获取色板颜色。 * @param {number} idx - 色板位置。 * @param {Array} userPalete - 色板。 * @returns {string} 颜色值。 */ getColor(idx, userPalete) { idx = idx | 0; userPalete = userPalete || this.palette; return userPalete[idx % userPalete.length]; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.customHighlight * @description 自定义默认高亮颜色。 * @param {string} userHighlightColor - 自定义高亮色。 */ customHighlight(userHighlightColor) { this.highlightColor = userHighlightColor; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.resetHighlight * @description 重置默认高亮颜色。将当前的高亮色作为默认高亮颜色 */ resetHighlight() { this.highlightColor = this._highlightColor; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.getHighlightColor * @description 获取默认高亮颜色 * @returns {string} 颜色值。 */ getHighlightColor() { return this.highlightColor; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.getRadialGradient * @description 径向渐变。 * @param {number} x0 - 渐变起点横坐标。 * @param {number} y0 - 渐变起点纵坐标。 * @param {number} r0 - 半径 * @param {number} x1 - 渐变终点横坐标。 * @param {number} y1 - 渐变终点纵坐标。 * @param {number} r1 - 半径 * @param {Array} colorList - 颜色列表。 * @returns {CanvasGradient} Cavans 渐变颜色。 */ getRadialGradient(x0, y0, r0, x1, y1, r1, colorList) { var util = this.util; if (!this._ctx) { this._ctx = util.getContext(); } var gradient = this._ctx.createRadialGradient(x0, y0, r0, x1, y1, r1); for (var i = 0, l = colorList.length; i < l; i++) { gradient.addColorStop(colorList[i][0], colorList[i][1]); } gradient.__nonRecursion = true; return gradient; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.getLinearGradient * @description 线性渐变。 * @param {number} x0 - 渐变起点横坐标。 * @param {number} y0 - 渐变起点纵坐标。 * @param {number} x1 - 渐变终点横坐标。 * @param {number} y1 - 渐变终点纵坐标。 * @param {Array} colorList - 颜色列表。 * @returns {CanvasGradient} Cavans 渐变颜色。 */ getLinearGradient(x0, y0, x1, y1, colorList) { var util = this.util; if (!this._ctx) { this._ctx = util.getContext(); } var gradient = this._ctx.createLinearGradient(x0, y0, x1, y1); for (var i = 0, l = colorList.length; i < l; i++) { gradient.addColorStop(colorList[i][0], colorList[i][1]); } gradient.__nonRecursion = true; return gradient; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.getStepColors * @description 获取两种颜色之间渐变颜色数组。 * @param {Object} start - 起始颜色对象。 * @param {Object} end - 结束颜色对象。 * @param {number} step - 渐变级数。 * @returns {Array} 颜色数组。 */ getStepColors(start, end, step) { start = this.toRGBA(start); end = this.toRGBA(end); start = this.getData(start); end = this.getData(end); var colors = []; var stepR = (end[0] - start[0]) / step; var stepG = (end[1] - start[1]) / step; var stepB = (end[2] - start[2]) / step; var stepA = (end[3] - start[3]) / step; // 生成颜色集合 // fix by linfeng 颜色堆积 for (var i = 0, r = start[0], g = start[1], b = start[2], a = start[3]; i < step; i++) { colors[i] = this.toColor([ this.adjust(Math.floor(r), [0, 255]), this.adjust(Math.floor(g), [0, 255]), this.adjust(Math.floor(b), [0, 255]), a.toFixed(4) - 0 ], 'rgba'); r += stepR; g += stepG; b += stepB; a += stepA; } r = end[0]; g = end[1]; b = end[2]; a = end[3]; colors[i] = this.toColor([r, g, b, a], 'rgba'); return colors; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.getGradientColors * @description 获取指定级数的渐变颜色数组。 * @param {Array.<string>} colors - 颜色数组。 * @param {number} [step=20] - 渐变级数。 * @returns {Array.<string>} 颜色数组。 */ getGradientColors(colors, step) { var ret = []; var len = colors.length; if (step === undefined) { step = 20; } if (len === 1) { ret = this.getStepColors(colors[0], colors[0], step); } else if (len > 1) { for (var i = 0, n = len - 1; i < n; i++) { var steps = this.getStepColors(colors[i], colors[i + 1], step); if (i < n - 1) { steps.pop(); } ret = ret.concat(steps); } } return ret; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.toColor * @description 颜色值数组转为指定格式颜色。 * @param {Array} data - 颜色值数组。 * @param {string} format - 格式,默认'rgb' * @returns {string} 颜色。 */ toColor(data, format) { format = format || 'rgb'; if (data && (data.length === 3 || data.length === 4)) { data = this.map(data, function (c) { return c > 1 ? Math.ceil(c) : c; } ); if (format.indexOf('hex') > -1) { return '#' + ((1 << 24) + (data[0] << 16) + (data[1] << 8) + (+data[2])).toString(16).slice(1); } else if (format.indexOf('hs') > -1) { var sx = this.map(data.slice(1, 3), function (c) { return c + '%'; } ); data[1] = sx[0]; data[2] = sx[1]; } if (format.indexOf('a') > -1) { if (data.length === 3) { data.push(1); } data[3] = this.adjust(data[3], [0, 1]); return format + '(' + data.slice(0, 4).join(',') + ')'; } return format + '(' + data.slice(0, 3).join(',') + ')'; } } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.toArray * @description 颜色字符串转换为rgba数组。 * @param {string} color - 颜色。 * @returns {Array.<number>} 颜色值数组。 */ toArray(color) { color = this.trim(color); if (color.indexOf('rgba') < 0) { color = this.toRGBA(color); } var data = []; var i = 0; color.replace(/[\d.]+/g, function (n) { if (i < 3) { n = n | 0; } else { // Alpha n = +n; } data[i++] = n; }); return data; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.convert * @description 颜色格式转化。 * @param {Array} data - 颜色值数组。 * @param {string} format - 格式,默认'rgb' * @returns {string} 颜色。 */ convert(color, format) { if (!this.isCalculableColor(color)) { return color; } var data = this.getData(color); var alpha = data[3]; if (typeof alpha === 'undefined') { alpha = 1; } if (color.indexOf('hsb') > -1) { data = this._HSV_2_RGB(data); } else if (color.indexOf('hsl') > -1) { data = this._HSL_2_RGB(data); } if (format.indexOf('hsb') > -1 || format.indexOf('hsv') > -1) { data = this._RGB_2_HSB(data); } else if (format.indexOf('hsl') > -1) { data = this._RGB_2_HSL(data); } data[3] = alpha; return this.toColor(data, format); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.toRGBA * @description 转换为rgba格式的颜色。 * @param {string} color - 颜色。 * @returns {string} 颜色。 */ toRGBA(color) { return this.convert(color, 'rgba'); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.toRGB * @description 转换为rgb数字格式的颜色。 * @param {string} color - 颜色。 * @returns {string} 颜色。 */ toRGB(color) { return this.convert(color, 'rgb'); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.toHex * @description 转换为16进制颜色。 * @param {string} color - 颜色。 * @returns {string} 16进制颜色,#rrggbb格式 */ toHex(color) { return this.convert(color, 'hex'); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.toHSVA * @description 转换为HSV颜色。 * @param {string} color - 颜色。 * @returns {string} HSVA颜色,hsva(h,s,v,a) */ toHSVA(color) { return this.convert(color, 'hsva'); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.toHSV * @description 转换为HSV颜色。 * @param {string} color - 颜色。 * @returns {string} HSV颜色,hsv(h,s,v) */ toHSV(color) { return this.convert(color, 'hsv'); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.toHSBA * @description 转换为HSBA颜色。 * @param {string} color - 颜色。 * @returns {string} HSBA颜色,hsba(h,s,b,a) */ toHSBA(color) { return this.convert(color, 'hsba'); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.toHSB * @description 转换为HSB颜色。 * @param {string} color - 颜色。 * @returns {string} HSB颜色,hsb(h,s,b) */ toHSB(color) { return this.convert(color, 'hsb'); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.toHSLA * @description 转换为HSLA颜色。 * @param {string} color - 颜色。 * @returns {string} HSLA颜色,hsla(h,s,l,a) */ toHSLA(color) { return this.convert(color, 'hsla'); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.toHSL * @description 转换为HSL颜色。 * @param {string} color - 颜色。 * @returns {string} HSL颜色,hsl(h,s,l) */ toHSL(color) { return this.convert(color, 'hsl'); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.toName * @description 转换颜色名。 * @param {string} color - 颜色。 * @returns {string} 颜色名 */ toName(color) { for (var key in this._nameColors) { if (this.toHex(this._nameColors[key]) === this.toHex(color)) { return key; } } return null; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.trim * @description 移除颜色中多余空格。 * @param {string} color - 颜色。 * @returns {string} 无空格颜色 */ trim(color) { return String(color).replace(/\s+/g, ''); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.normalize * @description 颜色规范化。 * @param {string} color - 颜色。 * @returns {string} 规范化后的颜色 */ normalize(color) { // 颜色名 if (this._nameColors[color]) { color = this._nameColors[color]; } // 去掉空格 color = this.trim(color); // hsv与hsb等价 color = color.replace(/hsv/i, 'hsb'); // rgb转为rrggbb if (/^#[\da-f]{3}$/i.test(color)) { color = parseInt(color.slice(1), 16); var r = (color & 0xf00) << 8; var g = (color & 0xf0) << 4; var b = color & 0xf; color = '#' + ((1 << 24) + (r << 4) + r + (g << 4) + g + (b << 4) + b).toString(16).slice(1); } // 或者使用以下正则替换,不过 chrome 下性能相对差点 // color = color.replace(/^#([\da-f])([\da-f])([\da-f])$/i, '#$1$1$2$2$3$3'); return color; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.lift * @description 颜色加深或减淡,当level>0加深,当level<0减淡。 * @param {string} color - 颜色。 * @param {number} level - 升降程度,取值区间[-1,1]。 * @returns {string} 加深或减淡后颜色值 */ lift(color, level) { if (!this.isCalculableColor(color)) { return color; } var direct = level > 0 ? 1 : -1; if (typeof level === 'undefined') { level = 0; } level = Math.abs(level) > 1 ? 1 : Math.abs(level); color = this.toRGB(color); var data = this.getData(color); for (var i = 0; i < 3; i++) { if (direct === 1) { data[i] = data[i] * (1 - level) | 0; } else { data[i] = ((255 - data[i]) * level + data[i]) | 0; } } return 'rgb(' + data.join(',') + ')'; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.reverse * @description 颜色翻转。[255-r,255-g,255-b,1-a] * @param {string} color - 颜色。 * @returns {string} 翻转颜色 */ reverse(color) { if (!this.isCalculableColor(color)) { return color; } var data = this.getData(this.toRGBA(color)); data = this.map(data, function (c) { return 255 - c; } ); return this.toColor(data, 'rgb'); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.mix * @description 简单两种颜色混合 * @param {string} color1 - 第一种颜色。 * @param {string} color2 - 第二种颜色。 * @param {number} weight - 混合权重[0-1]。 * @returns {string} 结果色。rgb(r,g,b)或rgba(r,g,b,a) */ mix(color1, color2, weight) { if (!this.isCalculableColor(color1) || !this.isCalculableColor(color2)) { return color1; } if (typeof weight === 'undefined') { weight = 0.5; } weight = 1 - this.adjust(weight, [0, 1]); var w = weight * 2 - 1; var data1 = this.getData(this.toRGBA(color1)); var data2 = this.getData(this.toRGBA(color2)); var d = data1[3] - data2[3]; var weight1 = (((w * d === -1) ? w : (w + d) / (1 + w * d)) + 1) / 2; var weight2 = 1 - weight1; var data = []; for (var i = 0; i < 3; i++) { data[i] = data1[i] * weight1 + data2[i] * weight2; } var alpha = data1[3] * weight + data2[3] * (1 - weight); alpha = Math.max(0, Math.min(1, alpha)); if (data1[3] === 1 && data2[3] === 1) {// 不考虑透明度 return this.toColor(data, 'rgb'); } data[3] = alpha; return this.toColor(data, 'rgba'); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.random * @description 随机颜色 * @returns {string} 颜色值,#rrggbb格式 */ random() { return '#' + Math.random().toString(16).slice(2, 8); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.getData * @description 获取颜色值数组,返回值范围。 * RGB 范围[0-255] * HSL/HSV/HSB 范围[0-1] * A透明度范围[0-1] * 支持格式: * #rgb * #rrggbb * rgb(r,g,b) * rgb(r%,g%,b%) * rgba(r,g,b,a) * hsb(h,s,b) // hsv与hsb等价 * hsb(h%,s%,b%) * hsba(h,s,b,a) * hsl(h,s,l) * hsl(h%,s%,l%) * hsla(h,s,l,a) * @param {string} color - 颜色。 * @returns {Array.<number>} 颜色值数组或null */ getData(color) { color = this.normalize(color); var r = color.match(this.colorRegExp); if (r === null) { throw new Error('The color format error'); // 颜色格式错误 } var d; var a; var data = []; var rgb; if (r[2]) { // #rrggbb d = r[2].replace('#', '').split(''); rgb = [d[0] + d[1], d[2] + d[3], d[4] + d[5]]; data = this.map(rgb, function (c) { return Color.prototype.adjust.call(this, parseInt(c, 16), [0, 255]); } ); } else if (r[4]) { // rgb rgba var rgba = (r[4]).split(','); a = rgba[3]; rgb = rgba.slice(0, 3); data = this.map( rgb, function (c) { c = Math.floor( c.indexOf('%') > 0 ? parseInt(c, 0) * 2.55 : c ); return Color.prototype.adjust.call(this, c, [0, 255]); } ); if (typeof a !== 'undefined') { data.push(this.adjust(parseFloat(a), [0, 1])); } } else if (r[5] || r[6]) { // hsb hsba hsl hsla var hsxa = (r[5] || r[6]).split(','); var h = parseInt(hsxa[0], 0) / 360; var s = hsxa[1]; var x = hsxa[2]; a = hsxa[3]; data = this.map([s, x], function (c) { return Color.prototype.adjust.call(this, parseFloat(c) / 100, [0, 1]); } ); data.unshift(h); if (typeof a !== 'undefined') { data.push(this.adjust(parseFloat(a), [0, 1])); } } return data; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.alpha * @description 设置颜色透明度 * @param {string} color - 颜色。 * @param {number} a - 透明度,区间[0,1]。 * @returns {string} rgba颜色值 */ alpha(color, a) { if (!this.isCalculableColor(color)) { return color; } if (a === null) { a = 1; } var data = this.getData(this.toRGBA(color)); data[3] = this.adjust(Number(a).toFixed(4), [0, 1]); return this.toColor(data, 'rgba'); } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.map * @description 数组映射 * @param {Array} array - 数组。 * @param {function} fun - 函数。 * @returns {string} 数组映射结果 */ map(array, fun) { if (typeof fun !== 'function') { throw new TypeError(); } var len = array ? array.length : 0; for (var i = 0; i < len; i++) { array[i] = fun(array[i]); } return array; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.adjust * @description 调整值区间 * @param {Array.<number>} value - 数组。 * @param {Array.<number>} region - 区间。 * @returns {number} 调整后的值 */ adjust(value, region) { // < to <= & > to >= // modify by linzhifeng 2014-05-25 because -0 == 0 if (value <= region[0]) { value = region[0]; } else if (value >= region[1]) { value = region[1]; } return value; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype.isCalculableColor * @description 判断是否是可计算的颜色 * @param {string} color - 颜色。 * @returns {boolean} 是否是可计算的颜色 */ isCalculableColor(color) { return color instanceof Array || typeof color === 'string'; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype._HSV_2_RGB。参见{@link http://www.easyrgb.com/index.php?X=MATH} */ _HSV_2_RGB(data) { var H = data[0]; var S = data[1]; var V = data[2]; // HSV from 0 to 1 var R; var G; var B; if (S === 0) { R = V * 255; G = V * 255; B = V * 255; } else { var h = H * 6; if (h === 6) { h = 0; } var i = h | 0; var v1 = V * (1 - S); var v2 = V * (1 - S * (h - i)); var v3 = V * (1 - S * (1 - (h - i))); var r = 0; var g = 0; var b = 0; if (i === 0) { r = V; g = v3; b = v1; } else if (i === 1) { r = v2; g = V; b = v1; } else if (i === 2) { r = v1; g = V; b = v3; } else if (i === 3) { r = v1; g = v2; b = V; } else if (i === 4) { r = v3; g = v1; b = V; } else { r = V; g = v1; b = v2; } // RGB results from 0 to 255 R = r * 255; G = g * 255; B = b * 255; } return [R, G, B]; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype._HSL_2_RGB。参见{@link http://www.easyrgb.com/index.php?X=MATH} */ _HSL_2_RGB(data) { var H = data[0]; var S = data[1]; var L = data[2]; // HSL from 0 to 1 var R; var G; var B; if (S === 0) { R = L * 255; G = L * 255; B = L * 255; } else { var v2; if (L < 0.5) { v2 = L * (1 + S); } else { v2 = (L + S) - (S * L); } var v1 = 2 * L - v2; R = 255 * this._HUE_2_RGB(v1, v2, H + (1 / 3)); G = 255 * this._HUE_2_RGB(v1, v2, H); B = 255 * this._HUE_2_RGB(v1, v2, H - (1 / 3)); } return [R, G, B]; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype._HUE_2_RGB。参见{@link http://www.easyrgb.com/index.php?X=MATH} */ _HUE_2_RGB(v1, v2, vH) { if (vH < 0) { vH += 1; } if (vH > 1) { vH -= 1; } if ((6 * vH) < 1) { return (v1 + (v2 - v1) * 6 * vH); } if ((2 * vH) < 1) { return (v2); } if ((3 * vH) < 2) { return (v1 + (v2 - v1) * ((2 / 3) - vH) * 6); } return v1; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype._RGB_2_HSB。参见{@link http://www.easyrgb.com/index.php?X=MATH} */ _RGB_2_HSB(data) { // RGB from 0 to 255 var R = (data[0] / 255); var G = (data[1] / 255); var B = (data[2] / 255); var vMin = Math.min(R, G, B); // Min. value of RGB var vMax = Math.max(R, G, B); // Max. value of RGB var delta = vMax - vMin; // Delta RGB value var V = vMax; var H; var S; // HSV results from 0 to 1 if (delta === 0) { H = 0; S = 0; } else { S = delta / vMax; var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta; var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta; var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta; if (R === vMax) { H = deltaB - deltaG; } else if (G === vMax) { H = (1 / 3) + deltaR - deltaB; } else if (B === vMax) { H = (2 / 3) + deltaG - deltaR; } if (H < 0) { H += 1; } if (H > 1) { H -= 1; } } H = H * 360; S = S * 100; V = V * 100; return [H, S, V]; } /** * @function Zondy.LevelRenderer.Tool.Color.prototype._RGB_2_HSL。参见{@link http://www.easyrgb.com/index.php?X=MATH} */ _RGB_2_HSL(data) { // RGB from 0 to 255 var R = (data[0] / 255); var G = (data[1] / 255); var B = (data[2] / 255); var vMin = Math.min(R, G, B); // Min. value of RGB var vMax = Math.max(R, G, B); // Max. value of RGB var delta = vMax - vMin; // Delta RGB value var L = (vMax + vMin) / 2; var H; var S; // HSL results from 0 to 1 if (delta === 0) { H = 0; S = 0; } else { if (L < 0.5) { S = delta / (vMax + vMin); } else { S = delta / (2 - vMax - vMin); } var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta; var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta; var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta; if (R === vMax) { H = deltaB - deltaG; } else if (G === vMax) { H = (1 / 3) + deltaR - deltaB; } else if (B === vMax) { H = (2 / 3) + deltaG - deltaR; } if (H < 0) { H += 1; } if (H > 1) { H -= 1; } } H = H * 360; S = S * 100; L = L * 100; return [H, S, L]; } } export {Color}; Zondy.LevelRenderer.Tool.Color = Color;