|  | /* | 
|  | * 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 {isDimensionStacked} from '../../data/helper/dataStackHelper'; | 
|  | import {isNumber, map} from 'zrender/src/core/util'; | 
|  | import type Polar from '../../coord/polar/Polar'; | 
|  | import type Cartesian2D from '../../coord/cartesian/Cartesian2D'; | 
|  | import SeriesData from '../../data/SeriesData'; | 
|  | import Axis from '../../coord/Axis'; | 
|  | import type { LineSeriesOption } from './LineSeries'; | 
|  |  | 
|  | interface CoordInfo { | 
|  | dataDimsForPoint: string[] | 
|  | valueStart: number | 
|  | valueAxisDim: string | 
|  | baseAxisDim: string | 
|  | stacked: boolean | 
|  | valueDim: string | 
|  | baseDim: string | 
|  | baseDataOffset: number | 
|  | stackedOverDimension: string | 
|  | } | 
|  |  | 
|  | export function prepareDataCoordInfo( | 
|  | coordSys: Cartesian2D | Polar, | 
|  | data: SeriesData, | 
|  | valueOrigin?: LineSeriesOption['areaStyle']['origin'] | 
|  | ): CoordInfo { | 
|  | const baseAxis = coordSys.getBaseAxis(); | 
|  | const valueAxis = coordSys.getOtherAxis(baseAxis as any); | 
|  | const valueStart = getValueStart(valueAxis, valueOrigin); | 
|  |  | 
|  | const baseAxisDim = baseAxis.dim; | 
|  | const valueAxisDim = valueAxis.dim; | 
|  | const valueDim = data.mapDimension(valueAxisDim); | 
|  | const baseDim = data.mapDimension(baseAxisDim); | 
|  | const baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; | 
|  |  | 
|  | const dims = map(coordSys.dimensions, function (coordDim) { | 
|  | return data.mapDimension(coordDim); | 
|  | }); | 
|  |  | 
|  | let stacked = false; | 
|  | const stackResultDim = data.getCalculationInfo('stackResultDimension'); | 
|  | if (isDimensionStacked(data, dims[0] /* , dims[1] */)) { // jshint ignore:line | 
|  | stacked = true; | 
|  | dims[0] = stackResultDim; | 
|  | } | 
|  | if (isDimensionStacked(data, dims[1] /* , dims[0] */)) { // jshint ignore:line | 
|  | stacked = true; | 
|  | dims[1] = stackResultDim; | 
|  | } | 
|  |  | 
|  | return { | 
|  | dataDimsForPoint: dims, | 
|  | valueStart: valueStart, | 
|  | valueAxisDim: valueAxisDim, | 
|  | baseAxisDim: baseAxisDim, | 
|  | stacked: !!stacked, | 
|  | valueDim: valueDim, | 
|  | baseDim: baseDim, | 
|  | baseDataOffset: baseDataOffset, | 
|  | stackedOverDimension: data.getCalculationInfo('stackedOverDimension') | 
|  | }; | 
|  | } | 
|  |  | 
|  | function getValueStart(valueAxis: Axis, valueOrigin: LineSeriesOption['areaStyle']['origin']) { | 
|  | let valueStart = 0; | 
|  | const extent = valueAxis.scale.getExtent(); | 
|  |  | 
|  | if (valueOrigin === 'start') { | 
|  | valueStart = extent[0]; | 
|  | } | 
|  | else if (valueOrigin === 'end') { | 
|  | valueStart = extent[1]; | 
|  | } | 
|  | // If origin is specified as a number, use it as | 
|  | // valueStart directly | 
|  | else if (isNumber(valueOrigin) && !isNaN(valueOrigin)) { | 
|  | valueStart = valueOrigin; | 
|  | } | 
|  | // auto | 
|  | else { | 
|  | // Both positive | 
|  | if (extent[0] > 0) { | 
|  | valueStart = extent[0]; | 
|  | } | 
|  | // Both negative | 
|  | else if (extent[1] < 0) { | 
|  | valueStart = extent[1]; | 
|  | } | 
|  | // If is one positive, and one negative, onZero shall be true | 
|  | } | 
|  |  | 
|  | return valueStart; | 
|  | } | 
|  |  | 
|  | export function getStackedOnPoint( | 
|  | dataCoordInfo: CoordInfo, | 
|  | coordSys: Cartesian2D | Polar, | 
|  | data: SeriesData, | 
|  | idx: number | 
|  | ) { | 
|  | let value = NaN; | 
|  | if (dataCoordInfo.stacked) { | 
|  | value = data.get(data.getCalculationInfo('stackedOverDimension'), idx) as number; | 
|  | } | 
|  | if (isNaN(value)) { | 
|  | value = dataCoordInfo.valueStart; | 
|  | } | 
|  |  | 
|  | const baseDataOffset = dataCoordInfo.baseDataOffset; | 
|  | const stackedData = []; | 
|  | stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx); | 
|  | stackedData[1 - baseDataOffset] = value; | 
|  |  | 
|  | return coordSys.dataToPoint(stackedData); | 
|  | } |