You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					237 lines
				
				7.3 KiB
			
		
		
			
		
	
	
					237 lines
				
				7.3 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								* 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.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var zrUtil = require("zrender/lib/core/util");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var VisualMapping = require("./VisualMapping");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								* 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.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @file Visual solution, for consistent option specification.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								var each = zrUtil.each;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function hasKeys(obj) {
							 | 
						||
| 
								 | 
							
								  if (obj) {
							 | 
						||
| 
								 | 
							
								    for (var name in obj) {
							 | 
						||
| 
								 | 
							
								      if (obj.hasOwnProperty(name)) {
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @param {Object} option
							 | 
						||
| 
								 | 
							
								 * @param {Array.<string>} stateList
							 | 
						||
| 
								 | 
							
								 * @param {Function} [supplementVisualOption]
							 | 
						||
| 
								 | 
							
								 * @return {Object} visualMappings <state, <visualType, module:echarts/visual/VisualMapping>>
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function createVisualMappings(option, stateList, supplementVisualOption) {
							 | 
						||
| 
								 | 
							
								  var visualMappings = {};
							 | 
						||
| 
								 | 
							
								  each(stateList, function (state) {
							 | 
						||
| 
								 | 
							
								    var mappings = visualMappings[state] = createMappings();
							 | 
						||
| 
								 | 
							
								    each(option[state], function (visualData, visualType) {
							 | 
						||
| 
								 | 
							
								      if (!VisualMapping.isValidType(visualType)) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var mappingOption = {
							 | 
						||
| 
								 | 
							
								        type: visualType,
							 | 
						||
| 
								 | 
							
								        visual: visualData
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								      supplementVisualOption && supplementVisualOption(mappingOption, state);
							 | 
						||
| 
								 | 
							
								      mappings[visualType] = new VisualMapping(mappingOption); // Prepare a alpha for opacity, for some case that opacity
							 | 
						||
| 
								 | 
							
								      // is not supported, such as rendering using gradient color.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (visualType === 'opacity') {
							 | 
						||
| 
								 | 
							
								        mappingOption = zrUtil.clone(mappingOption);
							 | 
						||
| 
								 | 
							
								        mappingOption.type = 'colorAlpha';
							 | 
						||
| 
								 | 
							
								        mappings.__hidden.__alphaForOpacity = new VisualMapping(mappingOption);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  return visualMappings;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function createMappings() {
							 | 
						||
| 
								 | 
							
								    var Creater = function () {}; // Make sure hidden fields will not be visited by
							 | 
						||
| 
								 | 
							
								    // object iteration (with hasOwnProperty checking).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Creater.prototype.__hidden = Creater.prototype;
							 | 
						||
| 
								 | 
							
								    var obj = new Creater();
							 | 
						||
| 
								 | 
							
								    return obj;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @param {Object} thisOption
							 | 
						||
| 
								 | 
							
								 * @param {Object} newOption
							 | 
						||
| 
								 | 
							
								 * @param {Array.<string>} keys
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function replaceVisualOption(thisOption, newOption, keys) {
							 | 
						||
| 
								 | 
							
								  // Visual attributes merge is not supported, otherwise it
							 | 
						||
| 
								 | 
							
								  // brings overcomplicated merge logic. See #2853. So if
							 | 
						||
| 
								 | 
							
								  // newOption has anyone of these keys, all of these keys
							 | 
						||
| 
								 | 
							
								  // will be reset. Otherwise, all keys remain.
							 | 
						||
| 
								 | 
							
								  var has;
							 | 
						||
| 
								 | 
							
								  zrUtil.each(keys, function (key) {
							 | 
						||
| 
								 | 
							
								    if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) {
							 | 
						||
| 
								 | 
							
								      has = true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  has && zrUtil.each(keys, function (key) {
							 | 
						||
| 
								 | 
							
								    if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) {
							 | 
						||
| 
								 | 
							
								      thisOption[key] = zrUtil.clone(newOption[key]);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      delete thisOption[key];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @param {Array.<string>} stateList
							 | 
						||
| 
								 | 
							
								 * @param {Object} visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>>
							 | 
						||
| 
								 | 
							
								 * @param {module:echarts/data/List} list
							 | 
						||
| 
								 | 
							
								 * @param {Function} getValueState param: valueOrIndex, return: state.
							 | 
						||
| 
								 | 
							
								 * @param {object} [scope] Scope for getValueState
							 | 
						||
| 
								 | 
							
								 * @param {string} [dimension] Concrete dimension, if used.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								// ???! handle brush?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function applyVisual(stateList, visualMappings, data, getValueState, scope, dimension) {
							 | 
						||
| 
								 | 
							
								  var visualTypesMap = {};
							 | 
						||
| 
								 | 
							
								  zrUtil.each(stateList, function (state) {
							 | 
						||
| 
								 | 
							
								    var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]);
							 | 
						||
| 
								 | 
							
								    visualTypesMap[state] = visualTypes;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  var dataIndex;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function getVisual(key) {
							 | 
						||
| 
								 | 
							
								    return data.getItemVisual(dataIndex, key);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function setVisual(key, value) {
							 | 
						||
| 
								 | 
							
								    data.setItemVisual(dataIndex, key, value);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (dimension == null) {
							 | 
						||
| 
								 | 
							
								    data.each(eachItem);
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    data.each([dimension], eachItem);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function eachItem(valueOrIndex, index) {
							 | 
						||
| 
								 | 
							
								    dataIndex = dimension == null ? valueOrIndex : index;
							 | 
						||
| 
								 | 
							
								    var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (rawDataItem && rawDataItem.visualMap === false) {
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var valueState = getValueState.call(scope, valueOrIndex);
							 | 
						||
| 
								 | 
							
								    var mappings = visualMappings[valueState];
							 | 
						||
| 
								 | 
							
								    var visualTypes = visualTypesMap[valueState];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (var i = 0, len = visualTypes.length; i < len; i++) {
							 | 
						||
| 
								 | 
							
								      var type = visualTypes[i];
							 | 
						||
| 
								 | 
							
								      mappings[type] && mappings[type].applyVisual(valueOrIndex, getVisual, setVisual);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @param {module:echarts/data/List} data
							 | 
						||
| 
								 | 
							
								 * @param {Array.<string>} stateList
							 | 
						||
| 
								 | 
							
								 * @param {Object} visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>>
							 | 
						||
| 
								 | 
							
								 * @param {Function} getValueState param: valueOrIndex, return: state.
							 | 
						||
| 
								 | 
							
								 * @param {number} [dim] dimension or dimension index.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function incrementalApplyVisual(stateList, visualMappings, getValueState, dim) {
							 | 
						||
| 
								 | 
							
								  var visualTypesMap = {};
							 | 
						||
| 
								 | 
							
								  zrUtil.each(stateList, function (state) {
							 | 
						||
| 
								 | 
							
								    var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]);
							 | 
						||
| 
								 | 
							
								    visualTypesMap[state] = visualTypes;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function progress(params, data) {
							 | 
						||
| 
								 | 
							
								    if (dim != null) {
							 | 
						||
| 
								 | 
							
								      dim = data.getDimension(dim);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function getVisual(key) {
							 | 
						||
| 
								 | 
							
								      return data.getItemVisual(dataIndex, key);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function setVisual(key, value) {
							 | 
						||
| 
								 | 
							
								      data.setItemVisual(dataIndex, key, value);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var dataIndex;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    while ((dataIndex = params.next()) != null) {
							 | 
						||
| 
								 | 
							
								      var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (rawDataItem && rawDataItem.visualMap === false) {
							 | 
						||
| 
								 | 
							
								        continue;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var value = dim != null ? data.get(dim, dataIndex, true) : dataIndex;
							 | 
						||
| 
								 | 
							
								      var valueState = getValueState(value);
							 | 
						||
| 
								 | 
							
								      var mappings = visualMappings[valueState];
							 | 
						||
| 
								 | 
							
								      var visualTypes = visualTypesMap[valueState];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      for (var i = 0, len = visualTypes.length; i < len; i++) {
							 | 
						||
| 
								 | 
							
								        var type = visualTypes[i];
							 | 
						||
| 
								 | 
							
								        mappings[type] && mappings[type].applyVisual(value, getVisual, setVisual);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return {
							 | 
						||
| 
								 | 
							
								    progress: progress
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								exports.createVisualMappings = createVisualMappings;
							 | 
						||
| 
								 | 
							
								exports.replaceVisualOption = replaceVisualOption;
							 | 
						||
| 
								 | 
							
								exports.applyVisual = applyVisual;
							 | 
						||
| 
								 | 
							
								exports.incrementalApplyVisual = incrementalApplyVisual;
							 |