| /* | 
 | * 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 GlobalModel from '../model/Global'; | 
 | import {ParsedModelFinder} from '../util/model'; | 
 | import ExtensionAPI from '../core/ExtensionAPI'; | 
 | import { DimensionDefinitionLoose, ScaleDataValue, DimensionName } from '../util/types'; | 
 | import Axis from './Axis'; | 
 | import { BoundingRect } from '../util/graphic'; | 
 | import { MatrixArray } from 'zrender/src/core/matrix'; | 
 | import ComponentModel from '../model/Component'; | 
 | import { RectLike } from 'zrender/src/core/BoundingRect'; | 
 | import type { PrepareCustomInfo } from '../chart/custom/CustomSeries'; | 
 |  | 
 |  | 
 | export interface CoordinateSystemCreator { | 
 |  | 
 |     create: (ecModel: GlobalModel, api: ExtensionAPI) => CoordinateSystemMaster[]; | 
 |  | 
 |     // FIXME current dimensions must be string[]. | 
 |     // check and unify the definition. | 
 |     // FIXME:TS check where used (seams only HeatmapSeries used?) | 
 |     // Some coordinate system do not have static dimensions (like parallel) | 
 |     dimensions?: DimensionName[]; | 
 |  | 
 |     // dimensionsInfo like [{name: ..., type: ...}, 'xxx', ...] | 
 |     getDimensionsInfo?: () => DimensionDefinitionLoose[]; | 
 | } | 
 |  | 
 | /** | 
 |  * The instance get from `CoordinateSystemManger` is `CoordinateSystemMaster`. | 
 |  */ | 
 | export interface CoordinateSystemMaster { | 
 |  | 
 |     // FIXME current dimensions must be string[]. | 
 |     // check and unify the definition. | 
 |     // Should be the same as its coordinateSystemCreator. | 
 |     dimensions: DimensionName[]; | 
 |  | 
 |     model?: ComponentModel; | 
 |  | 
 |     update?: (ecModel: GlobalModel, api: ExtensionAPI) => void; | 
 |  | 
 |     // This methods is also responsible for determining whether this | 
 |     // coordinate system is applicable to the given `finder`. | 
 |     // Each coordinate system will be tried, until one returns non- | 
 |     // null/undefined value. | 
 |     convertToPixel?( | 
 |         ecModel: GlobalModel, finder: ParsedModelFinder, value: ScaleDataValue | ScaleDataValue[] | 
 |     ): number | number[]; | 
 |  | 
 |     // This methods is also responsible for determining whether this | 
 |     // coordinate system is applicable to the given `finder`. | 
 |     // Each coordinate system will be tried, until one returns non- | 
 |     // null/undefined value. | 
 |     convertFromPixel?( | 
 |         ecModel: GlobalModel, finder: ParsedModelFinder, pixelValue: number | number[] | 
 |     ): number | number[]; | 
 |  | 
 |     // @param point Point in global pixel coordinate system. | 
 |     // The signature of this method should be the same as `CoordinateSystemExecutive` | 
 |     containPoint(point: number[]): boolean; | 
 |  | 
 |     // Must be implemented when `axisPointerEnabled` is `true`. | 
 |     getAxes?: () => Axis[]; | 
 |  | 
 |     axisPointerEnabled?: boolean; | 
 |  | 
 |     getTooltipAxes?: (dim: DimensionName | 'auto') => {baseAxes: Axis[], otherAxes: Axis[]}; | 
 |  | 
 |     /** | 
 |      * Get layout rect or coordinate system | 
 |      */ | 
 |     getRect?: () => RectLike | 
 |  | 
 | } | 
 |  | 
 | /** | 
 |  * For example: cartesian is CoordinateSystem. | 
 |  * series.coordinateSystem is CoordinateSystem. | 
 |  */ | 
 | export interface CoordinateSystem { | 
 |  | 
 |     type: string | 
 |  | 
 |     /** | 
 |      * Master of coordinate system. For example: | 
 |      * Grid is master of cartesian. | 
 |      */ | 
 |     master?: CoordinateSystemMaster | 
 |  | 
 |     // Should be the same as its coordinateSystemCreator. | 
 |     dimensions: DimensionName[]; | 
 |  | 
 |     model?: ComponentModel; | 
 |  | 
 |     /** | 
 |      * @param data | 
 |      * @param reserved Defined by the coordinate system itself | 
 |      * @param out | 
 |      * @return {Array.<number>} point Point in global pixel coordinate system. | 
 |      */ | 
 |     dataToPoint( | 
 |         data: ScaleDataValue | ScaleDataValue[], | 
 |         reserved?: any, | 
 |         out?: number[] | 
 |     ): number[]; | 
 |  | 
 |     /** | 
 |      * Some coord sys (like Parallel) might do not have `pointToData`, | 
 |      * or the meaning of this kind of features is not clear yet. | 
 |      * @param point point Point in global pixel coordinate system. | 
 |      * @param clamp Clamp range | 
 |      * @return data | 
 |      */ | 
 |     pointToData?( | 
 |         point: number[], | 
 |         clamp?: boolean | 
 |     ): number | number[]; | 
 |  | 
 |     // @param point Point in global pixel coordinate system. | 
 |     containPoint(point: number[]): boolean; | 
 |  | 
 |     getAxes?: () => Axis[]; | 
 |  | 
 |     getAxis?: (dim?: DimensionName) => Axis; | 
 |  | 
 |     getBaseAxis?: () => Axis; | 
 |  | 
 |     getOtherAxis?: (baseAxis: Axis) => Axis; | 
 |  | 
 |     clampData?: (data: ScaleDataValue[], out?: number[]) => number[]; | 
 |  | 
 |     getRoamTransform?: () => MatrixArray; | 
 |  | 
 |     getArea?: () => CoordinateSystemClipArea | 
 |  | 
 |     // Only `coord/View.js` implements `getBoundingRect`. | 
 |     // But if other coord sys implement it, should follow this signature. | 
 |     getBoundingRect?: () => BoundingRect; | 
 |  | 
 |     // Currently only Cartesian2D implements it. | 
 |     // But if other coordinate systems implement it, should follow this signature. | 
 |     getAxesByScale?: (scaleType: string) => Axis[]; | 
 |  | 
 |     prepareCustoms?: PrepareCustomInfo; | 
 | } | 
 |  | 
 | /** | 
 |  * Like GridModel, PolarModel, ... | 
 |  */ | 
 | export interface CoordinateSystemHostModel extends ComponentModel { | 
 |     coordinateSystem?: CoordinateSystemMaster | 
 | } | 
 |  | 
 | /** | 
 |  * Clip area will be returned by getArea of CoordinateSystem. | 
 |  * It is used to clip the graphic elements with the contain methods. | 
 |  */ | 
 | export interface CoordinateSystemClipArea { | 
 |     contain(x: number, y: number): boolean | 
 | } | 
 |  | 
 | export function isCoordinateSystemType<T extends CoordinateSystem, S = T['type']>( | 
 |     coordSys: CoordinateSystem, type: S | 
 | ): coordSys is T { | 
 |     return (coordSys.type as unknown as S) === type; | 
 | } |