|   | 
| /* | 
| * 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 Optimize on polar | 
| import * as colorUtil from 'zrender/lib/tool/color.js'; | 
| import SeriesData from '../../data/SeriesData.js'; | 
| import * as numberUtil from '../../util/number.js'; | 
| import * as graphic from '../../util/graphic.js'; | 
| import { toggleHoverEmphasis, setStatesStylesFromModel } from '../../util/states.js'; | 
| import * as markerHelper from './markerHelper.js'; | 
| import MarkerView from './MarkerView.js'; | 
| import { retrieve, mergeAll, map, curry, filter, extend, isString } from 'zrender/lib/core/util.js'; | 
| import { isCoordinateSystemType } from '../../coord/CoordinateSystem.js'; | 
| import MarkerModel from './MarkerModel.js'; | 
| import { makeInner } from '../../util/model.js'; | 
| import { getVisualFromData } from '../../visual/helper.js'; | 
| import { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js'; | 
| import { getECData } from '../../util/innerStore.js'; | 
| import { parseDataValue } from '../../data/helper/dataValueHelper.js'; | 
| var inner = makeInner(); | 
| var markAreaTransform = function (seriesModel, coordSys, maModel, item) { | 
|   // item may be null | 
|   var item0 = item[0]; | 
|   var item1 = item[1]; | 
|   if (!item0 || !item1) { | 
|     return; | 
|   } | 
|   var lt = markerHelper.dataTransform(seriesModel, item0); | 
|   var rb = markerHelper.dataTransform(seriesModel, item1); | 
|   // FIXME make sure lt is less than rb | 
|   var ltCoord = lt.coord; | 
|   var rbCoord = rb.coord; | 
|   ltCoord[0] = retrieve(ltCoord[0], -Infinity); | 
|   ltCoord[1] = retrieve(ltCoord[1], -Infinity); | 
|   rbCoord[0] = retrieve(rbCoord[0], Infinity); | 
|   rbCoord[1] = retrieve(rbCoord[1], Infinity); | 
|   // Merge option into one | 
|   var result = mergeAll([{}, lt, rb]); | 
|   result.coord = [lt.coord, rb.coord]; | 
|   result.x0 = lt.x; | 
|   result.y0 = lt.y; | 
|   result.x1 = rb.x; | 
|   result.y1 = rb.y; | 
|   return result; | 
| }; | 
| function isInfinity(val) { | 
|   return !isNaN(val) && !isFinite(val); | 
| } | 
| // If a markArea has one dim | 
| function ifMarkAreaHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { | 
|   var otherDimIndex = 1 - dimIndex; | 
|   return isInfinity(fromCoord[otherDimIndex]) && isInfinity(toCoord[otherDimIndex]); | 
| } | 
| function markAreaFilter(coordSys, item) { | 
|   var fromCoord = item.coord[0]; | 
|   var toCoord = item.coord[1]; | 
|   var item0 = { | 
|     coord: fromCoord, | 
|     x: item.x0, | 
|     y: item.y0 | 
|   }; | 
|   var item1 = { | 
|     coord: toCoord, | 
|     x: item.x1, | 
|     y: item.y1 | 
|   }; | 
|   if (isCoordinateSystemType(coordSys, 'cartesian2d')) { | 
|     // In case | 
|     // { | 
|     //  markArea: { | 
|     //    data: [{ yAxis: 2 }] | 
|     //  } | 
|     // } | 
|     if (fromCoord && toCoord && (ifMarkAreaHasOnlyDim(1, fromCoord, toCoord, coordSys) || ifMarkAreaHasOnlyDim(0, fromCoord, toCoord, coordSys))) { | 
|       return true; | 
|     } | 
|     // Directly returning true may also do the work, | 
|     // because markArea will not be shown automatically | 
|     // when it's not included in coordinate system. | 
|     // But filtering ahead can avoid keeping rendering markArea | 
|     // when there are too many of them. | 
|     return markerHelper.zoneFilter(coordSys, item0, item1); | 
|   } | 
|   return markerHelper.dataFilter(coordSys, item0) || markerHelper.dataFilter(coordSys, item1); | 
| } | 
| // dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0'] | 
| function getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) { | 
|   var coordSys = seriesModel.coordinateSystem; | 
|   var itemModel = data.getItemModel(idx); | 
|   var point; | 
|   var xPx = numberUtil.parsePercent(itemModel.get(dims[0]), api.getWidth()); | 
|   var yPx = numberUtil.parsePercent(itemModel.get(dims[1]), api.getHeight()); | 
|   if (!isNaN(xPx) && !isNaN(yPx)) { | 
|     point = [xPx, yPx]; | 
|   } else { | 
|     // Chart like bar may have there own marker positioning logic | 
|     if (seriesModel.getMarkerPosition) { | 
|       // Consider the case that user input the right-bottom point first | 
|       // Pick the larger x and y as 'x1' and 'y1' | 
|       var pointValue0 = data.getValues(['x0', 'y0'], idx); | 
|       var pointValue1 = data.getValues(['x1', 'y1'], idx); | 
|       var clampPointValue0 = coordSys.clampData(pointValue0); | 
|       var clampPointValue1 = coordSys.clampData(pointValue1); | 
|       var pointValue = []; | 
|       if (dims[0] === 'x0') { | 
|         pointValue[0] = clampPointValue0[0] > clampPointValue1[0] ? pointValue1[0] : pointValue0[0]; | 
|       } else { | 
|         pointValue[0] = clampPointValue0[0] > clampPointValue1[0] ? pointValue0[0] : pointValue1[0]; | 
|       } | 
|       if (dims[1] === 'y0') { | 
|         pointValue[1] = clampPointValue0[1] > clampPointValue1[1] ? pointValue1[1] : pointValue0[1]; | 
|       } else { | 
|         pointValue[1] = clampPointValue0[1] > clampPointValue1[1] ? pointValue0[1] : pointValue1[1]; | 
|       } | 
|       // Use the getMarkerPosition | 
|       point = seriesModel.getMarkerPosition(pointValue, dims, true); | 
|     } else { | 
|       var x = data.get(dims[0], idx); | 
|       var y = data.get(dims[1], idx); | 
|       var pt = [x, y]; | 
|       coordSys.clampData && coordSys.clampData(pt, pt); | 
|       point = coordSys.dataToPoint(pt, true); | 
|     } | 
|     if (isCoordinateSystemType(coordSys, 'cartesian2d')) { | 
|       // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug | 
|       var xAxis = coordSys.getAxis('x'); | 
|       var yAxis = coordSys.getAxis('y'); | 
|       var x = data.get(dims[0], idx); | 
|       var y = data.get(dims[1], idx); | 
|       if (isInfinity(x)) { | 
|         point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]); | 
|       } else if (isInfinity(y)) { | 
|         point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]); | 
|       } | 
|     } | 
|     // Use x, y if has any | 
|     if (!isNaN(xPx)) { | 
|       point[0] = xPx; | 
|     } | 
|     if (!isNaN(yPx)) { | 
|       point[1] = yPx; | 
|     } | 
|   } | 
|   return point; | 
| } | 
| export var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']]; | 
| var MarkAreaView = /** @class */function (_super) { | 
|   __extends(MarkAreaView, _super); | 
|   function MarkAreaView() { | 
|     var _this = _super !== null && _super.apply(this, arguments) || this; | 
|     _this.type = MarkAreaView.type; | 
|     return _this; | 
|   } | 
|   MarkAreaView.prototype.updateTransform = function (markAreaModel, ecModel, api) { | 
|     ecModel.eachSeries(function (seriesModel) { | 
|       var maModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markArea'); | 
|       if (maModel) { | 
|         var areaData_1 = maModel.getData(); | 
|         areaData_1.each(function (idx) { | 
|           var points = map(dimPermutations, function (dim) { | 
|             return getSingleMarkerEndPoint(areaData_1, idx, dim, seriesModel, api); | 
|           }); | 
|           // Layout | 
|           areaData_1.setItemLayout(idx, points); | 
|           var el = areaData_1.getItemGraphicEl(idx); | 
|           el.setShape('points', points); | 
|         }); | 
|       } | 
|     }, this); | 
|   }; | 
|   MarkAreaView.prototype.renderSeries = function (seriesModel, maModel, ecModel, api) { | 
|     var coordSys = seriesModel.coordinateSystem; | 
|     var seriesId = seriesModel.id; | 
|     var seriesData = seriesModel.getData(); | 
|     var areaGroupMap = this.markerGroupMap; | 
|     var polygonGroup = areaGroupMap.get(seriesId) || areaGroupMap.set(seriesId, { | 
|       group: new graphic.Group() | 
|     }); | 
|     this.group.add(polygonGroup.group); | 
|     this.markKeep(polygonGroup); | 
|     var areaData = createList(coordSys, seriesModel, maModel); | 
|     // Line data for tooltip and formatter | 
|     maModel.setData(areaData); | 
|     // Update visual and layout of line | 
|     areaData.each(function (idx) { | 
|       // Layout | 
|       var points = map(dimPermutations, function (dim) { | 
|         return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api); | 
|       }); | 
|       var xAxisScale = coordSys.getAxis('x').scale; | 
|       var yAxisScale = coordSys.getAxis('y').scale; | 
|       var xAxisExtent = xAxisScale.getExtent(); | 
|       var yAxisExtent = yAxisScale.getExtent(); | 
|       var xPointExtent = [xAxisScale.parse(areaData.get('x0', idx)), xAxisScale.parse(areaData.get('x1', idx))]; | 
|       var yPointExtent = [yAxisScale.parse(areaData.get('y0', idx)), yAxisScale.parse(areaData.get('y1', idx))]; | 
|       numberUtil.asc(xPointExtent); | 
|       numberUtil.asc(yPointExtent); | 
|       var overlapped = !(xAxisExtent[0] > xPointExtent[1] || xAxisExtent[1] < xPointExtent[0] || yAxisExtent[0] > yPointExtent[1] || yAxisExtent[1] < yPointExtent[0]); | 
|       // If none of the area is inside coordSys, allClipped is set to be true | 
|       // in layout so that label will not be displayed. See #12591 | 
|       var allClipped = !overlapped; | 
|       areaData.setItemLayout(idx, { | 
|         points: points, | 
|         allClipped: allClipped | 
|       }); | 
|       var style = areaData.getItemModel(idx).getModel('itemStyle').getItemStyle(); | 
|       var color = getVisualFromData(seriesData, 'color'); | 
|       if (!style.fill) { | 
|         style.fill = color; | 
|         if (isString(style.fill)) { | 
|           style.fill = colorUtil.modifyAlpha(style.fill, 0.4); | 
|         } | 
|       } | 
|       if (!style.stroke) { | 
|         style.stroke = color; | 
|       } | 
|       // Visual | 
|       areaData.setItemVisual(idx, 'style', style); | 
|     }); | 
|     areaData.diff(inner(polygonGroup).data).add(function (idx) { | 
|       var layout = areaData.getItemLayout(idx); | 
|       if (!layout.allClipped) { | 
|         var polygon = new graphic.Polygon({ | 
|           shape: { | 
|             points: layout.points | 
|           } | 
|         }); | 
|         areaData.setItemGraphicEl(idx, polygon); | 
|         polygonGroup.group.add(polygon); | 
|       } | 
|     }).update(function (newIdx, oldIdx) { | 
|       var polygon = inner(polygonGroup).data.getItemGraphicEl(oldIdx); | 
|       var layout = areaData.getItemLayout(newIdx); | 
|       if (!layout.allClipped) { | 
|         if (polygon) { | 
|           graphic.updateProps(polygon, { | 
|             shape: { | 
|               points: layout.points | 
|             } | 
|           }, maModel, newIdx); | 
|         } else { | 
|           polygon = new graphic.Polygon({ | 
|             shape: { | 
|               points: layout.points | 
|             } | 
|           }); | 
|         } | 
|         areaData.setItemGraphicEl(newIdx, polygon); | 
|         polygonGroup.group.add(polygon); | 
|       } else if (polygon) { | 
|         polygonGroup.group.remove(polygon); | 
|       } | 
|     }).remove(function (idx) { | 
|       var polygon = inner(polygonGroup).data.getItemGraphicEl(idx); | 
|       polygonGroup.group.remove(polygon); | 
|     }).execute(); | 
|     areaData.eachItemGraphicEl(function (polygon, idx) { | 
|       var itemModel = areaData.getItemModel(idx); | 
|       var style = areaData.getItemVisual(idx, 'style'); | 
|       polygon.useStyle(areaData.getItemVisual(idx, 'style')); | 
|       setLabelStyle(polygon, getLabelStatesModels(itemModel), { | 
|         labelFetcher: maModel, | 
|         labelDataIndex: idx, | 
|         defaultText: areaData.getName(idx) || '', | 
|         inheritColor: isString(style.fill) ? colorUtil.modifyAlpha(style.fill, 1) : '#000' | 
|       }); | 
|       setStatesStylesFromModel(polygon, itemModel); | 
|       toggleHoverEmphasis(polygon, null, null, itemModel.get(['emphasis', 'disabled'])); | 
|       getECData(polygon).dataModel = maModel; | 
|     }); | 
|     inner(polygonGroup).data = areaData; | 
|     polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent'); | 
|   }; | 
|   MarkAreaView.type = 'markArea'; | 
|   return MarkAreaView; | 
| }(MarkerView); | 
| function createList(coordSys, seriesModel, maModel) { | 
|   var areaData; | 
|   var dataDims; | 
|   var dims = ['x0', 'y0', 'x1', 'y1']; | 
|   if (coordSys) { | 
|     var coordDimsInfos_1 = map(coordSys && coordSys.dimensions, function (coordDim) { | 
|       var data = seriesModel.getData(); | 
|       var info = data.getDimensionInfo(data.mapDimension(coordDim)) || {}; | 
|       // In map series data don't have lng and lat dimension. Fallback to same with coordSys | 
|       return extend(extend({}, info), { | 
|         name: coordDim, | 
|         // DON'T use ordinalMeta to parse and collect ordinal. | 
|         ordinalMeta: null | 
|       }); | 
|     }); | 
|     dataDims = map(dims, function (dim, idx) { | 
|       return { | 
|         name: dim, | 
|         type: coordDimsInfos_1[idx % 2].type | 
|       }; | 
|     }); | 
|     areaData = new SeriesData(dataDims, maModel); | 
|   } else { | 
|     dataDims = [{ | 
|       name: 'value', | 
|       type: 'float' | 
|     }]; | 
|     areaData = new SeriesData(dataDims, maModel); | 
|   } | 
|   var optData = map(maModel.get('data'), curry(markAreaTransform, seriesModel, coordSys, maModel)); | 
|   if (coordSys) { | 
|     optData = filter(optData, curry(markAreaFilter, coordSys)); | 
|   } | 
|   var dimValueGetter = coordSys ? function (item, dimName, dataIndex, dimIndex) { | 
|     // TODO should convert to ParsedValue? | 
|     var rawVal = item.coord[Math.floor(dimIndex / 2)][dimIndex % 2]; | 
|     return parseDataValue(rawVal, dataDims[dimIndex]); | 
|   } : function (item, dimName, dataIndex, dimIndex) { | 
|     return parseDataValue(item.value, dataDims[dimIndex]); | 
|   }; | 
|   areaData.initData(optData, null, dimValueGetter); | 
|   areaData.hasItemOption = true; | 
|   return areaData; | 
| } | 
| export default MarkAreaView; |