| /* |
| * 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 * as graphic from '../../util/graphic'; |
| import {round} from '../../util/number'; |
| import SeriesModel from '../../model/Series'; |
| import { SeriesOption } from '../../util/types'; |
| import type Cartesian2D from '../../coord/cartesian/Cartesian2D'; |
| import type Polar from '../../coord/polar/Polar'; |
| import { CoordinateSystem } from '../../coord/CoordinateSystem'; |
| import { isFunction } from 'zrender/src/core/util'; |
| |
| type SeriesModelWithLineWidth = SeriesModel<SeriesOption & { |
| lineStyle?: { width?: number } |
| }>; |
| function createGridClipPath( |
| cartesian: Cartesian2D, |
| hasAnimation: boolean, |
| seriesModel: SeriesModelWithLineWidth, |
| done?: () => void, |
| during?: (percent: number, clipRect: graphic.Rect) => void |
| ) { |
| const rect = cartesian.getArea(); |
| |
| let x = rect.x; |
| let y = rect.y; |
| let width = rect.width; |
| let height = rect.height; |
| |
| const lineWidth = seriesModel.get(['lineStyle', 'width']) || 2; |
| // Expand the clip path a bit to avoid the border is clipped and looks thinner |
| x -= lineWidth / 2; |
| y -= lineWidth / 2; |
| width += lineWidth; |
| height += lineWidth; |
| |
| // fix: https://github.com/apache/incubator-echarts/issues/11369 |
| x = Math.floor(x); |
| width = Math.round(width); |
| |
| const clipPath = new graphic.Rect({ |
| shape: { |
| x: x, |
| y: y, |
| width: width, |
| height: height |
| } |
| }); |
| |
| if (hasAnimation) { |
| const baseAxis = cartesian.getBaseAxis(); |
| const isHorizontal = baseAxis.isHorizontal(); |
| const isAxisInversed = baseAxis.inverse; |
| |
| if (isHorizontal) { |
| if (isAxisInversed) { |
| clipPath.shape.x += width; |
| } |
| clipPath.shape.width = 0; |
| } |
| else { |
| if (!isAxisInversed) { |
| clipPath.shape.y += height; |
| } |
| clipPath.shape.height = 0; |
| } |
| |
| const duringCb = isFunction(during) |
| ? (percent: number) => { |
| during(percent, clipPath); |
| } |
| : null; |
| |
| graphic.initProps(clipPath, { |
| shape: { |
| width: width, |
| height: height, |
| x: x, |
| y: y |
| } |
| }, seriesModel, null, done, duringCb); |
| } |
| |
| return clipPath; |
| } |
| |
| function createPolarClipPath( |
| polar: Polar, |
| hasAnimation: boolean, |
| seriesModel: SeriesModelWithLineWidth |
| ) { |
| const sectorArea = polar.getArea(); |
| // Avoid float number rounding error for symbol on the edge of axis extent. |
| |
| const r0 = round(sectorArea.r0, 1); |
| const r = round(sectorArea.r, 1); |
| const clipPath = new graphic.Sector({ |
| shape: { |
| cx: round(polar.cx, 1), |
| cy: round(polar.cy, 1), |
| r0: r0, |
| r: r, |
| startAngle: sectorArea.startAngle, |
| endAngle: sectorArea.endAngle, |
| clockwise: sectorArea.clockwise |
| } |
| }); |
| |
| if (hasAnimation) { |
| const isRadial = polar.getBaseAxis().dim === 'angle'; |
| |
| if (isRadial) { |
| clipPath.shape.endAngle = sectorArea.startAngle; |
| } |
| else { |
| clipPath.shape.r = r0; |
| } |
| |
| graphic.initProps(clipPath, { |
| shape: { |
| endAngle: sectorArea.endAngle, |
| r: r |
| } |
| }, seriesModel); |
| } |
| return clipPath; |
| } |
| |
| function createClipPath( |
| coordSys: CoordinateSystem, |
| hasAnimation: boolean, |
| seriesModel: SeriesModelWithLineWidth, |
| done?: () => void, |
| during?: (percent: number) => void |
| ) { |
| if (!coordSys) { |
| return null; |
| } |
| else if (coordSys.type === 'polar') { |
| return createPolarClipPath(coordSys as Polar, hasAnimation, seriesModel); |
| } |
| else if (coordSys.type === 'cartesian2d') { |
| return createGridClipPath(coordSys as Cartesian2D, hasAnimation, seriesModel, done, during); |
| } |
| return null; |
| } |
| |
| export { |
| createGridClipPath, |
| createPolarClipPath, |
| createClipPath |
| }; |