| import { __extends } from "tslib"; | 
| import Displayable, { DEFAULT_COMMON_STYLE, DEFAULT_COMMON_ANIMATION_PROPS } from './Displayable.js'; | 
| import PathProxy from '../core/PathProxy.js'; | 
| import * as pathContain from '../contain/path.js'; | 
| import { defaults, keys, extend, clone, isString, createObject } from '../core/util.js'; | 
| import { lum } from '../tool/color.js'; | 
| import { DARK_LABEL_COLOR, LIGHT_LABEL_COLOR, DARK_MODE_THRESHOLD, LIGHTER_LABEL_COLOR } from '../config.js'; | 
| import { REDRAW_BIT, SHAPE_CHANGED_BIT, STYLE_CHANGED_BIT } from './constants.js'; | 
| import { TRANSFORMABLE_PROPS } from '../core/Transformable.js'; | 
| export var DEFAULT_PATH_STYLE = defaults({ | 
|     fill: '#000', | 
|     stroke: null, | 
|     strokePercent: 1, | 
|     fillOpacity: 1, | 
|     strokeOpacity: 1, | 
|     lineDashOffset: 0, | 
|     lineWidth: 1, | 
|     lineCap: 'butt', | 
|     miterLimit: 10, | 
|     strokeNoScale: false, | 
|     strokeFirst: false | 
| }, DEFAULT_COMMON_STYLE); | 
| export var DEFAULT_PATH_ANIMATION_PROPS = { | 
|     style: defaults({ | 
|         fill: true, | 
|         stroke: true, | 
|         strokePercent: true, | 
|         fillOpacity: true, | 
|         strokeOpacity: true, | 
|         lineDashOffset: true, | 
|         lineWidth: true, | 
|         miterLimit: true | 
|     }, DEFAULT_COMMON_ANIMATION_PROPS.style) | 
| }; | 
| var pathCopyParams = TRANSFORMABLE_PROPS.concat(['invisible', | 
|     'culling', 'z', 'z2', 'zlevel', 'parent' | 
| ]); | 
| var Path = (function (_super) { | 
|     __extends(Path, _super); | 
|     function Path(opts) { | 
|         return _super.call(this, opts) || this; | 
|     } | 
|     Path.prototype.update = function () { | 
|         var _this = this; | 
|         _super.prototype.update.call(this); | 
|         var style = this.style; | 
|         if (style.decal) { | 
|             var decalEl = this._decalEl = this._decalEl || new Path(); | 
|             if (decalEl.buildPath === Path.prototype.buildPath) { | 
|                 decalEl.buildPath = function (ctx) { | 
|                     _this.buildPath(ctx, _this.shape); | 
|                 }; | 
|             } | 
|             decalEl.silent = true; | 
|             var decalElStyle = decalEl.style; | 
|             for (var key in style) { | 
|                 if (decalElStyle[key] !== style[key]) { | 
|                     decalElStyle[key] = style[key]; | 
|                 } | 
|             } | 
|             decalElStyle.fill = style.fill ? style.decal : null; | 
|             decalElStyle.decal = null; | 
|             decalElStyle.shadowColor = null; | 
|             style.strokeFirst && (decalElStyle.stroke = null); | 
|             for (var i = 0; i < pathCopyParams.length; ++i) { | 
|                 decalEl[pathCopyParams[i]] = this[pathCopyParams[i]]; | 
|             } | 
|             decalEl.__dirty |= REDRAW_BIT; | 
|         } | 
|         else if (this._decalEl) { | 
|             this._decalEl = null; | 
|         } | 
|     }; | 
|     Path.prototype.getDecalElement = function () { | 
|         return this._decalEl; | 
|     }; | 
|     Path.prototype._init = function (props) { | 
|         var keysArr = keys(props); | 
|         this.shape = this.getDefaultShape(); | 
|         var defaultStyle = this.getDefaultStyle(); | 
|         if (defaultStyle) { | 
|             this.useStyle(defaultStyle); | 
|         } | 
|         for (var i = 0; i < keysArr.length; i++) { | 
|             var key = keysArr[i]; | 
|             var value = props[key]; | 
|             if (key === 'style') { | 
|                 if (!this.style) { | 
|                     this.useStyle(value); | 
|                 } | 
|                 else { | 
|                     extend(this.style, value); | 
|                 } | 
|             } | 
|             else if (key === 'shape') { | 
|                 extend(this.shape, value); | 
|             } | 
|             else { | 
|                 _super.prototype.attrKV.call(this, key, value); | 
|             } | 
|         } | 
|         if (!this.style) { | 
|             this.useStyle({}); | 
|         } | 
|     }; | 
|     Path.prototype.getDefaultStyle = function () { | 
|         return null; | 
|     }; | 
|     Path.prototype.getDefaultShape = function () { | 
|         return {}; | 
|     }; | 
|     Path.prototype.canBeInsideText = function () { | 
|         return this.hasFill(); | 
|     }; | 
|     Path.prototype.getInsideTextFill = function () { | 
|         var pathFill = this.style.fill; | 
|         if (pathFill !== 'none') { | 
|             if (isString(pathFill)) { | 
|                 var fillLum = lum(pathFill, 0); | 
|                 if (fillLum > 0.5) { | 
|                     return DARK_LABEL_COLOR; | 
|                 } | 
|                 else if (fillLum > 0.2) { | 
|                     return LIGHTER_LABEL_COLOR; | 
|                 } | 
|                 return LIGHT_LABEL_COLOR; | 
|             } | 
|             else if (pathFill) { | 
|                 return LIGHT_LABEL_COLOR; | 
|             } | 
|         } | 
|         return DARK_LABEL_COLOR; | 
|     }; | 
|     Path.prototype.getInsideTextStroke = function (textFill) { | 
|         var pathFill = this.style.fill; | 
|         if (isString(pathFill)) { | 
|             var zr = this.__zr; | 
|             var isDarkMode = !!(zr && zr.isDarkMode()); | 
|             var isDarkLabel = lum(textFill, 0) < DARK_MODE_THRESHOLD; | 
|             if (isDarkMode === isDarkLabel) { | 
|                 return pathFill; | 
|             } | 
|         } | 
|     }; | 
|     Path.prototype.buildPath = function (ctx, shapeCfg, inBatch) { }; | 
|     Path.prototype.pathUpdated = function () { | 
|         this.__dirty &= ~SHAPE_CHANGED_BIT; | 
|     }; | 
|     Path.prototype.getUpdatedPathProxy = function (inBatch) { | 
|         !this.path && this.createPathProxy(); | 
|         this.path.beginPath(); | 
|         this.buildPath(this.path, this.shape, inBatch); | 
|         return this.path; | 
|     }; | 
|     Path.prototype.createPathProxy = function () { | 
|         this.path = new PathProxy(false); | 
|     }; | 
|     Path.prototype.hasStroke = function () { | 
|         var style = this.style; | 
|         var stroke = style.stroke; | 
|         return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0)); | 
|     }; | 
|     Path.prototype.hasFill = function () { | 
|         var style = this.style; | 
|         var fill = style.fill; | 
|         return fill != null && fill !== 'none'; | 
|     }; | 
|     Path.prototype.getBoundingRect = function () { | 
|         var rect = this._rect; | 
|         var style = this.style; | 
|         var needsUpdateRect = !rect; | 
|         if (needsUpdateRect) { | 
|             var firstInvoke = false; | 
|             if (!this.path) { | 
|                 firstInvoke = true; | 
|                 this.createPathProxy(); | 
|             } | 
|             var path = this.path; | 
|             if (firstInvoke || (this.__dirty & SHAPE_CHANGED_BIT)) { | 
|                 path.beginPath(); | 
|                 this.buildPath(path, this.shape, false); | 
|                 this.pathUpdated(); | 
|             } | 
|             rect = path.getBoundingRect(); | 
|         } | 
|         this._rect = rect; | 
|         if (this.hasStroke() && this.path && this.path.len() > 0) { | 
|             var rectStroke = this._rectStroke || (this._rectStroke = rect.clone()); | 
|             if (this.__dirty || needsUpdateRect) { | 
|                 rectStroke.copy(rect); | 
|                 var lineScale = style.strokeNoScale ? this.getLineScale() : 1; | 
|                 var w = style.lineWidth; | 
|                 if (!this.hasFill()) { | 
|                     var strokeContainThreshold = this.strokeContainThreshold; | 
|                     w = Math.max(w, strokeContainThreshold == null ? 4 : strokeContainThreshold); | 
|                 } | 
|                 if (lineScale > 1e-10) { | 
|                     rectStroke.width += w / lineScale; | 
|                     rectStroke.height += w / lineScale; | 
|                     rectStroke.x -= w / lineScale / 2; | 
|                     rectStroke.y -= w / lineScale / 2; | 
|                 } | 
|             } | 
|             return rectStroke; | 
|         } | 
|         return rect; | 
|     }; | 
|     Path.prototype.contain = function (x, y) { | 
|         var localPos = this.transformCoordToLocal(x, y); | 
|         var rect = this.getBoundingRect(); | 
|         var style = this.style; | 
|         x = localPos[0]; | 
|         y = localPos[1]; | 
|         if (rect.contain(x, y)) { | 
|             var pathProxy = this.path; | 
|             if (this.hasStroke()) { | 
|                 var lineWidth = style.lineWidth; | 
|                 var lineScale = style.strokeNoScale ? this.getLineScale() : 1; | 
|                 if (lineScale > 1e-10) { | 
|                     if (!this.hasFill()) { | 
|                         lineWidth = Math.max(lineWidth, this.strokeContainThreshold); | 
|                     } | 
|                     if (pathContain.containStroke(pathProxy, lineWidth / lineScale, x, y)) { | 
|                         return true; | 
|                     } | 
|                 } | 
|             } | 
|             if (this.hasFill()) { | 
|                 return pathContain.contain(pathProxy, x, y); | 
|             } | 
|         } | 
|         return false; | 
|     }; | 
|     Path.prototype.dirtyShape = function () { | 
|         this.__dirty |= SHAPE_CHANGED_BIT; | 
|         if (this._rect) { | 
|             this._rect = null; | 
|         } | 
|         if (this._decalEl) { | 
|             this._decalEl.dirtyShape(); | 
|         } | 
|         this.markRedraw(); | 
|     }; | 
|     Path.prototype.dirty = function () { | 
|         this.dirtyStyle(); | 
|         this.dirtyShape(); | 
|     }; | 
|     Path.prototype.animateShape = function (loop) { | 
|         return this.animate('shape', loop); | 
|     }; | 
|     Path.prototype.updateDuringAnimation = function (targetKey) { | 
|         if (targetKey === 'style') { | 
|             this.dirtyStyle(); | 
|         } | 
|         else if (targetKey === 'shape') { | 
|             this.dirtyShape(); | 
|         } | 
|         else { | 
|             this.markRedraw(); | 
|         } | 
|     }; | 
|     Path.prototype.attrKV = function (key, value) { | 
|         if (key === 'shape') { | 
|             this.setShape(value); | 
|         } | 
|         else { | 
|             _super.prototype.attrKV.call(this, key, value); | 
|         } | 
|     }; | 
|     Path.prototype.setShape = function (keyOrObj, value) { | 
|         var shape = this.shape; | 
|         if (!shape) { | 
|             shape = this.shape = {}; | 
|         } | 
|         if (typeof keyOrObj === 'string') { | 
|             shape[keyOrObj] = value; | 
|         } | 
|         else { | 
|             extend(shape, keyOrObj); | 
|         } | 
|         this.dirtyShape(); | 
|         return this; | 
|     }; | 
|     Path.prototype.shapeChanged = function () { | 
|         return !!(this.__dirty & SHAPE_CHANGED_BIT); | 
|     }; | 
|     Path.prototype.createStyle = function (obj) { | 
|         return createObject(DEFAULT_PATH_STYLE, obj); | 
|     }; | 
|     Path.prototype._innerSaveToNormal = function (toState) { | 
|         _super.prototype._innerSaveToNormal.call(this, toState); | 
|         var normalState = this._normalState; | 
|         if (toState.shape && !normalState.shape) { | 
|             normalState.shape = extend({}, this.shape); | 
|         } | 
|     }; | 
|     Path.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { | 
|         _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg); | 
|         var needsRestoreToNormal = !(state && keepCurrentStates); | 
|         var targetShape; | 
|         if (state && state.shape) { | 
|             if (transition) { | 
|                 if (keepCurrentStates) { | 
|                     targetShape = state.shape; | 
|                 } | 
|                 else { | 
|                     targetShape = extend({}, normalState.shape); | 
|                     extend(targetShape, state.shape); | 
|                 } | 
|             } | 
|             else { | 
|                 targetShape = extend({}, keepCurrentStates ? this.shape : normalState.shape); | 
|                 extend(targetShape, state.shape); | 
|             } | 
|         } | 
|         else if (needsRestoreToNormal) { | 
|             targetShape = normalState.shape; | 
|         } | 
|         if (targetShape) { | 
|             if (transition) { | 
|                 this.shape = extend({}, this.shape); | 
|                 var targetShapePrimaryProps = {}; | 
|                 var shapeKeys = keys(targetShape); | 
|                 for (var i = 0; i < shapeKeys.length; i++) { | 
|                     var key = shapeKeys[i]; | 
|                     if (typeof targetShape[key] === 'object') { | 
|                         this.shape[key] = targetShape[key]; | 
|                     } | 
|                     else { | 
|                         targetShapePrimaryProps[key] = targetShape[key]; | 
|                     } | 
|                 } | 
|                 this._transitionState(stateName, { | 
|                     shape: targetShapePrimaryProps | 
|                 }, animationCfg); | 
|             } | 
|             else { | 
|                 this.shape = targetShape; | 
|                 this.dirtyShape(); | 
|             } | 
|         } | 
|     }; | 
|     Path.prototype._mergeStates = function (states) { | 
|         var mergedState = _super.prototype._mergeStates.call(this, states); | 
|         var mergedShape; | 
|         for (var i = 0; i < states.length; i++) { | 
|             var state = states[i]; | 
|             if (state.shape) { | 
|                 mergedShape = mergedShape || {}; | 
|                 this._mergeStyle(mergedShape, state.shape); | 
|             } | 
|         } | 
|         if (mergedShape) { | 
|             mergedState.shape = mergedShape; | 
|         } | 
|         return mergedState; | 
|     }; | 
|     Path.prototype.getAnimationStyleProps = function () { | 
|         return DEFAULT_PATH_ANIMATION_PROPS; | 
|     }; | 
|     Path.prototype.isZeroArea = function () { | 
|         return false; | 
|     }; | 
|     Path.extend = function (defaultProps) { | 
|         var Sub = (function (_super) { | 
|             __extends(Sub, _super); | 
|             function Sub(opts) { | 
|                 var _this = _super.call(this, opts) || this; | 
|                 defaultProps.init && defaultProps.init.call(_this, opts); | 
|                 return _this; | 
|             } | 
|             Sub.prototype.getDefaultStyle = function () { | 
|                 return clone(defaultProps.style); | 
|             }; | 
|             Sub.prototype.getDefaultShape = function () { | 
|                 return clone(defaultProps.shape); | 
|             }; | 
|             return Sub; | 
|         }(Path)); | 
|         for (var key in defaultProps) { | 
|             if (typeof defaultProps[key] === 'function') { | 
|                 Sub.prototype[key] = defaultProps[key]; | 
|             } | 
|         } | 
|         return Sub; | 
|     }; | 
|     Path.initDefaultProps = (function () { | 
|         var pathProto = Path.prototype; | 
|         pathProto.type = 'path'; | 
|         pathProto.strokeContainThreshold = 5; | 
|         pathProto.segmentIgnoreThreshold = 0; | 
|         pathProto.subPixelOptimize = false; | 
|         pathProto.autoBatch = false; | 
|         pathProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT | SHAPE_CHANGED_BIT; | 
|     })(); | 
|     return Path; | 
| }(Displayable)); | 
| export default Path; |