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