| 
/* 
 | 
* 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 { separateMorph, combineMorph, morphPath, isCombineMorphing } from 'zrender/lib/tool/morphPath.js'; 
 | 
import { Path } from '../util/graphic.js'; 
 | 
import { defaults, isArray } from 'zrender/lib/core/util.js'; 
 | 
import { getAnimationConfig } from './basicTransition.js'; 
 | 
import { clonePath } from 'zrender/lib/tool/path.js'; 
 | 
function isMultiple(elements) { 
 | 
  return isArray(elements[0]); 
 | 
} 
 | 
function prepareMorphBatches(one, many) { 
 | 
  var batches = []; 
 | 
  var batchCount = one.length; 
 | 
  for (var i = 0; i < batchCount; i++) { 
 | 
    batches.push({ 
 | 
      one: one[i], 
 | 
      many: [] 
 | 
    }); 
 | 
  } 
 | 
  for (var i = 0; i < many.length; i++) { 
 | 
    var len = many[i].length; 
 | 
    var k = void 0; 
 | 
    for (k = 0; k < len; k++) { 
 | 
      batches[k % batchCount].many.push(many[i][k]); 
 | 
    } 
 | 
  } 
 | 
  var off = 0; 
 | 
  // If one has more paths than each one of many. average them. 
 | 
  for (var i = batchCount - 1; i >= 0; i--) { 
 | 
    if (!batches[i].many.length) { 
 | 
      var moveFrom = batches[off].many; 
 | 
      if (moveFrom.length <= 1) { 
 | 
        // Not enough 
 | 
        // Start from the first one. 
 | 
        if (off) { 
 | 
          off = 0; 
 | 
        } else { 
 | 
          return batches; 
 | 
        } 
 | 
      } 
 | 
      var len = moveFrom.length; 
 | 
      var mid = Math.ceil(len / 2); 
 | 
      batches[i].many = moveFrom.slice(mid, len); 
 | 
      batches[off].many = moveFrom.slice(0, mid); 
 | 
      off++; 
 | 
    } 
 | 
  } 
 | 
  return batches; 
 | 
} 
 | 
var pathDividers = { 
 | 
  clone: function (params) { 
 | 
    var ret = []; 
 | 
    // Fitting the alpha 
 | 
    var approxOpacity = 1 - Math.pow(1 - params.path.style.opacity, 1 / params.count); 
 | 
    for (var i = 0; i < params.count; i++) { 
 | 
      var cloned = clonePath(params.path); 
 | 
      cloned.setStyle('opacity', approxOpacity); 
 | 
      ret.push(cloned); 
 | 
    } 
 | 
    return ret; 
 | 
  }, 
 | 
  // Use the default divider 
 | 
  split: null 
 | 
}; 
 | 
export function applyMorphAnimation(from, to, divideShape, seriesModel, dataIndex, animateOtherProps) { 
 | 
  if (!from.length || !to.length) { 
 | 
    return; 
 | 
  } 
 | 
  var updateAnimationCfg = getAnimationConfig('update', seriesModel, dataIndex); 
 | 
  if (!(updateAnimationCfg && updateAnimationCfg.duration > 0)) { 
 | 
    return; 
 | 
  } 
 | 
  var animationDelay = seriesModel.getModel('universalTransition').get('delay'); 
 | 
  var animationCfg = Object.assign({ 
 | 
    // Need to setToFinal so the further calculation based on the style can be correct. 
 | 
    // Like emphasis color. 
 | 
    setToFinal: true 
 | 
  }, updateAnimationCfg); 
 | 
  var many; 
 | 
  var one; 
 | 
  if (isMultiple(from)) { 
 | 
    // manyToOne 
 | 
    many = from; 
 | 
    one = to; 
 | 
  } 
 | 
  if (isMultiple(to)) { 
 | 
    // oneToMany 
 | 
    many = to; 
 | 
    one = from; 
 | 
  } 
 | 
  function morphOneBatch(batch, fromIsMany, animateIndex, animateCount, forceManyOne) { 
 | 
    var batchMany = batch.many; 
 | 
    var batchOne = batch.one; 
 | 
    if (batchMany.length === 1 && !forceManyOne) { 
 | 
      // Is one to one 
 | 
      var batchFrom = fromIsMany ? batchMany[0] : batchOne; 
 | 
      var batchTo = fromIsMany ? batchOne : batchMany[0]; 
 | 
      if (isCombineMorphing(batchFrom)) { 
 | 
        // Keep doing combine animation. 
 | 
        morphOneBatch({ 
 | 
          many: [batchFrom], 
 | 
          one: batchTo 
 | 
        }, true, animateIndex, animateCount, true); 
 | 
      } else { 
 | 
        var individualAnimationCfg = animationDelay ? defaults({ 
 | 
          delay: animationDelay(animateIndex, animateCount) 
 | 
        }, animationCfg) : animationCfg; 
 | 
        morphPath(batchFrom, batchTo, individualAnimationCfg); 
 | 
        animateOtherProps(batchFrom, batchTo, batchFrom, batchTo, individualAnimationCfg); 
 | 
      } 
 | 
    } else { 
 | 
      var separateAnimationCfg = defaults({ 
 | 
        dividePath: pathDividers[divideShape], 
 | 
        individualDelay: animationDelay && function (idx, count, fromPath, toPath) { 
 | 
          return animationDelay(idx + animateIndex, animateCount); 
 | 
        } 
 | 
      }, animationCfg); 
 | 
      var _a = fromIsMany ? combineMorph(batchMany, batchOne, separateAnimationCfg) : separateMorph(batchOne, batchMany, separateAnimationCfg), 
 | 
        fromIndividuals = _a.fromIndividuals, 
 | 
        toIndividuals = _a.toIndividuals; 
 | 
      var count = fromIndividuals.length; 
 | 
      for (var k = 0; k < count; k++) { 
 | 
        var individualAnimationCfg = animationDelay ? defaults({ 
 | 
          delay: animationDelay(k, count) 
 | 
        }, animationCfg) : animationCfg; 
 | 
        animateOtherProps(fromIndividuals[k], toIndividuals[k], fromIsMany ? batchMany[k] : batch.one, fromIsMany ? batch.one : batchMany[k], individualAnimationCfg); 
 | 
      } 
 | 
    } 
 | 
  } 
 | 
  var fromIsMany = many ? many === from 
 | 
  // Is one to one. If the path number not match. also needs do merge and separate morphing. 
 | 
  : from.length > to.length; 
 | 
  var morphBatches = many ? prepareMorphBatches(one, many) : prepareMorphBatches(fromIsMany ? to : from, [fromIsMany ? from : to]); 
 | 
  var animateCount = 0; 
 | 
  for (var i = 0; i < morphBatches.length; i++) { 
 | 
    animateCount += morphBatches[i].many.length; 
 | 
  } 
 | 
  var animateIndex = 0; 
 | 
  for (var i = 0; i < morphBatches.length; i++) { 
 | 
    morphOneBatch(morphBatches[i], fromIsMany, animateIndex, animateCount); 
 | 
    animateIndex += morphBatches[i].many.length; 
 | 
  } 
 | 
} 
 | 
export function getPathList(elements) { 
 | 
  if (!elements) { 
 | 
    return []; 
 | 
  } 
 | 
  if (isArray(elements)) { 
 | 
    var pathList_1 = []; 
 | 
    for (var i = 0; i < elements.length; i++) { 
 | 
      pathList_1.push(getPathList(elements[i])); 
 | 
    } 
 | 
    return pathList_1; 
 | 
  } 
 | 
  var pathList = []; 
 | 
  elements.traverse(function (el) { 
 | 
    if (el instanceof Path && !el.disableMorphing && !el.invisible && !el.ignore) { 
 | 
      pathList.push(el); 
 | 
    } 
 | 
  }); 
 | 
  return pathList; 
 | 
} 
 |