| /* | 
 | * 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 zrUtil from 'zrender/src/core/util'; | 
 | import * as visualSolution from '../../visual/visualSolution'; | 
 | import VisualMapping from '../../visual/VisualMapping'; | 
 | import VisualMapModel, { VisualMeta } from './VisualMapModel'; | 
 | import { StageHandlerProgressExecutor, BuiltinVisualProperty, ParsedValue, StageHandler } from '../../util/types'; | 
 | import SeriesModel from '../../model/Series'; | 
 | import { getVisualFromData } from '../../visual/helper'; | 
 |  | 
 | export const visualMapEncodingHandlers: StageHandler[] = [ | 
 |     { | 
 |         createOnAllSeries: true, | 
 |         reset: function (seriesModel, ecModel) { | 
 |             const resetDefines: StageHandlerProgressExecutor[] = []; | 
 |             ecModel.eachComponent('visualMap', function (visualMapModel: VisualMapModel) { | 
 |                 const pipelineContext = seriesModel.pipelineContext; | 
 |                 if (!visualMapModel.isTargetSeries(seriesModel) | 
 |                     || (pipelineContext && pipelineContext.large) | 
 |                 ) { | 
 |                     return; | 
 |                 } | 
 |  | 
 |                 resetDefines.push(visualSolution.incrementalApplyVisual( | 
 |                     visualMapModel.stateList, | 
 |                     visualMapModel.targetVisuals, | 
 |                     zrUtil.bind(visualMapModel.getValueState, visualMapModel), | 
 |                     visualMapModel.getDataDimensionIndex(seriesModel.getData()) | 
 |                 )); | 
 |             }); | 
 |  | 
 |             return resetDefines; | 
 |         } | 
 |     }, | 
 |     // Only support color. | 
 |     { | 
 |         createOnAllSeries: true, | 
 |         reset: function (seriesModel, ecModel) { | 
 |             const data = seriesModel.getData(); | 
 |             const visualMetaList: VisualMeta[] = []; | 
 |  | 
 |             ecModel.eachComponent('visualMap', function (visualMapModel: VisualMapModel) { | 
 |                 if (visualMapModel.isTargetSeries(seriesModel)) { | 
 |                     const visualMeta = visualMapModel.getVisualMeta( | 
 |                         zrUtil.bind(getColorVisual, null, seriesModel, visualMapModel) | 
 |                     ) || { | 
 |                         stops: [], | 
 |                         outerColors: [] | 
 |                     } as VisualMeta; | 
 |  | 
 |                     const dimIdx = visualMapModel.getDataDimensionIndex(data); | 
 |                     if (dimIdx >= 0) { | 
 |                         // visualMeta.dimension should be dimension index, but not concrete dimension. | 
 |                         visualMeta.dimension = dimIdx; | 
 |                         visualMetaList.push(visualMeta); | 
 |                     } | 
 |                 } | 
 |             }); | 
 |  | 
 |             // console.log(JSON.stringify(visualMetaList.map(a => a.stops))); | 
 |             seriesModel.getData().setVisual('visualMeta', visualMetaList); | 
 |         } | 
 |     } | 
 | ]; | 
 |  | 
 | // FIXME | 
 | // performance and export for heatmap? | 
 | // value can be Infinity or -Infinity | 
 | function getColorVisual( | 
 |     seriesModel: SeriesModel, | 
 |     visualMapModel: VisualMapModel, | 
 |     value: ParsedValue, | 
 |     valueState: VisualMapModel['stateList'][number] | 
 | ) { | 
 |     const mappings = visualMapModel.targetVisuals[valueState]; | 
 |     const visualTypes = VisualMapping.prepareVisualTypes(mappings); | 
 |     const resultVisual: Partial<Record<BuiltinVisualProperty, any>> = { | 
 |         color: getVisualFromData(seriesModel.getData(), 'color') // default color. | 
 |     }; | 
 |  | 
 |     for (let i = 0, len = visualTypes.length; i < len; i++) { | 
 |         const type = visualTypes[i]; | 
 |         const mapping = mappings[ | 
 |             (type === 'opacity' ? '__alphaForOpacity' : type) as BuiltinVisualProperty | 
 |         ]; | 
 |         mapping && mapping.applyVisual(value, getVisual, setVisual); | 
 |     } | 
 |  | 
 |     return resultVisual.color; | 
 |  | 
 |     function getVisual(key: BuiltinVisualProperty) { | 
 |         return resultVisual[key]; | 
 |     } | 
 |  | 
 |     function setVisual(key: BuiltinVisualProperty, value: any) { | 
 |         resultVisual[key] = value; | 
 |     } | 
 | } |