| 
/* 
 | 
* 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; 
 |