/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /** * AUTO-GENERATED FILE. DO NOT MODIFY. */ /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import { __extends } from "tslib"; // TODO Batch by color import * as graphic from '../../util/graphic.js'; import * as lineContain from 'zrender/lib/contain/line.js'; import * as quadraticContain from 'zrender/lib/contain/quadratic.js'; import { getECData } from '../../util/innerStore.js'; var LargeLinesPathShape = /** @class */function () { function LargeLinesPathShape() { this.polyline = false; this.curveness = 0; this.segs = []; } return LargeLinesPathShape; }(); var LargeLinesPath = /** @class */function (_super) { __extends(LargeLinesPath, _super); function LargeLinesPath(opts) { var _this = _super.call(this, opts) || this; _this._off = 0; _this.hoverDataIdx = -1; return _this; } LargeLinesPath.prototype.reset = function () { this.notClear = false; this._off = 0; }; LargeLinesPath.prototype.getDefaultStyle = function () { return { stroke: '#000', fill: null }; }; LargeLinesPath.prototype.getDefaultShape = function () { return new LargeLinesPathShape(); }; LargeLinesPath.prototype.buildPath = function (ctx, shape) { var segs = shape.segs; var curveness = shape.curveness; var i; if (shape.polyline) { for (i = this._off; i < segs.length;) { var count = segs[i++]; if (count > 0) { ctx.moveTo(segs[i++], segs[i++]); for (var k = 1; k < count; k++) { ctx.lineTo(segs[i++], segs[i++]); } } } } else { for (i = this._off; i < segs.length;) { var x0 = segs[i++]; var y0 = segs[i++]; var x1 = segs[i++]; var y1 = segs[i++]; ctx.moveTo(x0, y0); if (curveness > 0) { var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; ctx.quadraticCurveTo(x2, y2, x1, y1); } else { ctx.lineTo(x1, y1); } } } if (this.incremental) { this._off = i; this.notClear = true; } }; LargeLinesPath.prototype.findDataIndex = function (x, y) { var shape = this.shape; var segs = shape.segs; var curveness = shape.curveness; var lineWidth = this.style.lineWidth; if (shape.polyline) { var dataIndex = 0; for (var i = 0; i < segs.length;) { var count = segs[i++]; if (count > 0) { var x0 = segs[i++]; var y0 = segs[i++]; for (var k = 1; k < count; k++) { var x1 = segs[i++]; var y1 = segs[i++]; if (lineContain.containStroke(x0, y0, x1, y1, lineWidth, x, y)) { return dataIndex; } } } dataIndex++; } } else { var dataIndex = 0; for (var i = 0; i < segs.length;) { var x0 = segs[i++]; var y0 = segs[i++]; var x1 = segs[i++]; var y1 = segs[i++]; if (curveness > 0) { var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; if (quadraticContain.containStroke(x0, y0, x2, y2, x1, y1, lineWidth, x, y)) { return dataIndex; } } else { if (lineContain.containStroke(x0, y0, x1, y1, lineWidth, x, y)) { return dataIndex; } } dataIndex++; } } return -1; }; LargeLinesPath.prototype.contain = function (x, y) { var localPos = this.transformCoordToLocal(x, y); var rect = this.getBoundingRect(); x = localPos[0]; y = localPos[1]; if (rect.contain(x, y)) { // Cache found data index. var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y); return dataIdx >= 0; } this.hoverDataIdx = -1; return false; }; LargeLinesPath.prototype.getBoundingRect = function () { // Ignore stroke for large symbol draw. var rect = this._rect; if (!rect) { var shape = this.shape; var points = shape.segs; var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0; i < points.length;) { var x = points[i++]; var y = points[i++]; minX = Math.min(x, minX); maxX = Math.max(x, maxX); minY = Math.min(y, minY); maxY = Math.max(y, maxY); } rect = this._rect = new graphic.BoundingRect(minX, minY, maxX, maxY); } return rect; }; return LargeLinesPath; }(graphic.Path); var LargeLineDraw = /** @class */function () { function LargeLineDraw() { this.group = new graphic.Group(); } /** * Update symbols draw by new data */ LargeLineDraw.prototype.updateData = function (data) { this._clear(); var lineEl = this._create(); lineEl.setShape({ segs: data.getLayout('linesPoints') }); this._setCommon(lineEl, data); }; ; /** * @override */ LargeLineDraw.prototype.incrementalPrepareUpdate = function (data) { this.group.removeAll(); this._clear(); }; ; /** * @override */ LargeLineDraw.prototype.incrementalUpdate = function (taskParams, data) { var lastAdded = this._newAdded[0]; var linePoints = data.getLayout('linesPoints'); var oldSegs = lastAdded && lastAdded.shape.segs; // Merging the exists. Each element has 1e4 points. // Consider the performance balance between too much elements and too much points in one shape(may affect hover optimization) if (oldSegs && oldSegs.length < 2e4) { var oldLen = oldSegs.length; var newSegs = new Float32Array(oldLen + linePoints.length); // Concat two array newSegs.set(oldSegs); newSegs.set(linePoints, oldLen); lastAdded.setShape({ segs: newSegs }); } else { // Clear this._newAdded = []; var lineEl = this._create(); lineEl.incremental = true; lineEl.setShape({ segs: linePoints }); this._setCommon(lineEl, data); lineEl.__startIndex = taskParams.start; } }; /** * @override */ LargeLineDraw.prototype.remove = function () { this._clear(); }; LargeLineDraw.prototype.eachRendered = function (cb) { this._newAdded[0] && cb(this._newAdded[0]); }; LargeLineDraw.prototype._create = function () { var lineEl = new LargeLinesPath({ cursor: 'default', ignoreCoarsePointer: true }); this._newAdded.push(lineEl); this.group.add(lineEl); return lineEl; }; LargeLineDraw.prototype._setCommon = function (lineEl, data, isIncremental) { var hostModel = data.hostModel; lineEl.setShape({ polyline: hostModel.get('polyline'), curveness: hostModel.get(['lineStyle', 'curveness']) }); lineEl.useStyle(hostModel.getModel('lineStyle').getLineStyle()); lineEl.style.strokeNoScale = true; var style = data.getVisual('style'); if (style && style.stroke) { lineEl.setStyle('stroke', style.stroke); } lineEl.setStyle('fill', null); var ecData = getECData(lineEl); // Enable tooltip // PENDING May have performance issue when path is extremely large ecData.seriesIndex = hostModel.seriesIndex; lineEl.on('mousemove', function (e) { ecData.dataIndex = null; var dataIndex = lineEl.hoverDataIdx; if (dataIndex > 0) { // Provide dataIndex for tooltip ecData.dataIndex = dataIndex + lineEl.__startIndex; } }); }; ; LargeLineDraw.prototype._clear = function () { this._newAdded = []; this.group.removeAll(); }; ; return LargeLineDraw; }(); export default LargeLineDraw;