define('echarts/chart/wordCloud', [ 'require', './base', 'zrender/shape/Text', '../layout/WordCloud', '../component/grid', '../component/dataRange', '../config', '../util/ecData', 'zrender/tool/util', 'zrender/tool/color', '../chart' ], function (require) { var ChartBase = require('./base'); var TextShape = require('zrender/shape/Text'); var CloudLayout = require('../layout/WordCloud'); require('../component/grid'); require('../component/dataRange'); var ecConfig = require('../config'); var ecData = require('../util/ecData'); var zrUtil = require('zrender/tool/util'); var zrColor = require('zrender/tool/color'); ecConfig.wordCloud = { zlevel: 0, z: 2, clickable: true, center: [ '50%', '50%' ], size: [ '40%', '40%' ], textRotation: [ 0, 90 ], textPadding: 0, autoSize: { enable: true, minSize: 12 }, itemStyle: { normal: { textStyle: { fontSize: function (data) { return data.value; } } } } }; function Cloud(ecTheme, messageCenter, zr, option, myChart) { ChartBase.call(this, ecTheme, messageCenter, zr, option, myChart); this.refresh(option); } Cloud.prototype = { type: ecConfig.CHART_TYPE_WORDCLOUD, refresh: function (newOption) { if (newOption) { this.option = newOption; this.series = newOption.series; } this._init(); }, _init: function () { var series = this.series; this.backupShapeList(); var legend = this.component.legend; for (var i = 0; i < series.length; i++) { if (series[i].type === ecConfig.CHART_TYPE_WORDCLOUD) { series[i] = this.reformOption(series[i]); var serieName = series[i].name || ''; this.selectedMap[serieName] = legend ? legend.isSelected(serieName) : true; if (!this.selectedMap[serieName]) { continue; } this.buildMark(i); this._initSerie(series[i]); } } }, _initSerie: function (serie) { var textStyle = serie.itemStyle.normal.textStyle; var size = [ this.parsePercent(serie.size[0], this.zr.getWidth()) || 200, this.parsePercent(serie.size[1], this.zr.getHeight()) || 200 ]; var center = this.parseCenter(this.zr, serie.center); var layoutConfig = { size: size, wordletype: { autoSizeCal: serie.autoSize }, center: center, rotate: serie.textRotation, padding: serie.textPadding, font: textStyle.fontFamily, fontSize: textStyle.fontSize, fontWeight: textStyle.fontWeight, fontStyle: textStyle.fontStyle, text: function (d) { return d.name; }, data: serie.data }; var clouds = new CloudLayout(layoutConfig); var self = this; clouds.end(function (d) { self._buildShapes(d); }); clouds.start(); }, _buildShapes: function (data) { var len = data.length; for (var i = 0; i < len; i++) { this._buildTextShape(data[i], 0, i); } this.addShapeList(); }, _buildTextShape: function (oneText, seriesIndex, dataIndex) { var series = this.series; var serie = series[seriesIndex]; var serieName = serie.name || ''; var data = serie.data[dataIndex]; var queryTarget = [ data, serie ]; var legend = this.component.legend; var defaultColor = legend ? legend.getColor(serieName) : this.zr.getColor(seriesIndex); var normal = this.deepMerge(queryTarget, 'itemStyle.normal') || {}; var emphasis = this.deepMerge(queryTarget, 'itemStyle.emphasis') || {}; var normalColor = this.getItemStyleColor(normal.color, seriesIndex, dataIndex, data) || defaultColor; var emphasisColor = this.getItemStyleColor(emphasis.color, seriesIndex, dataIndex, data) || (typeof normalColor === 'string' ? zrColor.lift(normalColor, -0.2) : normalColor); var textShape = new TextShape({ zlevel: serie.zlevel, z: serie.z, hoverable: true, clickable: this.deepQuery(queryTarget, 'clickable'), style: { x: 0, y: 0, text: oneText.text, color: normalColor, textFont: [ oneText.style, oneText.weight, oneText.size + 'px', oneText.font ].join(' '), textBaseline: 'alphabetic', textAlign: 'center' }, highlightStyle: { brushType: emphasis.borderWidth ? 'both' : 'fill', color: emphasisColor, lineWidth: emphasis.borderWidth || 0, strokeColor: emphasis.borderColor }, position: [ oneText.x, oneText.y ], rotation: [ -oneText.rotate / 180 * Math.PI, 0, 0 ] }); ecData.pack(textShape, serie, seriesIndex, data, dataIndex, data.name); this.shapeList.push(textShape); } }; zrUtil.inherits(Cloud, ChartBase); require('../chart').define('wordCloud', Cloud); return Cloud; });define('echarts/layout/WordCloud', [ 'require', '../layout/WordCloudRectZero', 'zrender/tool/util' ], function (require) { var ZeroArray = require('../layout/WordCloudRectZero'); var zrUtil = require('zrender/tool/util'); function CloudLayout(option) { this._init(option); } CloudLayout.prototype = { start: function () { var board = null; var maxWit = 0; var maxHit = 0; var maxArea = 0; var i = -1; var tags = []; var maxBounds = null; var data = this.wordsdata; var dfop = this.defaultOption; var wordletype = dfop.wordletype; var size = dfop.size; var that = this; var zeroArrayObj = new ZeroArray({ type: wordletype.type, width: size[0], height: size[1] }); zeroArrayObj.calculate(function (options) { board = options.initarr; maxWit = options.maxWit; maxHit = options.maxHit; maxArea = options.area; maxBounds = options.imgboard; startStep(); }, this); return this; function startStep() { that.totalArea = maxArea; if (wordletype.autoSizeCal.enable) { that._autoCalTextSize(data, maxArea, maxWit, maxHit, wordletype.autoSizeCal.minSize); } if (dfop.timer) { clearInterval(dfop.timer); } dfop.timer = setInterval(step, 0); step(); } function step() { var start = +new Date(); var n = data.length; var d; while (+new Date() - start < dfop.timeInterval && ++i < n && dfop.timer) { d = data[i]; d.x = size[0] >> 1; d.y = size[1] >> 1; that._cloudSprite(d, data, i); if (d.hasText && that._place(board, d, maxBounds)) { tags.push(d); d.x -= size[0] >> 1; d.y -= size[1] >> 1; } } if (i >= n) { that.stop(); that._fixTagPosition(tags); dfop.endcallback(tags); } } }, _fixTagPosition: function (tags) { var center = this.defaultOption.center; for (var i = 0, len = tags.length; i < len; i++) { tags[i].x += center[0]; tags[i].y += center[1]; } }, stop: function () { if (this.defaultOption.timer) { clearInterval(this.defaultOption.timer); this.defaultOption.timer = null; } return this; }, end: function (v) { if (v) { this.defaultOption.endcallback = v; } return this; }, _init: function (option) { this.defaultOption = {}; this._initProperty(option); this._initMethod(option); this._initCanvas(); this._initData(option.data); }, _initData: function (datas) { var that = this; var thatop = that.defaultOption; this.wordsdata = datas.map(function (d, i) { d.text = thatop.text.call(that, d, i); d.font = thatop.font.call(that, d, i); d.style = thatop.fontStyle.call(that, d, i); d.weight = thatop.fontWeight.call(that, d, i); d.rotate = thatop.rotate.call(that, d, i); d.size = ~~thatop.fontSize.call(that, d, i); d.padding = thatop.padding.call(that, d, i); return d; }).sort(function (a, b) { return b.value - a.value; }); }, _initMethod: function (option) { var dfop = this.defaultOption; dfop.text = option.text ? functor(option.text) : cloudText; dfop.font = option.font ? functor(option.font) : cloudFont; dfop.fontSize = option.fontSize ? functor(option.fontSize) : cloudFontSize; dfop.fontStyle = option.fontStyle ? functor(option.fontStyle) : cloudFontNormal; dfop.fontWeight = option.fontWeight ? functor(option.fontWeight) : cloudFontNormal; dfop.rotate = option.rotate ? newCloudRotate(option.rotate) : cloudRotate; dfop.padding = option.padding ? functor(option.padding) : cloudPadding; dfop.center = option.center; dfop.spiral = archimedeanSpiral; dfop.endcallback = function () { }; dfop.rectangularSpiral = rectangularSpiral; dfop.archimedeanSpiral = archimedeanSpiral; function cloudText(d) { return d.name; } function cloudFont() { return 'sans-serif'; } function cloudFontNormal() { return 'normal'; } function cloudFontSize(d) { return d.value; } function cloudRotate() { return 0; } function newCloudRotate(rotate) { return function () { return rotate[Math.round(Math.random() * (rotate.length - 1))]; }; } function cloudPadding() { return 0; } function archimedeanSpiral(size) { var e = size[0] / size[1]; return function (t) { return [ e * (t *= 0.1) * Math.cos(t), t * Math.sin(t) ]; }; } function rectangularSpiral(size) { var dy = 4; var dx = dy * size[0] / size[1]; var x = 0; var y = 0; return function (t) { var sign = t < 0 ? -1 : 1; switch (Math.sqrt(1 + 4 * sign * t) - sign & 3) { case 0: x += dx; break; case 1: y += dy; break; case 2: x -= dx; break; default: y -= dy; break; } return [ x, y ]; }; } function functor(v) { return typeof v === 'function' ? v : function () { return v; }; } }, _initProperty: function (option) { var dfop = this.defaultOption; dfop.size = option.size || [ 256, 256 ]; dfop.wordletype = option.wordletype; dfop.words = option.words || []; dfop.timeInterval = Infinity; dfop.timer = null; dfop.spirals = { archimedean: dfop.archimedeanSpiral, rectangular: dfop.rectangularSpiral }; zrUtil.merge(dfop, { size: [ 256, 256 ], wordletype: { type: 'RECT', areaPresent: 0.058, autoSizeCal: { enable: true, minSize: 12 } } }); }, _initCanvas: function () { var cloudRadians = Math.PI / 180; var cw = 1 << 11 >> 5; var ch = 1 << 11; var canvas; var ratio = 1; if (typeof document !== 'undefined') { canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; ratio = Math.sqrt(canvas.getContext('2d').getImageData(0, 0, 1, 1).data.length >> 2); canvas.width = (cw << 5) / ratio; canvas.height = ch / ratio; } else { canvas = new Canvas(cw << 5, ch); } var c = canvas.getContext('2d'); c.fillStyle = c.strokeStyle = 'red'; c.textAlign = 'center'; this.defaultOption.c = c; this.defaultOption.cw = cw; this.defaultOption.ch = ch; this.defaultOption.ratio = ratio; this.defaultOption.cloudRadians = cloudRadians; }, _cloudSprite: function (d, data, di) { if (d.sprite) { return; } var cw = this.defaultOption.cw; var ch = this.defaultOption.ch; var c = this.defaultOption.c; var ratio = this.defaultOption.ratio; var cloudRadians = this.defaultOption.cloudRadians; c.clearRect(0, 0, (cw << 5) / ratio, ch / ratio); var x = 0; var y = 0; var maxh = 0; var n = data.length; --di; while (++di < n) { d = data[di]; c.save(); c.font = d.style + ' ' + d.weight + ' ' + ~~((d.size + 1) / ratio) + 'px ' + d.font; var w = c.measureText(d.text + 'm').width * ratio; var h = d.size << 1; if (d.rotate) { var sr = Math.sin(d.rotate * cloudRadians); var cr = Math.cos(d.rotate * cloudRadians); var wcr = w * cr; var wsr = w * sr; var hcr = h * cr; var hsr = h * sr; w = Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 31 >> 5 << 5; h = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr)); } else { w = w + 31 >> 5 << 5; } if (h > maxh) { maxh = h; } if (x + w >= cw << 5) { x = 0; y += maxh; maxh = 0; } if (y + h >= ch) { break; } c.translate((x + (w >> 1)) / ratio, (y + (h >> 1)) / ratio); if (d.rotate) { c.rotate(d.rotate * cloudRadians); } c.fillText(d.text, 0, 0); if (d.padding) { c.lineWidth = 2 * d.padding; c.strokeText(d.text, 0, 0); } c.restore(); d.width = w; d.height = h; d.xoff = x; d.yoff = y; d.x1 = w >> 1; d.y1 = h >> 1; d.x0 = -d.x1; d.y0 = -d.y1; d.hasText = true; x += w; } var pixels = c.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data; var sprite = []; while (--di >= 0) { d = data[di]; if (!d.hasText) { continue; } var w = d.width; var w32 = w >> 5; var h = d.y1 - d.y0; for (var i = 0; i < h * w32; i++) { sprite[i] = 0; } x = d.xoff; if (x == null) { return; } y = d.yoff; var seen = 0; var seenRow = -1; for (var j = 0; j < h; j++) { for (var i = 0; i < w; i++) { var k = w32 * j + (i >> 5); var m = pixels[(y + j) * (cw << 5) + (x + i) << 2] ? 1 << 31 - i % 32 : 0; sprite[k] |= m; seen |= m; } if (seen) { seenRow = j; } else { d.y0++; h--; j--; y++; } } d.y1 = d.y0 + seenRow; d.sprite = sprite.slice(0, (d.y1 - d.y0) * w32); } }, _place: function (board, tag, maxBounds) { var size = this.defaultOption.size; var perimeter = [ { x: 0, y: 0 }, { x: size[0], y: size[1] } ]; var startX = tag.x; var startY = tag.y; var maxDelta = Math.sqrt(size[0] * size[0] + size[1] * size[1]); var s = this.defaultOption.spiral(size); var dt = Math.random() < 0.5 ? 1 : -1; var t = -dt; var dxdy; var dx; var dy; while (dxdy = s(t += dt)) { dx = ~~dxdy[0]; dy = ~~dxdy[1]; if (Math.min(dx, dy) > maxDelta) { break; } tag.x = startX + dx; tag.y = startY + dy; if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 || tag.x + tag.x1 > size[0] || tag.y + tag.y1 > size[1]) { continue; } if (!cloudCollide(tag, board, size[0])) { if (collideRects(tag, maxBounds)) { var sprite = tag.sprite; var w = tag.width >> 5; var sw = size[0] >> 5; var lx = tag.x - (w << 4); var sx = lx & 127; var msx = 32 - sx; var h = tag.y1 - tag.y0; var x = (tag.y + tag.y0) * sw + (lx >> 5); var last; for (var j = 0; j < h; j++) { last = 0; for (var i = 0; i <= w; i++) { board[x + i] |= last << msx | (i < w ? (last = sprite[j * w + i]) >>> sx : 0); } x += sw; } delete tag.sprite; return true; } } } return false; function cloudCollide(tag, board, sw) { sw >>= 5; var sprite = tag.sprite; var w = tag.width >> 5; var lx = tag.x - (w << 4); var sx = lx & 127; var msx = 32 - sx; var h = tag.y1 - tag.y0; var x = (tag.y + tag.y0) * sw + (lx >> 5); var last; for (var j = 0; j < h; j++) { last = 0; for (var i = 0; i <= w; i++) { if ((last << msx | (i < w ? (last = sprite[j * w + i]) >>> sx : 0)) & board[x + i]) { return true; } } x += sw; } return false; } function collideRects(a, maxBounds) { return maxBounds.row[a.y] && maxBounds.cloumn[a.x] && a.x >= maxBounds.row[a.y].start && a.x <= maxBounds.row[a.y].end && a.y >= maxBounds.cloumn[a.x].start && a.y <= maxBounds.cloumn[a.x].end; } }, _autoCalTextSize: function (data, shapeArea, maxwidth, maxheight, minSize) { var sizesum = sum(data, function (k) { return k.size; }); var i = data.length; var maxareapre = 0.25; var minTextSize = minSize; var cw = this.defaultOption.cw; var ch = this.defaultOption.ch; var c = this.defaultOption.c; var ratio = this.defaultOption.ratio; var cloudRadians = this.defaultOption.cloudRadians; var d; var dpre; while (i--) { d = data[i]; dpre = d.size / sizesum; if (maxareapre) { d.areapre = dpre < maxareapre ? dpre : maxareapre; } else { d.areapre = dpre; } d.area = shapeArea * d.areapre; d.totalarea = shapeArea; measureTextWitHitByarea(d); } function measureTextWitHitByarea(d) { c.clearRect(0, 0, (cw << 5) / ratio, ch / ratio); c.save(); c.font = d.style + ' ' + d.weight + ' ' + ~~((d.size + 1) / ratio) + 'px ' + d.font; var w = c.measureText(d.text + 'm').width * ratio, h = d.size << 1; w = w + 31 >> 5 << 5; c.restore(); d.aw = w; d.ah = h; var k, rw, rh; if (d.rotate) { var sr = Math.sin(d.rotate * cloudRadians); var cr = Math.cos(d.rotate * cloudRadians); var wcr = w * cr; var wsr = w * sr; var hcr = h * cr; var hsr = h * sr; rw = Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 31 >> 5 << 5; rh = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr)); } if (d.size <= minTextSize || d.rotate && w * h <= d.area && rw <= maxwidth && rh <= maxheight || w * h <= d.area && w <= maxwidth && h <= maxheight) { d.area = w * h; return; } if (d.rotate && rw > maxwidth && rh > maxheight) { k = Math.min(maxwidth / rw, maxheight / rh); } else if (w > maxwidth || h > maxheight) { k = Math.min(maxwidth / w, maxheight / h); } else { k = Math.sqrt(d.area / (d.aw * d.ah)); } d.size = ~~(k * d.size); if (d.size < minSize) { d.size = minSize; return; } return measureTextWitHitByarea(d); } function sum(dts, callback) { var j = dts.length; var ressum = 0; while (j--) { ressum += callback(dts[j]); } return ressum; } } }; return CloudLayout; });define('echarts/component/dataRange', [ 'require', './base', 'zrender/shape/Text', 'zrender/shape/Rectangle', '../util/shape/HandlePolygon', '../config', 'zrender/tool/util', 'zrender/tool/event', 'zrender/tool/area', 'zrender/tool/color', '../component' ], function (require) { var Base = require('./base'); var TextShape = require('zrender/shape/Text'); var RectangleShape = require('zrender/shape/Rectangle'); var HandlePolygonShape = require('../util/shape/HandlePolygon'); var ecConfig = require('../config'); ecConfig.dataRange = { zlevel: 0, z: 4, show: true, orient: 'vertical', x: 'left', y: 'bottom', backgroundColor: 'rgba(0,0,0,0)', borderColor: '#ccc', borderWidth: 0, padding: 5, itemGap: 10, itemWidth: 20, itemHeight: 14, precision: 0, splitNumber: 5, splitList: null, calculable: false, selectedMode: true, hoverLink: true, realtime: true, color: [ '#006edd', '#e0ffff' ], textStyle: { color: '#333' } }; var zrUtil = require('zrender/tool/util'); var zrEvent = require('zrender/tool/event'); var zrArea = require('zrender/tool/area'); var zrColor = require('zrender/tool/color'); function DataRange(ecTheme, messageCenter, zr, option, myChart) { Base.call(this, ecTheme, messageCenter, zr, option, myChart); var self = this; self._ondrift = function (dx, dy) { return self.__ondrift(this, dx, dy); }; self._ondragend = function () { return self.__ondragend(); }; self._dataRangeSelected = function (param) { return self.__dataRangeSelected(param); }; self._dispatchHoverLink = function (param) { return self.__dispatchHoverLink(param); }; self._onhoverlink = function (params) { return self.__onhoverlink(params); }; this._selectedMap = {}; this._range = {}; this.refresh(option); messageCenter.bind(ecConfig.EVENT.HOVER, this._onhoverlink); } DataRange.prototype = { type: ecConfig.COMPONENT_TYPE_DATARANGE, _textGap: 10, _buildShape: function () { this._itemGroupLocation = this._getItemGroupLocation(); this._buildBackground(); if (this._isContinuity()) { this._buildGradient(); } else { this._buildItem(); } if (this.dataRangeOption.show) { for (var i = 0, l = this.shapeList.length; i < l; i++) { this.zr.addShape(this.shapeList[i]); } } this._syncShapeFromRange(); }, _buildItem: function () { var data = this._valueTextList; var dataLength = data.length; var itemName; var itemShape; var textShape; var font = this.getFont(this.dataRangeOption.textStyle); var lastX = this._itemGroupLocation.x; var lastY = this._itemGroupLocation.y; var itemWidth = this.dataRangeOption.itemWidth; var itemHeight = this.dataRangeOption.itemHeight; var itemGap = this.dataRangeOption.itemGap; var textHeight = zrArea.getTextHeight('国', font); var color; if (this.dataRangeOption.orient == 'vertical' && this.dataRangeOption.x == 'right') { lastX = this._itemGroupLocation.x + this._itemGroupLocation.width - itemWidth; } var needValueText = true; if (this.dataRangeOption.text) { needValueText = false; if (this.dataRangeOption.text[0]) { textShape = this._getTextShape(lastX, lastY, this.dataRangeOption.text[0]); if (this.dataRangeOption.orient == 'horizontal') { lastX += zrArea.getTextWidth(this.dataRangeOption.text[0], font) + this._textGap; } else { lastY += textHeight + this._textGap; textShape.style.y += textHeight / 2 + this._textGap; textShape.style.textBaseline = 'bottom'; } this.shapeList.push(new TextShape(textShape)); } } for (var i = 0; i < dataLength; i++) { itemName = data[i]; color = this.getColorByIndex(i); itemShape = this._getItemShape(lastX, lastY, itemWidth, itemHeight, this._selectedMap[i] ? color : '#ccc'); itemShape._idx = i; itemShape.onmousemove = this._dispatchHoverLink; if (this.dataRangeOption.selectedMode) { itemShape.clickable = true; itemShape.onclick = this._dataRangeSelected; } this.shapeList.push(new RectangleShape(itemShape)); if (needValueText) { textShape = { zlevel: this.getZlevelBase(), z: this.getZBase(), style: { x: lastX + itemWidth + 5, y: lastY, color: this._selectedMap[i] ? this.dataRangeOption.textStyle.color : '#ccc', text: data[i], textFont: font, textBaseline: 'top' }, highlightStyle: { brushType: 'fill' } }; if (this.dataRangeOption.orient == 'vertical' && this.dataRangeOption.x == 'right') { textShape.style.x -= itemWidth + 10; textShape.style.textAlign = 'right'; } textShape._idx = i; textShape.onmousemove = this._dispatchHoverLink; if (this.dataRangeOption.selectedMode) { textShape.clickable = true; textShape.onclick = this._dataRangeSelected; } this.shapeList.push(new TextShape(textShape)); } if (this.dataRangeOption.orient == 'horizontal') { lastX += itemWidth + (needValueText ? 5 : 0) + (needValueText ? zrArea.getTextWidth(itemName, font) : 0) + itemGap; } else { lastY += itemHeight + itemGap; } } if (!needValueText && this.dataRangeOption.text[1]) { if (this.dataRangeOption.orient == 'horizontal') { lastX = lastX - itemGap + this._textGap; } else { lastY = lastY - itemGap + this._textGap; } textShape = this._getTextShape(lastX, lastY, this.dataRangeOption.text[1]); if (this.dataRangeOption.orient != 'horizontal') { textShape.style.y -= 5; textShape.style.textBaseline = 'top'; } this.shapeList.push(new TextShape(textShape)); } }, _buildGradient: function () { var itemShape; var textShape; var font = this.getFont(this.dataRangeOption.textStyle); var lastX = this._itemGroupLocation.x; var lastY = this._itemGroupLocation.y; var itemWidth = this.dataRangeOption.itemWidth; var itemHeight = this.dataRangeOption.itemHeight; var textHeight = zrArea.getTextHeight('国', font); var mSize = 10; var needValueText = true; if (this.dataRangeOption.text) { needValueText = false; if (this.dataRangeOption.text[0]) { textShape = this._getTextShape(lastX, lastY, this.dataRangeOption.text[0]); if (this.dataRangeOption.orient == 'horizontal') { lastX += zrArea.getTextWidth(this.dataRangeOption.text[0], font) + this._textGap; } else { lastY += textHeight + this._textGap; textShape.style.y += textHeight / 2 + this._textGap; textShape.style.textBaseline = 'bottom'; } this.shapeList.push(new TextShape(textShape)); } } var zrColor = require('zrender/tool/color'); var per = 1 / (this.dataRangeOption.color.length - 1); var colorList = []; for (var i = 0, l = this.dataRangeOption.color.length; i < l; i++) { colorList.push([ i * per, this.dataRangeOption.color[i] ]); } if (this.dataRangeOption.orient == 'horizontal') { itemShape = { zlevel: this.getZlevelBase(), z: this.getZBase(), style: { x: lastX, y: lastY, width: itemWidth * mSize, height: itemHeight, color: zrColor.getLinearGradient(lastX, lastY, lastX + itemWidth * mSize, lastY, colorList) }, hoverable: false }; lastX += itemWidth * mSize + this._textGap; } else { itemShape = { zlevel: this.getZlevelBase(), z: this.getZBase(), style: { x: lastX, y: lastY, width: itemWidth, height: itemHeight * mSize, color: zrColor.getLinearGradient(lastX, lastY, lastX, lastY + itemHeight * mSize, colorList) }, hoverable: false }; lastY += itemHeight * mSize + this._textGap; } this.shapeList.push(new RectangleShape(itemShape)); this._calculableLocation = itemShape.style; if (this.dataRangeOption.calculable) { this._buildFiller(); this._bulidMask(); this._bulidHandle(); } this._buildIndicator(); if (!needValueText && this.dataRangeOption.text[1]) { textShape = this._getTextShape(lastX, lastY, this.dataRangeOption.text[1]); this.shapeList.push(new TextShape(textShape)); } }, _buildIndicator: function () { var x = this._calculableLocation.x; var y = this._calculableLocation.y; var width = this._calculableLocation.width; var height = this._calculableLocation.height; var size = 5; var pointList; var textPosition; if (this.dataRangeOption.orient == 'horizontal') { if (this.dataRangeOption.y != 'bottom') { pointList = [ [ x, y + height ], [ x - size, y + height + size ], [ x + size, y + height + size ] ]; textPosition = 'bottom'; } else { pointList = [ [ x, y ], [ x - size, y - size ], [ x + size, y - size ] ]; textPosition = 'top'; } } else { if (this.dataRangeOption.x != 'right') { pointList = [ [ x + width, y ], [ x + width + size, y - size ], [ x + width + size, y + size ] ]; textPosition = 'right'; } else { pointList = [ [ x, y ], [ x - size, y - size ], [ x - size, y + size ] ]; textPosition = 'left'; } } this._indicatorShape = { style: { pointList: pointList, color: '#fff', __rect: { x: Math.min(pointList[0][0], pointList[1][0]), y: Math.min(pointList[0][1], pointList[1][1]), width: size * (this.dataRangeOption.orient == 'horizontal' ? 2 : 1), height: size * (this.dataRangeOption.orient == 'horizontal' ? 1 : 2) } }, highlightStyle: { brushType: 'fill', textPosition: textPosition, textColor: this.dataRangeOption.textStyle.color }, hoverable: false }; this._indicatorShape = new HandlePolygonShape(this._indicatorShape); }, _buildFiller: function () { this._fillerShape = { zlevel: this.getZlevelBase(), z: this.getZBase() + 1, style: { x: this._calculableLocation.x, y: this._calculableLocation.y, width: this._calculableLocation.width, height: this._calculableLocation.height, color: 'rgba(255,255,255,0)' }, highlightStyle: { strokeColor: 'rgba(255,255,255,0.5)', lineWidth: 1 }, draggable: true, ondrift: this._ondrift, ondragend: this._ondragend, onmousemove: this._dispatchHoverLink, _type: 'filler' }; this._fillerShape = new RectangleShape(this._fillerShape); this.shapeList.push(this._fillerShape); }, _bulidHandle: function () { var x = this._calculableLocation.x; var y = this._calculableLocation.y; var width = this._calculableLocation.width; var height = this._calculableLocation.height; var font = this.getFont(this.dataRangeOption.textStyle); var textHeight = zrArea.getTextHeight('国', font); var textWidth = Math.max(zrArea.getTextWidth(this._textFormat(this.dataRangeOption.max), font), zrArea.getTextWidth(this._textFormat(this.dataRangeOption.min), font)) + 2; var pointListStart; var textXStart; var textYStart; var coverRectStart; var pointListEnd; var textXEnd; var textYEnd; var coverRectEnd; if (this.dataRangeOption.orient == 'horizontal') { if (this.dataRangeOption.y != 'bottom') { pointListStart = [ [ x, y ], [ x, y + height + textHeight ], [ x - textHeight, y + height + textHeight ], [ x - 1, y + height ], [ x - 1, y ] ]; textXStart = x - textWidth / 2 - textHeight; textYStart = y + height + textHeight / 2 + 2; coverRectStart = { x: x - textWidth - textHeight, y: y + height, width: textWidth + textHeight, height: textHeight }; pointListEnd = [ [ x + width, y ], [ x + width, y + height + textHeight ], [ x + width + textHeight, y + height + textHeight ], [ x + width + 1, y + height ], [ x + width + 1, y ] ]; textXEnd = x + width + textWidth / 2 + textHeight; textYEnd = textYStart; coverRectEnd = { x: x + width, y: y + height, width: textWidth + textHeight, height: textHeight }; } else { pointListStart = [ [ x, y + height ], [ x, y - textHeight ], [ x - textHeight, y - textHeight ], [ x - 1, y ], [ x - 1, y + height ] ]; textXStart = x - textWidth / 2 - textHeight; textYStart = y - textHeight / 2 - 2; coverRectStart = { x: x - textWidth - textHeight, y: y - textHeight, width: textWidth + textHeight, height: textHeight }; pointListEnd = [ [ x + width, y + height ], [ x + width, y - textHeight ], [ x + width + textHeight, y - textHeight ], [ x + width + 1, y ], [ x + width + 1, y + height ] ]; textXEnd = x + width + textWidth / 2 + textHeight; textYEnd = textYStart; coverRectEnd = { x: x + width, y: y - textHeight, width: textWidth + textHeight, height: textHeight }; } } else { textWidth += textHeight; if (this.dataRangeOption.x != 'right') { pointListStart = [ [ x, y ], [ x + width + textHeight, y ], [ x + width + textHeight, y - textHeight ], [ x + width, y - 1 ], [ x, y - 1 ] ]; textXStart = x + width + textWidth / 2 + textHeight / 2; textYStart = y - textHeight / 2; coverRectStart = { x: x + width, y: y - textHeight, width: textWidth + textHeight, height: textHeight }; pointListEnd = [ [ x, y + height ], [ x + width + textHeight, y + height ], [ x + width + textHeight, y + textHeight + height ], [ x + width, y + 1 + height ], [ x, y + height + 1 ] ]; textXEnd = textXStart; textYEnd = y + height + textHeight / 2; coverRectEnd = { x: x + width, y: y + height, width: textWidth + textHeight, height: textHeight }; } else { pointListStart = [ [ x + width, y ], [ x - textHeight, y ], [ x - textHeight, y - textHeight ], [ x, y - 1 ], [ x + width, y - 1 ] ]; textXStart = x - textWidth / 2 - textHeight / 2; textYStart = y - textHeight / 2; coverRectStart = { x: x - textWidth - textHeight, y: y - textHeight, width: textWidth + textHeight, height: textHeight }; pointListEnd = [ [ x + width, y + height ], [ x - textHeight, y + height ], [ x - textHeight, y + textHeight + height ], [ x, y + 1 + height ], [ x + width, y + height + 1 ] ]; textXEnd = textXStart; textYEnd = y + height + textHeight / 2; coverRectEnd = { x: x - textWidth - textHeight, y: y + height, width: textWidth + textHeight, height: textHeight }; } } this._startShape = { style: { pointList: pointListStart, text: this._textFormat(this.dataRangeOption.max), textX: textXStart, textY: textYStart, textFont: font, color: this.getColor(this.dataRangeOption.max), rect: coverRectStart, x: pointListStart[0][0], y: pointListStart[0][1], _x: pointListStart[0][0], _y: pointListStart[0][1] } }; this._startShape.highlightStyle = { strokeColor: this._startShape.style.color, lineWidth: 1 }; this._endShape = { style: { pointList: pointListEnd, text: this._textFormat(this.dataRangeOption.min), textX: textXEnd, textY: textYEnd, textFont: font, color: this.getColor(this.dataRangeOption.min), rect: coverRectEnd, x: pointListEnd[0][0], y: pointListEnd[0][1], _x: pointListEnd[0][0], _y: pointListEnd[0][1] } }; this._endShape.highlightStyle = { strokeColor: this._endShape.style.color, lineWidth: 1 }; this._startShape.zlevel = this._endShape.zlevel = this.getZlevelBase(); this._startShape.z = this._endShape.z = this.getZBase() + 1; this._startShape.draggable = this._endShape.draggable = true; this._startShape.ondrift = this._endShape.ondrift = this._ondrift; this._startShape.ondragend = this._endShape.ondragend = this._ondragend; this._startShape.style.textColor = this._endShape.style.textColor = this.dataRangeOption.textStyle.color; this._startShape.style.textAlign = this._endShape.style.textAlign = 'center'; this._startShape.style.textPosition = this._endShape.style.textPosition = 'specific'; this._startShape.style.textBaseline = this._endShape.style.textBaseline = 'middle'; this._startShape.style.width = this._endShape.style.width = 0; this._startShape.style.height = this._endShape.style.height = 0; this._startShape.style.textPosition = this._endShape.style.textPosition = 'specific'; this._startShape = new HandlePolygonShape(this._startShape); this._endShape = new HandlePolygonShape(this._endShape); this.shapeList.push(this._startShape); this.shapeList.push(this._endShape); }, _bulidMask: function () { var x = this._calculableLocation.x; var y = this._calculableLocation.y; var width = this._calculableLocation.width; var height = this._calculableLocation.height; this._startMask = { zlevel: this.getZlevelBase(), z: this.getZBase() + 1, style: { x: x, y: y, width: this.dataRangeOption.orient == 'horizontal' ? 0 : width, height: this.dataRangeOption.orient == 'horizontal' ? height : 0, color: '#ccc' }, hoverable: false }; this._endMask = { zlevel: this.getZlevelBase(), z: this.getZBase() + 1, style: { x: this.dataRangeOption.orient == 'horizontal' ? x + width : x, y: this.dataRangeOption.orient == 'horizontal' ? y : y + height, width: this.dataRangeOption.orient == 'horizontal' ? 0 : width, height: this.dataRangeOption.orient == 'horizontal' ? height : 0, color: '#ccc' }, hoverable: false }; this._startMask = new RectangleShape(this._startMask); this._endMask = new RectangleShape(this._endMask); this.shapeList.push(this._startMask); this.shapeList.push(this._endMask); }, _buildBackground: function () { var padding = this.reformCssArray(this.dataRangeOption.padding); this.shapeList.push(new RectangleShape({ zlevel: this.getZlevelBase(), z: this.getZBase(), hoverable: false, style: { x: this._itemGroupLocation.x - padding[3], y: this._itemGroupLocation.y - padding[0], width: this._itemGroupLocation.width + padding[3] + padding[1], height: this._itemGroupLocation.height + padding[0] + padding[2], brushType: this.dataRangeOption.borderWidth === 0 ? 'fill' : 'both', color: this.dataRangeOption.backgroundColor, strokeColor: this.dataRangeOption.borderColor, lineWidth: this.dataRangeOption.borderWidth } })); }, _getItemGroupLocation: function () { var data = this._valueTextList; var dataLength = data.length; var itemGap = this.dataRangeOption.itemGap; var itemWidth = this.dataRangeOption.itemWidth; var itemHeight = this.dataRangeOption.itemHeight; var totalWidth = 0; var totalHeight = 0; var font = this.getFont(this.dataRangeOption.textStyle); var textHeight = zrArea.getTextHeight('国', font); var mSize = 10; if (this.dataRangeOption.orient == 'horizontal') { if (this.dataRangeOption.text || this._isContinuity()) { totalWidth = (this._isContinuity() ? itemWidth * mSize + itemGap : dataLength * (itemWidth + itemGap)) + (this.dataRangeOption.text && typeof this.dataRangeOption.text[0] != 'undefined' ? zrArea.getTextWidth(this.dataRangeOption.text[0], font) + this._textGap : 0) + (this.dataRangeOption.text && typeof this.dataRangeOption.text[1] != 'undefined' ? zrArea.getTextWidth(this.dataRangeOption.text[1], font) + this._textGap : 0); } else { itemWidth += 5; for (var i = 0; i < dataLength; i++) { totalWidth += itemWidth + zrArea.getTextWidth(data[i], font) + itemGap; } } totalWidth -= itemGap; totalHeight = Math.max(textHeight, itemHeight); } else { var maxWidth; if (this.dataRangeOption.text || this._isContinuity()) { totalHeight = (this._isContinuity() ? itemHeight * mSize + itemGap : dataLength * (itemHeight + itemGap)) + (this.dataRangeOption.text && typeof this.dataRangeOption.text[0] != 'undefined' ? this._textGap + textHeight : 0) + (this.dataRangeOption.text && typeof this.dataRangeOption.text[1] != 'undefined' ? this._textGap + textHeight : 0); maxWidth = Math.max(zrArea.getTextWidth(this.dataRangeOption.text && this.dataRangeOption.text[0] || '', font), zrArea.getTextWidth(this.dataRangeOption.text && this.dataRangeOption.text[1] || '', font)); totalWidth = Math.max(itemWidth, maxWidth); } else { totalHeight = (itemHeight + itemGap) * dataLength; itemWidth += 5; maxWidth = 0; for (var i = 0; i < dataLength; i++) { maxWidth = Math.max(maxWidth, zrArea.getTextWidth(data[i], font)); } totalWidth = itemWidth + maxWidth; } totalHeight -= itemGap; } var padding = this.reformCssArray(this.dataRangeOption.padding); var x; var zrWidth = this.zr.getWidth(); switch (this.dataRangeOption.x) { case 'center': x = Math.floor((zrWidth - totalWidth) / 2); break; case 'left': x = padding[3] + this.dataRangeOption.borderWidth; break; case 'right': x = zrWidth - totalWidth - padding[1] - this.dataRangeOption.borderWidth; break; default: x = this.parsePercent(this.dataRangeOption.x, zrWidth); x = isNaN(x) ? 0 : x; break; } var y; var zrHeight = this.zr.getHeight(); switch (this.dataRangeOption.y) { case 'top': y = padding[0] + this.dataRangeOption.borderWidth; break; case 'bottom': y = zrHeight - totalHeight - padding[2] - this.dataRangeOption.borderWidth; break; case 'center': y = Math.floor((zrHeight - totalHeight) / 2); break; default: y = this.parsePercent(this.dataRangeOption.y, zrHeight); y = isNaN(y) ? 0 : y; break; } if (this.dataRangeOption.calculable) { var handlerWidth = Math.max(zrArea.getTextWidth(this.dataRangeOption.max, font), zrArea.getTextWidth(this.dataRangeOption.min, font)) + textHeight; if (this.dataRangeOption.orient == 'horizontal') { if (x < handlerWidth) { x = handlerWidth; } if (x + totalWidth + handlerWidth > zrWidth) { x -= handlerWidth; } } else { if (y < textHeight) { y = textHeight; } if (y + totalHeight + textHeight > zrHeight) { y -= textHeight; } } } return { x: x, y: y, width: totalWidth, height: totalHeight }; }, _getTextShape: function (x, y, text) { return { zlevel: this.getZlevelBase(), z: this.getZBase(), style: { x: this.dataRangeOption.orient == 'horizontal' ? x : this._itemGroupLocation.x + this._itemGroupLocation.width / 2, y: this.dataRangeOption.orient == 'horizontal' ? this._itemGroupLocation.y + this._itemGroupLocation.height / 2 : y, color: this.dataRangeOption.textStyle.color, text: text, textFont: this.getFont(this.dataRangeOption.textStyle), textBaseline: this.dataRangeOption.orient == 'horizontal' ? 'middle' : 'top', textAlign: this.dataRangeOption.orient == 'horizontal' ? 'left' : 'center' }, hoverable: false }; }, _getItemShape: function (x, y, width, height, color) { return { zlevel: this.getZlevelBase(), z: this.getZBase(), style: { x: x, y: y + 1, width: width, height: height - 2, color: color }, highlightStyle: { strokeColor: color, lineWidth: 1 } }; }, __ondrift: function (shape, dx, dy) { var x = this._calculableLocation.x; var y = this._calculableLocation.y; var width = this._calculableLocation.width; var height = this._calculableLocation.height; if (this.dataRangeOption.orient == 'horizontal') { if (shape.style.x + dx <= x) { shape.style.x = x; } else if (shape.style.x + dx + shape.style.width >= x + width) { shape.style.x = x + width - shape.style.width; } else { shape.style.x += dx; } } else { if (shape.style.y + dy <= y) { shape.style.y = y; } else if (shape.style.y + dy + shape.style.height >= y + height) { shape.style.y = y + height - shape.style.height; } else { shape.style.y += dy; } } if (shape._type == 'filler') { this._syncHandleShape(); } else { this._syncFillerShape(shape); } if (this.dataRangeOption.realtime) { this._dispatchDataRange(); } return true; }, __ondragend: function () { this.isDragend = true; }, ondragend: function (param, status) { if (!this.isDragend || !param.target) { return; } status.dragOut = true; status.dragIn = true; if (!this.dataRangeOption.realtime) { this._dispatchDataRange(); } status.needRefresh = false; this.isDragend = false; return; }, _syncShapeFromRange: function () { var range = this.dataRangeOption.range || {}; var optRangeStart = range.start; var optRangeEnd = range.end; if (optRangeEnd < optRangeStart) { optRangeStart = [ optRangeEnd, optRangeEnd = optRangeStart ][0]; } this._range.end = optRangeStart != null ? optRangeStart : this._range.end != null ? this._range.end : 0; this._range.start = optRangeEnd != null ? optRangeEnd : this._range.start != null ? this._range.start : 100; if (this._range.start != 100 || this._range.end !== 0) { if (this.dataRangeOption.orient == 'horizontal') { var width = this._fillerShape.style.width; this._fillerShape.style.x += width * (100 - this._range.start) / 100; this._fillerShape.style.width = width * (this._range.start - this._range.end) / 100; } else { var height = this._fillerShape.style.height; this._fillerShape.style.y += height * (100 - this._range.start) / 100; this._fillerShape.style.height = height * (this._range.start - this._range.end) / 100; } this.zr.modShape(this._fillerShape.id); this._syncHandleShape(); } }, _syncHandleShape: function () { var x = this._calculableLocation.x; var y = this._calculableLocation.y; var width = this._calculableLocation.width; var height = this._calculableLocation.height; if (this.dataRangeOption.orient == 'horizontal') { this._startShape.style.x = this._fillerShape.style.x; this._startMask.style.width = this._startShape.style.x - x; this._endShape.style.x = this._fillerShape.style.x + this._fillerShape.style.width; this._endMask.style.x = this._endShape.style.x; this._endMask.style.width = x + width - this._endShape.style.x; this._range.start = Math.ceil(100 - (this._startShape.style.x - x) / width * 100); this._range.end = Math.floor(100 - (this._endShape.style.x - x) / width * 100); } else { this._startShape.style.y = this._fillerShape.style.y; this._startMask.style.height = this._startShape.style.y - y; this._endShape.style.y = this._fillerShape.style.y + this._fillerShape.style.height; this._endMask.style.y = this._endShape.style.y; this._endMask.style.height = y + height - this._endShape.style.y; this._range.start = Math.ceil(100 - (this._startShape.style.y - y) / height * 100); this._range.end = Math.floor(100 - (this._endShape.style.y - y) / height * 100); } this._syncShape(); }, _syncFillerShape: function (e) { var x = this._calculableLocation.x; var y = this._calculableLocation.y; var width = this._calculableLocation.width; var height = this._calculableLocation.height; var a; var b; if (this.dataRangeOption.orient == 'horizontal') { a = this._startShape.style.x; b = this._endShape.style.x; if (e.id == this._startShape.id && a >= b) { b = a; this._endShape.style.x = a; } else if (e.id == this._endShape.id && a >= b) { a = b; this._startShape.style.x = a; } this._fillerShape.style.x = a; this._fillerShape.style.width = b - a; this._startMask.style.width = a - x; this._endMask.style.x = b; this._endMask.style.width = x + width - b; this._range.start = Math.ceil(100 - (a - x) / width * 100); this._range.end = Math.floor(100 - (b - x) / width * 100); } else { a = this._startShape.style.y; b = this._endShape.style.y; if (e.id == this._startShape.id && a >= b) { b = a; this._endShape.style.y = a; } else if (e.id == this._endShape.id && a >= b) { a = b; this._startShape.style.y = a; } this._fillerShape.style.y = a; this._fillerShape.style.height = b - a; this._startMask.style.height = a - y; this._endMask.style.y = b; this._endMask.style.height = y + height - b; this._range.start = Math.ceil(100 - (a - y) / height * 100); this._range.end = Math.floor(100 - (b - y) / height * 100); } this._syncShape(); }, _syncShape: function () { this._startShape.position = [ this._startShape.style.x - this._startShape.style._x, this._startShape.style.y - this._startShape.style._y ]; this._startShape.style.text = this._textFormat(this._gap * this._range.start + this.dataRangeOption.min); this._startShape.style.color = this._startShape.highlightStyle.strokeColor = this.getColor(this._gap * this._range.start + this.dataRangeOption.min); this._endShape.position = [ this._endShape.style.x - this._endShape.style._x, this._endShape.style.y - this._endShape.style._y ]; this._endShape.style.text = this._textFormat(this._gap * this._range.end + this.dataRangeOption.min); this._endShape.style.color = this._endShape.highlightStyle.strokeColor = this.getColor(this._gap * this._range.end + this.dataRangeOption.min); this.zr.modShape(this._startShape.id); this.zr.modShape(this._endShape.id); this.zr.modShape(this._startMask.id); this.zr.modShape(this._endMask.id); this.zr.modShape(this._fillerShape.id); this.zr.refreshNextFrame(); }, _dispatchDataRange: function () { this.messageCenter.dispatch(ecConfig.EVENT.DATA_RANGE, null, { range: { start: this._range.end, end: this._range.start } }, this.myChart); }, __dataRangeSelected: function (param) { if (this.dataRangeOption.selectedMode === 'single') { for (var k in this._selectedMap) { this._selectedMap[k] = false; } } var idx = param.target._idx; this._selectedMap[idx] = !this._selectedMap[idx]; var valueMax; var valueMin; if (this._useCustomizedSplit()) { valueMax = this._splitList[idx].max; valueMin = this._splitList[idx].min; } else { valueMax = (this._colorList.length - idx) * this._gap + this.dataRangeOption.min; valueMin = valueMax - this._gap; } this.messageCenter.dispatch(ecConfig.EVENT.DATA_RANGE_SELECTED, param.event, { selected: this._selectedMap, target: idx, valueMax: valueMax, valueMin: valueMin }, this.myChart); this.messageCenter.dispatch(ecConfig.EVENT.REFRESH, null, null, this.myChart); }, __dispatchHoverLink: function (param) { var valueMin; var valueMax; if (this.dataRangeOption.calculable) { var totalValue = this.dataRangeOption.max - this.dataRangeOption.min; var curValue; if (this.dataRangeOption.orient == 'horizontal') { curValue = (1 - (zrEvent.getX(param.event) - this._calculableLocation.x) / this._calculableLocation.width) * totalValue; } else { curValue = (1 - (zrEvent.getY(param.event) - this._calculableLocation.y) / this._calculableLocation.height) * totalValue; } valueMin = curValue - totalValue * 0.05; valueMax = curValue + totalValue * 0.05; } else if (this._useCustomizedSplit()) { var idx = param.target._idx; valueMax = this._splitList[idx].max; valueMin = this._splitList[idx].min; } else { var idx = param.target._idx; valueMax = (this._colorList.length - idx) * this._gap + this.dataRangeOption.min; valueMin = valueMax - this._gap; } this.messageCenter.dispatch(ecConfig.EVENT.DATA_RANGE_HOVERLINK, param.event, { valueMin: valueMin, valueMax: valueMax }, this.myChart); }, __onhoverlink: function (param) { if (this.dataRangeOption.show && this.dataRangeOption.hoverLink && this._indicatorShape && param && param.seriesIndex != null && param.dataIndex != null) { var curValue = param.value; if (curValue === '' || isNaN(curValue)) { return; } if (curValue < this.dataRangeOption.min) { curValue = this.dataRangeOption.min; } else if (curValue > this.dataRangeOption.max) { curValue = this.dataRangeOption.max; } if (this.dataRangeOption.orient == 'horizontal') { this._indicatorShape.position = [ (this.dataRangeOption.max - curValue) / (this.dataRangeOption.max - this.dataRangeOption.min) * this._calculableLocation.width, 0 ]; } else { this._indicatorShape.position = [ 0, (this.dataRangeOption.max - curValue) / (this.dataRangeOption.max - this.dataRangeOption.min) * this._calculableLocation.height ]; } this._indicatorShape.style.text = this._textFormat(param.value); this._indicatorShape.style.color = this.getColor(curValue); this.zr.addHoverShape(this._indicatorShape); } }, _textFormat: function (valueStart, valueEnd) { var dataRangeOption = this.dataRangeOption; if (valueStart !== -Number.MAX_VALUE) { valueStart = (+valueStart).toFixed(dataRangeOption.precision); } if (valueEnd != null && valueEnd !== Number.MAX_VALUE) { valueEnd = (+valueEnd).toFixed(dataRangeOption.precision); } if (dataRangeOption.formatter) { if (typeof dataRangeOption.formatter == 'string') { return dataRangeOption.formatter.replace('{value}', valueStart === -Number.MAX_VALUE ? 'min' : valueStart).replace('{value2}', valueEnd === Number.MAX_VALUE ? 'max' : valueEnd); } else if (typeof dataRangeOption.formatter == 'function') { return dataRangeOption.formatter.call(this.myChart, valueStart, valueEnd); } } if (valueEnd == null) { return valueStart; } else { if (valueStart === -Number.MAX_VALUE) { return '< ' + valueEnd; } else if (valueEnd === Number.MAX_VALUE) { return '> ' + valueStart; } else { return valueStart + ' - ' + valueEnd; } } }, _isContinuity: function () { var dataRangeOption = this.dataRangeOption; return !(dataRangeOption.splitList ? dataRangeOption.splitList.length > 0 : dataRangeOption.splitNumber > 0) || dataRangeOption.calculable; }, _useCustomizedSplit: function () { var dataRangeOption = this.dataRangeOption; return dataRangeOption.splitList && dataRangeOption.splitList.length > 0; }, _buildColorList: function (splitNumber) { this._colorList = zrColor.getGradientColors(this.dataRangeOption.color, Math.max((splitNumber - this.dataRangeOption.color.length) / (this.dataRangeOption.color.length - 1), 0) + 1); if (this._colorList.length > splitNumber) { var len = this._colorList.length; var newColorList = [this._colorList[0]]; var step = len / (splitNumber - 1); for (var i = 1; i < splitNumber - 1; i++) { newColorList.push(this._colorList[Math.floor(i * step)]); } newColorList.push(this._colorList[len - 1]); this._colorList = newColorList; } if (this._useCustomizedSplit()) { var splitList = this._splitList; for (var i = 0, len = splitList.length; i < len; i++) { if (splitList[i].color) { this._colorList[i] = splitList[i].color; } } } }, _buildGap: function (splitNumber) { if (!this._useCustomizedSplit()) { var precision = this.dataRangeOption.precision; this._gap = (this.dataRangeOption.max - this.dataRangeOption.min) / splitNumber; while (this._gap.toFixed(precision) - 0 != this._gap && precision < 5) { precision++; } this.dataRangeOption.precision = precision; this._gap = ((this.dataRangeOption.max - this.dataRangeOption.min) / splitNumber).toFixed(precision) - 0; } }, _buildDataList: function (splitNumber) { var valueTextList = this._valueTextList = []; var dataRangeOption = this.dataRangeOption; var useCustomizedSplit = this._useCustomizedSplit(); for (var i = 0; i < splitNumber; i++) { this._selectedMap[i] = true; var text = ''; if (useCustomizedSplit) { var splitListItem = this._splitList[splitNumber - 1 - i]; if (splitListItem.label != null) { text = splitListItem.label; } else if (splitListItem.single != null) { text = this._textFormat(splitListItem.single); } else { text = this._textFormat(splitListItem.min, splitListItem.max); } } else { text = this._textFormat(i * this._gap + dataRangeOption.min, (i + 1) * this._gap + dataRangeOption.min); } valueTextList.unshift(text); } }, _buildSplitList: function () { if (!this._useCustomizedSplit()) { return; } var splitList = this.dataRangeOption.splitList; var splitRangeList = this._splitList = []; for (var i = 0, len = splitList.length; i < len; i++) { var splitListItem = splitList[i]; if (!splitListItem || splitListItem.start == null && splitListItem.end == null) { throw new Error('Empty item exists in splitList!'); } var reformedItem = { label: splitListItem.label, color: splitListItem.color }; reformedItem.min = splitListItem.start; reformedItem.max = splitListItem.end; if (reformedItem.min > reformedItem.max) { reformedItem.min = [ reformedItem.max, reformedItem.max = reformedItem.min ][0]; } if (reformedItem.min === reformedItem.max) { reformedItem.single = reformedItem.max; } if (reformedItem.min == null) { reformedItem.min = -Number.MAX_VALUE; } if (reformedItem.max == null) { reformedItem.max = Number.MAX_VALUE; } splitRangeList.push(reformedItem); } }, refresh: function (newOption) { if (newOption) { this.option = newOption; this.option.dataRange = this.reformOption(this.option.dataRange); var dataRangeOption = this.dataRangeOption = this.option.dataRange; if (!this._useCustomizedSplit() && (dataRangeOption.min == null || dataRangeOption.max == null)) { throw new Error('option.dataRange.min or option.dataRange.max has not been defined.'); } if (!this.myChart.canvasSupported) { dataRangeOption.realtime = false; } var splitNumber = this._isContinuity() ? 100 : this._useCustomizedSplit() ? dataRangeOption.splitList.length : dataRangeOption.splitNumber; this._buildSplitList(); this._buildColorList(splitNumber); this._buildGap(splitNumber); this._buildDataList(splitNumber); } this.clear(); this._buildShape(); }, getColor: function (value) { if (isNaN(value)) { return null; } var idx; if (!this._useCustomizedSplit()) { if (this.dataRangeOption.min == this.dataRangeOption.max) { return this._colorList[0]; } if (value < this.dataRangeOption.min) { value = this.dataRangeOption.min; } else if (value > this.dataRangeOption.max) { value = this.dataRangeOption.max; } if (this.dataRangeOption.calculable) { if (value - (this._gap * this._range.start + this.dataRangeOption.min) > 0.00005 || value - (this._gap * this._range.end + this.dataRangeOption.min) < -0.00005) { return null; } } idx = this._colorList.length - Math.ceil((value - this.dataRangeOption.min) / (this.dataRangeOption.max - this.dataRangeOption.min) * this._colorList.length); if (idx == this._colorList.length) { idx--; } } else { var splitRangeList = this._splitList; for (var i = 0, len = splitRangeList.length; i < len; i++) { if (splitRangeList[i].min <= value && splitRangeList[i].max >= value) { idx = i; break; } } } if (this._selectedMap[idx]) { return this._colorList[idx]; } else { return null; } }, getColorByIndex: function (idx) { if (idx >= this._colorList.length) { idx = this._colorList.length - 1; } else if (idx < 0) { idx = 0; } return this._colorList[idx]; }, onbeforDispose: function () { this.messageCenter.unbind(ecConfig.EVENT.HOVER, this._onhoverlink); } }; zrUtil.inherits(DataRange, Base); require('../component').define('dataRange', DataRange); return DataRange; });define('echarts/layout/WordCloudRectZero', ['require'], function (require) { function ZeroArray(option) { this.defaultOption = { type: 'RECT' }; this._init(option); } ZeroArray.prototype = { RECT: '_calculateRect', _init: function (option) { this._initOption(option); this._initCanvas(); }, _initOption: function (option) { for (k in option) { this.defaultOption[k] = option[k]; } }, _initCanvas: function () { var canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; var ratio = Math.sqrt(canvas.getContext('2d').getImageData(0, 0, 1, 1).data.length >> 2); canvas.width = this.defaultOption.width; canvas.height = this.defaultOption.height; if (canvas.getContext) { var ctx = canvas.getContext('2d'); } this.canvas = canvas; this.ctx = ctx; this.ratio = ratio; }, calculate: function (callback, callbackObj) { var calType = this.defaultOption.type, calmethod = this[calType]; this[calmethod].call(this, callback, callbackObj); }, _calculateReturn: function (result, callback, callbackObj) { callback.call(callbackObj, result); }, _calculateRect: function (callback, callbackObj) { var result = {}, width = this.defaultOption.width >> 5 << 5, height = this.defaultOption.height; result.initarr = this._rectZeroArray(width * height); result.area = width * height; result.maxHit = height; result.maxWit = width; result.imgboard = this._rectBoard(width, height); this._calculateReturn(result, callback, callbackObj); }, _rectBoard: function (width, height) { var row = []; for (var i = 0; i < height; i++) { row.push({ y: i, start: 0, end: width }); } var cloumn = []; for (var i = 0; i < width; i++) { cloumn.push({ x: i, start: 0, end: height }); } return { row: row, cloumn: cloumn }; }, _rectZeroArray: function (num) { var a = [], n = num, i = -1; while (++i < n) a[i] = 0; return a; } }; return ZeroArray; });define('echarts/util/shape/HandlePolygon', [ 'require', 'zrender/shape/Base', 'zrender/shape/Polygon', 'zrender/tool/util' ], function (require) { var Base = require('zrender/shape/Base'); var PolygonShape = require('zrender/shape/Polygon'); var zrUtil = require('zrender/tool/util'); function HandlePolygon(options) { Base.call(this, options); } HandlePolygon.prototype = { type: 'handle-polygon', buildPath: function (ctx, style) { PolygonShape.prototype.buildPath(ctx, style); }, isCover: function (x, y) { var originPos = this.transformCoordToLocal(x, y); x = originPos[0]; y = originPos[1]; var rect = this.style.rect; if (x >= rect.x && x <= rect.x + rect.width && y >= rect.y && y <= rect.y + rect.height) { return true; } else { return false; } } }; zrUtil.inherits(HandlePolygon, Base); return HandlePolygon; });