302 lines
9.1 KiB
JavaScript
302 lines
9.1 KiB
JavaScript
|
|
||
|
/*
|
||
|
* 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;
|