| 
/* 
 | 
* 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"; 
 | 
// Poly path support NaN point 
 | 
import Path from 'zrender/lib/graphic/Path.js'; 
 | 
import PathProxy from 'zrender/lib/core/PathProxy.js'; 
 | 
import { cubicRootAt, cubicAt } from 'zrender/lib/core/curve.js'; 
 | 
var mathMin = Math.min; 
 | 
var mathMax = Math.max; 
 | 
function isPointNull(x, y) { 
 | 
  return isNaN(x) || isNaN(y); 
 | 
} 
 | 
/** 
 | 
 * Draw smoothed line in non-monotone, in may cause undesired curve in extreme 
 | 
 * situations. This should be used when points are non-monotone neither in x or 
 | 
 * y dimension. 
 | 
 */ 
 | 
function drawSegment(ctx, points, start, segLen, allLen, dir, smooth, smoothMonotone, connectNulls) { 
 | 
  var prevX; 
 | 
  var prevY; 
 | 
  var cpx0; 
 | 
  var cpy0; 
 | 
  var cpx1; 
 | 
  var cpy1; 
 | 
  var idx = start; 
 | 
  var k = 0; 
 | 
  for (; k < segLen; k++) { 
 | 
    var x = points[idx * 2]; 
 | 
    var y = points[idx * 2 + 1]; 
 | 
    if (idx >= allLen || idx < 0) { 
 | 
      break; 
 | 
    } 
 | 
    if (isPointNull(x, y)) { 
 | 
      if (connectNulls) { 
 | 
        idx += dir; 
 | 
        continue; 
 | 
      } 
 | 
      break; 
 | 
    } 
 | 
    if (idx === start) { 
 | 
      ctx[dir > 0 ? 'moveTo' : 'lineTo'](x, y); 
 | 
      cpx0 = x; 
 | 
      cpy0 = y; 
 | 
    } else { 
 | 
      var dx = x - prevX; 
 | 
      var dy = y - prevY; 
 | 
      // Ignore tiny segment. 
 | 
      if (dx * dx + dy * dy < 0.5) { 
 | 
        idx += dir; 
 | 
        continue; 
 | 
      } 
 | 
      if (smooth > 0) { 
 | 
        var nextIdx = idx + dir; 
 | 
        var nextX = points[nextIdx * 2]; 
 | 
        var nextY = points[nextIdx * 2 + 1]; 
 | 
        // Ignore duplicate point 
 | 
        while (nextX === x && nextY === y && k < segLen) { 
 | 
          k++; 
 | 
          nextIdx += dir; 
 | 
          idx += dir; 
 | 
          nextX = points[nextIdx * 2]; 
 | 
          nextY = points[nextIdx * 2 + 1]; 
 | 
          x = points[idx * 2]; 
 | 
          y = points[idx * 2 + 1]; 
 | 
          dx = x - prevX; 
 | 
          dy = y - prevY; 
 | 
        } 
 | 
        var tmpK = k + 1; 
 | 
        if (connectNulls) { 
 | 
          // Find next point not null 
 | 
          while (isPointNull(nextX, nextY) && tmpK < segLen) { 
 | 
            tmpK++; 
 | 
            nextIdx += dir; 
 | 
            nextX = points[nextIdx * 2]; 
 | 
            nextY = points[nextIdx * 2 + 1]; 
 | 
          } 
 | 
        } 
 | 
        var ratioNextSeg = 0.5; 
 | 
        var vx = 0; 
 | 
        var vy = 0; 
 | 
        var nextCpx0 = void 0; 
 | 
        var nextCpy0 = void 0; 
 | 
        // Is last point 
 | 
        if (tmpK >= segLen || isPointNull(nextX, nextY)) { 
 | 
          cpx1 = x; 
 | 
          cpy1 = y; 
 | 
        } else { 
 | 
          vx = nextX - prevX; 
 | 
          vy = nextY - prevY; 
 | 
          var dx0 = x - prevX; 
 | 
          var dx1 = nextX - x; 
 | 
          var dy0 = y - prevY; 
 | 
          var dy1 = nextY - y; 
 | 
          var lenPrevSeg = void 0; 
 | 
          var lenNextSeg = void 0; 
 | 
          if (smoothMonotone === 'x') { 
 | 
            lenPrevSeg = Math.abs(dx0); 
 | 
            lenNextSeg = Math.abs(dx1); 
 | 
            var dir_1 = vx > 0 ? 1 : -1; 
 | 
            cpx1 = x - dir_1 * lenPrevSeg * smooth; 
 | 
            cpy1 = y; 
 | 
            nextCpx0 = x + dir_1 * lenNextSeg * smooth; 
 | 
            nextCpy0 = y; 
 | 
          } else if (smoothMonotone === 'y') { 
 | 
            lenPrevSeg = Math.abs(dy0); 
 | 
            lenNextSeg = Math.abs(dy1); 
 | 
            var dir_2 = vy > 0 ? 1 : -1; 
 | 
            cpx1 = x; 
 | 
            cpy1 = y - dir_2 * lenPrevSeg * smooth; 
 | 
            nextCpx0 = x; 
 | 
            nextCpy0 = y + dir_2 * lenNextSeg * smooth; 
 | 
          } else { 
 | 
            lenPrevSeg = Math.sqrt(dx0 * dx0 + dy0 * dy0); 
 | 
            lenNextSeg = Math.sqrt(dx1 * dx1 + dy1 * dy1); 
 | 
            // Use ratio of seg length 
 | 
            ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg); 
 | 
            cpx1 = x - vx * smooth * (1 - ratioNextSeg); 
 | 
            cpy1 = y - vy * smooth * (1 - ratioNextSeg); 
 | 
            // cp0 of next segment 
 | 
            nextCpx0 = x + vx * smooth * ratioNextSeg; 
 | 
            nextCpy0 = y + vy * smooth * ratioNextSeg; 
 | 
            // Smooth constraint between point and next point. 
 | 
            // Avoid exceeding extreme after smoothing. 
 | 
            nextCpx0 = mathMin(nextCpx0, mathMax(nextX, x)); 
 | 
            nextCpy0 = mathMin(nextCpy0, mathMax(nextY, y)); 
 | 
            nextCpx0 = mathMax(nextCpx0, mathMin(nextX, x)); 
 | 
            nextCpy0 = mathMax(nextCpy0, mathMin(nextY, y)); 
 | 
            // Reclaculate cp1 based on the adjusted cp0 of next seg. 
 | 
            vx = nextCpx0 - x; 
 | 
            vy = nextCpy0 - y; 
 | 
            cpx1 = x - vx * lenPrevSeg / lenNextSeg; 
 | 
            cpy1 = y - vy * lenPrevSeg / lenNextSeg; 
 | 
            // Smooth constraint between point and prev point. 
 | 
            // Avoid exceeding extreme after smoothing. 
 | 
            cpx1 = mathMin(cpx1, mathMax(prevX, x)); 
 | 
            cpy1 = mathMin(cpy1, mathMax(prevY, y)); 
 | 
            cpx1 = mathMax(cpx1, mathMin(prevX, x)); 
 | 
            cpy1 = mathMax(cpy1, mathMin(prevY, y)); 
 | 
            // Adjust next cp0 again. 
 | 
            vx = x - cpx1; 
 | 
            vy = y - cpy1; 
 | 
            nextCpx0 = x + vx * lenNextSeg / lenPrevSeg; 
 | 
            nextCpy0 = y + vy * lenNextSeg / lenPrevSeg; 
 | 
          } 
 | 
        } 
 | 
        ctx.bezierCurveTo(cpx0, cpy0, cpx1, cpy1, x, y); 
 | 
        cpx0 = nextCpx0; 
 | 
        cpy0 = nextCpy0; 
 | 
      } else { 
 | 
        ctx.lineTo(x, y); 
 | 
      } 
 | 
    } 
 | 
    prevX = x; 
 | 
    prevY = y; 
 | 
    idx += dir; 
 | 
  } 
 | 
  return k; 
 | 
} 
 | 
var ECPolylineShape = /** @class */function () { 
 | 
  function ECPolylineShape() { 
 | 
    this.smooth = 0; 
 | 
    this.smoothConstraint = true; 
 | 
  } 
 | 
  return ECPolylineShape; 
 | 
}(); 
 | 
var ECPolyline = /** @class */function (_super) { 
 | 
  __extends(ECPolyline, _super); 
 | 
  function ECPolyline(opts) { 
 | 
    var _this = _super.call(this, opts) || this; 
 | 
    _this.type = 'ec-polyline'; 
 | 
    return _this; 
 | 
  } 
 | 
  ECPolyline.prototype.getDefaultStyle = function () { 
 | 
    return { 
 | 
      stroke: '#000', 
 | 
      fill: null 
 | 
    }; 
 | 
  }; 
 | 
  ECPolyline.prototype.getDefaultShape = function () { 
 | 
    return new ECPolylineShape(); 
 | 
  }; 
 | 
  ECPolyline.prototype.buildPath = function (ctx, shape) { 
 | 
    var points = shape.points; 
 | 
    var i = 0; 
 | 
    var len = points.length / 2; 
 | 
    // const result = getBoundingBox(points, shape.smoothConstraint); 
 | 
    if (shape.connectNulls) { 
 | 
      // Must remove first and last null values avoid draw error in polygon 
 | 
      for (; len > 0; len--) { 
 | 
        if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) { 
 | 
          break; 
 | 
        } 
 | 
      } 
 | 
      for (; i < len; i++) { 
 | 
        if (!isPointNull(points[i * 2], points[i * 2 + 1])) { 
 | 
          break; 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
    while (i < len) { 
 | 
      i += drawSegment(ctx, points, i, len, len, 1, shape.smooth, shape.smoothMonotone, shape.connectNulls) + 1; 
 | 
    } 
 | 
  }; 
 | 
  ECPolyline.prototype.getPointOn = function (xOrY, dim) { 
 | 
    if (!this.path) { 
 | 
      this.createPathProxy(); 
 | 
      this.buildPath(this.path, this.shape); 
 | 
    } 
 | 
    var path = this.path; 
 | 
    var data = path.data; 
 | 
    var CMD = PathProxy.CMD; 
 | 
    var x0; 
 | 
    var y0; 
 | 
    var isDimX = dim === 'x'; 
 | 
    var roots = []; 
 | 
    for (var i = 0; i < data.length;) { 
 | 
      var cmd = data[i++]; 
 | 
      var x = void 0; 
 | 
      var y = void 0; 
 | 
      var x2 = void 0; 
 | 
      var y2 = void 0; 
 | 
      var x3 = void 0; 
 | 
      var y3 = void 0; 
 | 
      var t = void 0; 
 | 
      switch (cmd) { 
 | 
        case CMD.M: 
 | 
          x0 = data[i++]; 
 | 
          y0 = data[i++]; 
 | 
          break; 
 | 
        case CMD.L: 
 | 
          x = data[i++]; 
 | 
          y = data[i++]; 
 | 
          t = isDimX ? (xOrY - x0) / (x - x0) : (xOrY - y0) / (y - y0); 
 | 
          if (t <= 1 && t >= 0) { 
 | 
            var val = isDimX ? (y - y0) * t + y0 : (x - x0) * t + x0; 
 | 
            return isDimX ? [xOrY, val] : [val, xOrY]; 
 | 
          } 
 | 
          x0 = x; 
 | 
          y0 = y; 
 | 
          break; 
 | 
        case CMD.C: 
 | 
          x = data[i++]; 
 | 
          y = data[i++]; 
 | 
          x2 = data[i++]; 
 | 
          y2 = data[i++]; 
 | 
          x3 = data[i++]; 
 | 
          y3 = data[i++]; 
 | 
          var nRoot = isDimX ? cubicRootAt(x0, x, x2, x3, xOrY, roots) : cubicRootAt(y0, y, y2, y3, xOrY, roots); 
 | 
          if (nRoot > 0) { 
 | 
            for (var i_1 = 0; i_1 < nRoot; i_1++) { 
 | 
              var t_1 = roots[i_1]; 
 | 
              if (t_1 <= 1 && t_1 >= 0) { 
 | 
                var val = isDimX ? cubicAt(y0, y, y2, y3, t_1) : cubicAt(x0, x, x2, x3, t_1); 
 | 
                return isDimX ? [xOrY, val] : [val, xOrY]; 
 | 
              } 
 | 
            } 
 | 
          } 
 | 
          x0 = x3; 
 | 
          y0 = y3; 
 | 
          break; 
 | 
      } 
 | 
    } 
 | 
  }; 
 | 
  return ECPolyline; 
 | 
}(Path); 
 | 
export { ECPolyline }; 
 | 
var ECPolygonShape = /** @class */function (_super) { 
 | 
  __extends(ECPolygonShape, _super); 
 | 
  function ECPolygonShape() { 
 | 
    return _super !== null && _super.apply(this, arguments) || this; 
 | 
  } 
 | 
  return ECPolygonShape; 
 | 
}(ECPolylineShape); 
 | 
var ECPolygon = /** @class */function (_super) { 
 | 
  __extends(ECPolygon, _super); 
 | 
  function ECPolygon(opts) { 
 | 
    var _this = _super.call(this, opts) || this; 
 | 
    _this.type = 'ec-polygon'; 
 | 
    return _this; 
 | 
  } 
 | 
  ECPolygon.prototype.getDefaultShape = function () { 
 | 
    return new ECPolygonShape(); 
 | 
  }; 
 | 
  ECPolygon.prototype.buildPath = function (ctx, shape) { 
 | 
    var points = shape.points; 
 | 
    var stackedOnPoints = shape.stackedOnPoints; 
 | 
    var i = 0; 
 | 
    var len = points.length / 2; 
 | 
    var smoothMonotone = shape.smoothMonotone; 
 | 
    if (shape.connectNulls) { 
 | 
      // Must remove first and last null values avoid draw error in polygon 
 | 
      for (; len > 0; len--) { 
 | 
        if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) { 
 | 
          break; 
 | 
        } 
 | 
      } 
 | 
      for (; i < len; i++) { 
 | 
        if (!isPointNull(points[i * 2], points[i * 2 + 1])) { 
 | 
          break; 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
    while (i < len) { 
 | 
      var k = drawSegment(ctx, points, i, len, len, 1, shape.smooth, smoothMonotone, shape.connectNulls); 
 | 
      drawSegment(ctx, stackedOnPoints, i + k - 1, k, len, -1, shape.stackedOnSmooth, smoothMonotone, shape.connectNulls); 
 | 
      i += k + 1; 
 | 
      ctx.closePath(); 
 | 
    } 
 | 
  }; 
 | 
  return ECPolygon; 
 | 
}(Path); 
 | 
export { ECPolygon }; 
 |