| /* | 
 | * 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 {extend, isFunction, keys} from 'zrender/src/core/util'; | 
 | import { | 
 |     StageHandler, | 
 |     SeriesOption, | 
 |     SymbolOptionMixin, | 
 |     SymbolCallback, | 
 |     CallbackDataParams | 
 | } from '../util/types'; | 
 | import SeriesData from '../data/SeriesData'; | 
 | import SeriesModel from '../model/Series'; | 
 | import GlobalModel from '../model/Global'; | 
 |  | 
 | const SYMBOL_PROPS_WITH_CB = [ | 
 |     'symbol', 'symbolSize', 'symbolRotate', 'symbolOffset' | 
 | ] as const; | 
 | const SYMBOL_PROPS: [...typeof SYMBOL_PROPS_WITH_CB, 'symbolKeepAspect'] = SYMBOL_PROPS_WITH_CB.concat([ | 
 |     'symbolKeepAspect' | 
 | ] as any) as any; | 
 | // Encoding visual for all series include which is filtered for legend drawing | 
 | const seriesSymbolTask: StageHandler = { | 
 |  | 
 |     createOnAllSeries: true, | 
 |  | 
 |     // For legend. | 
 |     performRawSeries: true, | 
 |  | 
 |     reset: function ( | 
 |         seriesModel: SeriesModel<SeriesOption & SymbolOptionMixin<CallbackDataParams>>, | 
 |         ecModel: GlobalModel | 
 |     ) { | 
 |         const data = seriesModel.getData(); | 
 |  | 
 |         if (seriesModel.legendIcon) { | 
 |             data.setVisual('legendIcon', seriesModel.legendIcon); | 
 |         } | 
 |  | 
 |         if (!seriesModel.hasSymbolVisual) { | 
 |             return; | 
 |         } | 
 |  | 
 |         const symbolOptions = {} as Record<(typeof SYMBOL_PROPS_WITH_CB)[number], any>; | 
 |         const symbolOptionsCb = {} as Record<(typeof SYMBOL_PROPS_WITH_CB)[number], any>; | 
 |         let hasCallback = false; | 
 |         for (let i = 0; i < SYMBOL_PROPS_WITH_CB.length; i++) { | 
 |             const symbolPropName = SYMBOL_PROPS_WITH_CB[i]; | 
 |             const val = seriesModel.get(symbolPropName); | 
 |             if (isFunction(val)) { | 
 |                 hasCallback = true; | 
 |                 symbolOptionsCb[symbolPropName] = val; | 
 |             } | 
 |             else { | 
 |                 symbolOptions[symbolPropName] = val; | 
 |             } | 
 |         } | 
 |         symbolOptions.symbol = symbolOptions.symbol || seriesModel.defaultSymbol; | 
 |  | 
 |         data.setVisual(extend({ | 
 |             legendIcon: seriesModel.legendIcon || symbolOptions.symbol, | 
 |             symbolKeepAspect: seriesModel.get('symbolKeepAspect') | 
 |         }, symbolOptions)); | 
 |  | 
 |         // Only visible series has each data be visual encoded | 
 |         if (ecModel.isSeriesFiltered(seriesModel)) { | 
 |             return; | 
 |         } | 
 |  | 
 |         const symbolPropsCb = keys(symbolOptionsCb); | 
 |  | 
 |         function dataEach(data: SeriesData, idx: number) { | 
 |             const rawValue = seriesModel.getRawValue(idx); | 
 |             const params = seriesModel.getDataParams(idx); | 
 |  | 
 |             for (let i = 0; i < symbolPropsCb.length; i++) { | 
 |                 const symbolPropName = symbolPropsCb[i]; | 
 |                 data.setItemVisual( | 
 |                     idx, symbolPropName, | 
 |                     (symbolOptionsCb[symbolPropName] as SymbolCallback<CallbackDataParams>)(rawValue, params) | 
 |                 ); | 
 |             } | 
 |         } | 
 |  | 
 |         return { dataEach: hasCallback ? dataEach : null }; | 
 |     } | 
 | }; | 
 |  | 
 | const dataSymbolTask: StageHandler = { | 
 |  | 
 |     createOnAllSeries: true, | 
 |  | 
 |     // For legend. | 
 |     performRawSeries: true, | 
 |  | 
 |     reset: function ( | 
 |         seriesModel: SeriesModel<SeriesOption & SymbolOptionMixin<CallbackDataParams>>, | 
 |         ecModel: GlobalModel | 
 |     ) { | 
 |         if (!seriesModel.hasSymbolVisual) { | 
 |             return; | 
 |         } | 
 |         // Only visible series has each data be visual encoded | 
 |         if (ecModel.isSeriesFiltered(seriesModel)) { | 
 |             return; | 
 |         } | 
 |  | 
 |         const data = seriesModel.getData(); | 
 |  | 
 |         function dataEach(data: SeriesData, idx: number) { | 
 |             const itemModel = data.getItemModel<SymbolOptionMixin>(idx); | 
 |  | 
 |             for (let i = 0; i < SYMBOL_PROPS.length; i++) { | 
 |                 const symbolPropName = SYMBOL_PROPS[i]; | 
 |                 const val = itemModel.getShallow(symbolPropName, true); | 
 |                 if (val != null) { | 
 |                     data.setItemVisual(idx, symbolPropName, val); | 
 |                 } | 
 |             } | 
 |         } | 
 |  | 
 |         return { dataEach: data.hasItemOption ? dataEach : null }; | 
 |     } | 
 | }; | 
 |  | 
 | export {seriesSymbolTask, dataSymbolTask}; |