|   | 
| /* | 
| * 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. | 
| */ | 
|   | 
|   | 
| /** | 
|  * AUTO-GENERATED FILE. DO NOT MODIFY. | 
|  */ | 
|   | 
| /* | 
| * 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/lib/core/util.js'; | 
| import * as zrColor from 'zrender/lib/tool/color.js'; | 
| import { linearMap } from '../util/number.js'; | 
| import { warn } from '../util/log.js'; | 
| var each = zrUtil.each; | 
| var isObject = zrUtil.isObject; | 
| var CATEGORY_DEFAULT_VISUAL_INDEX = -1; | 
| var VisualMapping = /** @class */function () { | 
|   function VisualMapping(option) { | 
|     var mappingMethod = option.mappingMethod; | 
|     var visualType = option.type; | 
|     var thisOption = this.option = zrUtil.clone(option); | 
|     this.type = visualType; | 
|     this.mappingMethod = mappingMethod; | 
|     this._normalizeData = normalizers[mappingMethod]; | 
|     var visualHandler = VisualMapping.visualHandlers[visualType]; | 
|     this.applyVisual = visualHandler.applyVisual; | 
|     this.getColorMapper = visualHandler.getColorMapper; | 
|     this._normalizedToVisual = visualHandler._normalizedToVisual[mappingMethod]; | 
|     if (mappingMethod === 'piecewise') { | 
|       normalizeVisualRange(thisOption); | 
|       preprocessForPiecewise(thisOption); | 
|     } else if (mappingMethod === 'category') { | 
|       thisOption.categories ? preprocessForSpecifiedCategory(thisOption) | 
|       // categories is ordinal when thisOption.categories not specified, | 
|       // which need no more preprocess except normalize visual. | 
|       : normalizeVisualRange(thisOption, true); | 
|     } else { | 
|       // mappingMethod === 'linear' or 'fixed' | 
|       zrUtil.assert(mappingMethod !== 'linear' || thisOption.dataExtent); | 
|       normalizeVisualRange(thisOption); | 
|     } | 
|   } | 
|   VisualMapping.prototype.mapValueToVisual = function (value) { | 
|     var normalized = this._normalizeData(value); | 
|     return this._normalizedToVisual(normalized, value); | 
|   }; | 
|   VisualMapping.prototype.getNormalizer = function () { | 
|     return zrUtil.bind(this._normalizeData, this); | 
|   }; | 
|   /** | 
|    * List available visual types. | 
|    * | 
|    * @public | 
|    * @return {Array.<string>} | 
|    */ | 
|   VisualMapping.listVisualTypes = function () { | 
|     return zrUtil.keys(VisualMapping.visualHandlers); | 
|   }; | 
|   // /** | 
|   //  * @public | 
|   //  */ | 
|   // static addVisualHandler(name, handler) { | 
|   //     visualHandlers[name] = handler; | 
|   // } | 
|   /** | 
|    * @public | 
|    */ | 
|   VisualMapping.isValidType = function (visualType) { | 
|     return VisualMapping.visualHandlers.hasOwnProperty(visualType); | 
|   }; | 
|   /** | 
|    * Convenient method. | 
|    * Visual can be Object or Array or primary type. | 
|    */ | 
|   VisualMapping.eachVisual = function (visual, callback, context) { | 
|     if (zrUtil.isObject(visual)) { | 
|       zrUtil.each(visual, callback, context); | 
|     } else { | 
|       callback.call(context, visual); | 
|     } | 
|   }; | 
|   VisualMapping.mapVisual = function (visual, callback, context) { | 
|     var isPrimary; | 
|     var newVisual = zrUtil.isArray(visual) ? [] : zrUtil.isObject(visual) ? {} : (isPrimary = true, null); | 
|     VisualMapping.eachVisual(visual, function (v, key) { | 
|       var newVal = callback.call(context, v, key); | 
|       isPrimary ? newVisual = newVal : newVisual[key] = newVal; | 
|     }); | 
|     return newVisual; | 
|   }; | 
|   /** | 
|    * Retrieve visual properties from given object. | 
|    */ | 
|   VisualMapping.retrieveVisuals = function (obj) { | 
|     var ret = {}; | 
|     var hasVisual; | 
|     obj && each(VisualMapping.visualHandlers, function (h, visualType) { | 
|       if (obj.hasOwnProperty(visualType)) { | 
|         ret[visualType] = obj[visualType]; | 
|         hasVisual = true; | 
|       } | 
|     }); | 
|     return hasVisual ? ret : null; | 
|   }; | 
|   /** | 
|    * Give order to visual types, considering colorSaturation, colorAlpha depends on color. | 
|    * | 
|    * @public | 
|    * @param {(Object|Array)} visualTypes If Object, like: {color: ..., colorSaturation: ...} | 
|    *                                     IF Array, like: ['color', 'symbol', 'colorSaturation'] | 
|    * @return {Array.<string>} Sorted visual types. | 
|    */ | 
|   VisualMapping.prepareVisualTypes = function (visualTypes) { | 
|     if (zrUtil.isArray(visualTypes)) { | 
|       visualTypes = visualTypes.slice(); | 
|     } else if (isObject(visualTypes)) { | 
|       var types_1 = []; | 
|       each(visualTypes, function (item, type) { | 
|         types_1.push(type); | 
|       }); | 
|       visualTypes = types_1; | 
|     } else { | 
|       return []; | 
|     } | 
|     visualTypes.sort(function (type1, type2) { | 
|       // color should be front of colorSaturation, colorAlpha, ... | 
|       // symbol and symbolSize do not matter. | 
|       return type2 === 'color' && type1 !== 'color' && type1.indexOf('color') === 0 ? 1 : -1; | 
|     }); | 
|     return visualTypes; | 
|   }; | 
|   /** | 
|    * 'color', 'colorSaturation', 'colorAlpha', ... are depends on 'color'. | 
|    * Other visuals are only depends on themself. | 
|    */ | 
|   VisualMapping.dependsOn = function (visualType1, visualType2) { | 
|     return visualType2 === 'color' ? !!(visualType1 && visualType1.indexOf(visualType2) === 0) : visualType1 === visualType2; | 
|   }; | 
|   /** | 
|    * @param value | 
|    * @param pieceList [{value: ..., interval: [min, max]}, ...] | 
|    *                         Always from small to big. | 
|    * @param findClosestWhenOutside Default to be false | 
|    * @return index | 
|    */ | 
|   VisualMapping.findPieceIndex = function (value, pieceList, findClosestWhenOutside) { | 
|     var possibleI; | 
|     var abs = Infinity; | 
|     // value has the higher priority. | 
|     for (var i = 0, len = pieceList.length; i < len; i++) { | 
|       var pieceValue = pieceList[i].value; | 
|       if (pieceValue != null) { | 
|         if (pieceValue === value | 
|         // FIXME | 
|         // It is supposed to compare value according to value type of dimension, | 
|         // but currently value type can exactly be string or number. | 
|         // Compromise for numeric-like string (like '12'), especially | 
|         // in the case that visualMap.categories is ['22', '33']. | 
|         || zrUtil.isString(pieceValue) && pieceValue === value + '') { | 
|           return i; | 
|         } | 
|         findClosestWhenOutside && updatePossible(pieceValue, i); | 
|       } | 
|     } | 
|     for (var i = 0, len = pieceList.length; i < len; i++) { | 
|       var piece = pieceList[i]; | 
|       var interval = piece.interval; | 
|       var close_1 = piece.close; | 
|       if (interval) { | 
|         if (interval[0] === -Infinity) { | 
|           if (littleThan(close_1[1], value, interval[1])) { | 
|             return i; | 
|           } | 
|         } else if (interval[1] === Infinity) { | 
|           if (littleThan(close_1[0], interval[0], value)) { | 
|             return i; | 
|           } | 
|         } else if (littleThan(close_1[0], interval[0], value) && littleThan(close_1[1], value, interval[1])) { | 
|           return i; | 
|         } | 
|         findClosestWhenOutside && updatePossible(interval[0], i); | 
|         findClosestWhenOutside && updatePossible(interval[1], i); | 
|       } | 
|     } | 
|     if (findClosestWhenOutside) { | 
|       return value === Infinity ? pieceList.length - 1 : value === -Infinity ? 0 : possibleI; | 
|     } | 
|     function updatePossible(val, index) { | 
|       var newAbs = Math.abs(val - value); | 
|       if (newAbs < abs) { | 
|         abs = newAbs; | 
|         possibleI = index; | 
|       } | 
|     } | 
|   }; | 
|   VisualMapping.visualHandlers = { | 
|     color: { | 
|       applyVisual: makeApplyVisual('color'), | 
|       getColorMapper: function () { | 
|         var thisOption = this.option; | 
|         return zrUtil.bind(thisOption.mappingMethod === 'category' ? function (value, isNormalized) { | 
|           !isNormalized && (value = this._normalizeData(value)); | 
|           return doMapCategory.call(this, value); | 
|         } : function (value, isNormalized, out) { | 
|           // If output rgb array | 
|           // which will be much faster and useful in pixel manipulation | 
|           var returnRGBArray = !!out; | 
|           !isNormalized && (value = this._normalizeData(value)); | 
|           out = zrColor.fastLerp(value, thisOption.parsedVisual, out); | 
|           return returnRGBArray ? out : zrColor.stringify(out, 'rgba'); | 
|         }, this); | 
|       }, | 
|       _normalizedToVisual: { | 
|         linear: function (normalized) { | 
|           return zrColor.stringify(zrColor.fastLerp(normalized, this.option.parsedVisual), 'rgba'); | 
|         }, | 
|         category: doMapCategory, | 
|         piecewise: function (normalized, value) { | 
|           var result = getSpecifiedVisual.call(this, value); | 
|           if (result == null) { | 
|             result = zrColor.stringify(zrColor.fastLerp(normalized, this.option.parsedVisual), 'rgba'); | 
|           } | 
|           return result; | 
|         }, | 
|         fixed: doMapFixed | 
|       } | 
|     }, | 
|     colorHue: makePartialColorVisualHandler(function (color, value) { | 
|       return zrColor.modifyHSL(color, value); | 
|     }), | 
|     colorSaturation: makePartialColorVisualHandler(function (color, value) { | 
|       return zrColor.modifyHSL(color, null, value); | 
|     }), | 
|     colorLightness: makePartialColorVisualHandler(function (color, value) { | 
|       return zrColor.modifyHSL(color, null, null, value); | 
|     }), | 
|     colorAlpha: makePartialColorVisualHandler(function (color, value) { | 
|       return zrColor.modifyAlpha(color, value); | 
|     }), | 
|     decal: { | 
|       applyVisual: makeApplyVisual('decal'), | 
|       _normalizedToVisual: { | 
|         linear: null, | 
|         category: doMapCategory, | 
|         piecewise: null, | 
|         fixed: null | 
|       } | 
|     }, | 
|     opacity: { | 
|       applyVisual: makeApplyVisual('opacity'), | 
|       _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) | 
|     }, | 
|     liftZ: { | 
|       applyVisual: makeApplyVisual('liftZ'), | 
|       _normalizedToVisual: { | 
|         linear: doMapFixed, | 
|         category: doMapFixed, | 
|         piecewise: doMapFixed, | 
|         fixed: doMapFixed | 
|       } | 
|     }, | 
|     symbol: { | 
|       applyVisual: function (value, getter, setter) { | 
|         var symbolCfg = this.mapValueToVisual(value); | 
|         setter('symbol', symbolCfg); | 
|       }, | 
|       _normalizedToVisual: { | 
|         linear: doMapToArray, | 
|         category: doMapCategory, | 
|         piecewise: function (normalized, value) { | 
|           var result = getSpecifiedVisual.call(this, value); | 
|           if (result == null) { | 
|             result = doMapToArray.call(this, normalized); | 
|           } | 
|           return result; | 
|         }, | 
|         fixed: doMapFixed | 
|       } | 
|     }, | 
|     symbolSize: { | 
|       applyVisual: makeApplyVisual('symbolSize'), | 
|       _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) | 
|     } | 
|   }; | 
|   return VisualMapping; | 
| }(); | 
| function preprocessForPiecewise(thisOption) { | 
|   var pieceList = thisOption.pieceList; | 
|   thisOption.hasSpecialVisual = false; | 
|   zrUtil.each(pieceList, function (piece, index) { | 
|     piece.originIndex = index; | 
|     // piece.visual is "result visual value" but not | 
|     // a visual range, so it does not need to be normalized. | 
|     if (piece.visual != null) { | 
|       thisOption.hasSpecialVisual = true; | 
|     } | 
|   }); | 
| } | 
| function preprocessForSpecifiedCategory(thisOption) { | 
|   // Hash categories. | 
|   var categories = thisOption.categories; | 
|   var categoryMap = thisOption.categoryMap = {}; | 
|   var visual = thisOption.visual; | 
|   each(categories, function (cate, index) { | 
|     categoryMap[cate] = index; | 
|   }); | 
|   // Process visual map input. | 
|   if (!zrUtil.isArray(visual)) { | 
|     var visualArr_1 = []; | 
|     if (zrUtil.isObject(visual)) { | 
|       each(visual, function (v, cate) { | 
|         var index = categoryMap[cate]; | 
|         visualArr_1[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v; | 
|       }); | 
|     } else { | 
|       // Is primary type, represents default visual. | 
|       visualArr_1[CATEGORY_DEFAULT_VISUAL_INDEX] = visual; | 
|     } | 
|     visual = setVisualToOption(thisOption, visualArr_1); | 
|   } | 
|   // Remove categories that has no visual, | 
|   // then we can mapping them to CATEGORY_DEFAULT_VISUAL_INDEX. | 
|   for (var i = categories.length - 1; i >= 0; i--) { | 
|     if (visual[i] == null) { | 
|       delete categoryMap[categories[i]]; | 
|       categories.pop(); | 
|     } | 
|   } | 
| } | 
| function normalizeVisualRange(thisOption, isCategory) { | 
|   var visual = thisOption.visual; | 
|   var visualArr = []; | 
|   if (zrUtil.isObject(visual)) { | 
|     each(visual, function (v) { | 
|       visualArr.push(v); | 
|     }); | 
|   } else if (visual != null) { | 
|     visualArr.push(visual); | 
|   } | 
|   var doNotNeedPair = { | 
|     color: 1, | 
|     symbol: 1 | 
|   }; | 
|   if (!isCategory && visualArr.length === 1 && !doNotNeedPair.hasOwnProperty(thisOption.type)) { | 
|     // Do not care visualArr.length === 0, which is illegal. | 
|     visualArr[1] = visualArr[0]; | 
|   } | 
|   setVisualToOption(thisOption, visualArr); | 
| } | 
| function makePartialColorVisualHandler(applyValue) { | 
|   return { | 
|     applyVisual: function (value, getter, setter) { | 
|       // Only used in HSL | 
|       var colorChannel = this.mapValueToVisual(value); | 
|       // Must not be array value | 
|       setter('color', applyValue(getter('color'), colorChannel)); | 
|     }, | 
|     _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) | 
|   }; | 
| } | 
| function doMapToArray(normalized) { | 
|   var visual = this.option.visual; | 
|   return visual[Math.round(linearMap(normalized, [0, 1], [0, visual.length - 1], true))] || {}; // TODO {}? | 
| } | 
| function makeApplyVisual(visualType) { | 
|   return function (value, getter, setter) { | 
|     setter(visualType, this.mapValueToVisual(value)); | 
|   }; | 
| } | 
| function doMapCategory(normalized) { | 
|   var visual = this.option.visual; | 
|   return visual[this.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX ? normalized % visual.length : normalized]; | 
| } | 
| function doMapFixed() { | 
|   // visual will be convert to array. | 
|   return this.option.visual[0]; | 
| } | 
| /** | 
|  * Create mapped to numeric visual | 
|  */ | 
| function createNormalizedToNumericVisual(sourceExtent) { | 
|   return { | 
|     linear: function (normalized) { | 
|       return linearMap(normalized, sourceExtent, this.option.visual, true); | 
|     }, | 
|     category: doMapCategory, | 
|     piecewise: function (normalized, value) { | 
|       var result = getSpecifiedVisual.call(this, value); | 
|       if (result == null) { | 
|         result = linearMap(normalized, sourceExtent, this.option.visual, true); | 
|       } | 
|       return result; | 
|     }, | 
|     fixed: doMapFixed | 
|   }; | 
| } | 
| function getSpecifiedVisual(value) { | 
|   var thisOption = this.option; | 
|   var pieceList = thisOption.pieceList; | 
|   if (thisOption.hasSpecialVisual) { | 
|     var pieceIndex = VisualMapping.findPieceIndex(value, pieceList); | 
|     var piece = pieceList[pieceIndex]; | 
|     if (piece && piece.visual) { | 
|       return piece.visual[this.type]; | 
|     } | 
|   } | 
| } | 
| function setVisualToOption(thisOption, visualArr) { | 
|   thisOption.visual = visualArr; | 
|   if (thisOption.type === 'color') { | 
|     thisOption.parsedVisual = zrUtil.map(visualArr, function (item) { | 
|       var color = zrColor.parse(item); | 
|       if (!color && process.env.NODE_ENV !== 'production') { | 
|         warn("'" + item + "' is an illegal color, fallback to '#000000'", true); | 
|       } | 
|       return color || [0, 0, 0, 1]; | 
|     }); | 
|   } | 
|   return visualArr; | 
| } | 
| /** | 
|  * Normalizers by mapping methods. | 
|  */ | 
| var normalizers = { | 
|   linear: function (value) { | 
|     return linearMap(value, this.option.dataExtent, [0, 1], true); | 
|   }, | 
|   piecewise: function (value) { | 
|     var pieceList = this.option.pieceList; | 
|     var pieceIndex = VisualMapping.findPieceIndex(value, pieceList, true); | 
|     if (pieceIndex != null) { | 
|       return linearMap(pieceIndex, [0, pieceList.length - 1], [0, 1], true); | 
|     } | 
|   }, | 
|   category: function (value) { | 
|     var index = this.option.categories ? this.option.categoryMap[value] : value; // ordinal value | 
|     return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index; | 
|   }, | 
|   fixed: zrUtil.noop | 
| }; | 
| function littleThan(close, a, b) { | 
|   return close ? a <= b : a < b; | 
| } | 
| export default VisualMapping; |