| 
/* 
 | 
* 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 { getPrecisionSafe, round } from '../util/number.js'; 
 | 
import IntervalScale from '../scale/Interval.js'; 
 | 
import { getScaleExtent } from './axisHelper.js'; 
 | 
import { warn } from '../util/log.js'; 
 | 
import { increaseInterval, isValueNice } from '../scale/helper.js'; 
 | 
var mathLog = Math.log; 
 | 
export function alignScaleTicks(scale, axisModel, alignToScale) { 
 | 
  var intervalScaleProto = IntervalScale.prototype; 
 | 
  // NOTE: There is a precondition for log scale  here: 
 | 
  // In log scale we store _interval and _extent of exponent value. 
 | 
  // So if we use the method of InternalScale to set/get these data. 
 | 
  // It process the exponent value, which is linear and what we want here. 
 | 
  var alignToTicks = intervalScaleProto.getTicks.call(alignToScale); 
 | 
  var alignToNicedTicks = intervalScaleProto.getTicks.call(alignToScale, true); 
 | 
  var alignToSplitNumber = alignToTicks.length - 1; 
 | 
  var alignToInterval = intervalScaleProto.getInterval.call(alignToScale); 
 | 
  var scaleExtent = getScaleExtent(scale, axisModel); 
 | 
  var rawExtent = scaleExtent.extent; 
 | 
  var isMinFixed = scaleExtent.fixMin; 
 | 
  var isMaxFixed = scaleExtent.fixMax; 
 | 
  if (scale.type === 'log') { 
 | 
    var logBase = mathLog(scale.base); 
 | 
    rawExtent = [mathLog(rawExtent[0]) / logBase, mathLog(rawExtent[1]) / logBase]; 
 | 
  } 
 | 
  scale.setExtent(rawExtent[0], rawExtent[1]); 
 | 
  scale.calcNiceExtent({ 
 | 
    splitNumber: alignToSplitNumber, 
 | 
    fixMin: isMinFixed, 
 | 
    fixMax: isMaxFixed 
 | 
  }); 
 | 
  var extent = intervalScaleProto.getExtent.call(scale); 
 | 
  // Need to update the rawExtent. 
 | 
  // Because value in rawExtent may be not parsed. e.g. 'dataMin', 'dataMax' 
 | 
  if (isMinFixed) { 
 | 
    rawExtent[0] = extent[0]; 
 | 
  } 
 | 
  if (isMaxFixed) { 
 | 
    rawExtent[1] = extent[1]; 
 | 
  } 
 | 
  var interval = intervalScaleProto.getInterval.call(scale); 
 | 
  var min = rawExtent[0]; 
 | 
  var max = rawExtent[1]; 
 | 
  if (isMinFixed && isMaxFixed) { 
 | 
    // User set min, max, divide to get new interval 
 | 
    interval = (max - min) / alignToSplitNumber; 
 | 
  } else if (isMinFixed) { 
 | 
    max = rawExtent[0] + interval * alignToSplitNumber; 
 | 
    // User set min, expand extent on the other side 
 | 
    while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1])) { 
 | 
      interval = increaseInterval(interval); 
 | 
      max = rawExtent[0] + interval * alignToSplitNumber; 
 | 
    } 
 | 
  } else if (isMaxFixed) { 
 | 
    // User set max, expand extent on the other side 
 | 
    min = rawExtent[1] - interval * alignToSplitNumber; 
 | 
    while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0])) { 
 | 
      interval = increaseInterval(interval); 
 | 
      min = rawExtent[1] - interval * alignToSplitNumber; 
 | 
    } 
 | 
  } else { 
 | 
    var nicedSplitNumber = scale.getTicks().length - 1; 
 | 
    if (nicedSplitNumber > alignToSplitNumber) { 
 | 
      interval = increaseInterval(interval); 
 | 
    } 
 | 
    var range = interval * alignToSplitNumber; 
 | 
    max = Math.ceil(rawExtent[1] / interval) * interval; 
 | 
    min = round(max - range); 
 | 
    // Not change the result that crossing zero. 
 | 
    if (min < 0 && rawExtent[0] >= 0) { 
 | 
      min = 0; 
 | 
      max = round(range); 
 | 
    } else if (max > 0 && rawExtent[1] <= 0) { 
 | 
      max = 0; 
 | 
      min = -round(range); 
 | 
    } 
 | 
  } 
 | 
  // Adjust min, max based on the extent of alignTo. When min or max is set in alignTo scale 
 | 
  var t0 = (alignToTicks[0].value - alignToNicedTicks[0].value) / alignToInterval; 
 | 
  var t1 = (alignToTicks[alignToSplitNumber].value - alignToNicedTicks[alignToSplitNumber].value) / alignToInterval; 
 | 
  // NOTE: Must in setExtent -> setInterval -> setNiceExtent order. 
 | 
  intervalScaleProto.setExtent.call(scale, min + interval * t0, max + interval * t1); 
 | 
  intervalScaleProto.setInterval.call(scale, interval); 
 | 
  if (t0 || t1) { 
 | 
    intervalScaleProto.setNiceExtent.call(scale, min + interval, max - interval); 
 | 
  } 
 | 
  if (process.env.NODE_ENV !== 'production') { 
 | 
    var ticks = intervalScaleProto.getTicks.call(scale); 
 | 
    if (ticks[1] && (!isValueNice(interval) || getPrecisionSafe(ticks[1].value) > getPrecisionSafe(interval))) { 
 | 
      warn( 
 | 
      // eslint-disable-next-line 
 | 
      "The ticks may be not readable when set min: " + axisModel.get('min') + ", max: " + axisModel.get('max') + " and alignTicks: true"); 
 | 
    } 
 | 
  } 
 | 
} 
 |