|   | 
| /* | 
| * 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 { each, map } from 'zrender/lib/core/util.js'; | 
| import { linearMap, getPixelPrecision, round } from '../util/number.js'; | 
| import { createAxisTicks, createAxisLabels, calculateCategoryInterval } from './axisTickLabelBuilder.js'; | 
| var NORMALIZED_EXTENT = [0, 1]; | 
| /** | 
|  * Base class of Axis. | 
|  */ | 
|   | 
| var Axis = | 
| /** @class */ | 
| function () { | 
|   function Axis(dim, scale, extent) { | 
|     this.onBand = false; | 
|     this.inverse = false; | 
|     this.dim = dim; | 
|     this.scale = scale; | 
|     this._extent = extent || [0, 0]; | 
|   } | 
|   /** | 
|    * If axis extent contain given coord | 
|    */ | 
|   | 
|   | 
|   Axis.prototype.contain = function (coord) { | 
|     var extent = this._extent; | 
|     var min = Math.min(extent[0], extent[1]); | 
|     var max = Math.max(extent[0], extent[1]); | 
|     return coord >= min && coord <= max; | 
|   }; | 
|   /** | 
|    * If axis extent contain given data | 
|    */ | 
|   | 
|   | 
|   Axis.prototype.containData = function (data) { | 
|     return this.scale.contain(data); | 
|   }; | 
|   /** | 
|    * Get coord extent. | 
|    */ | 
|   | 
|   | 
|   Axis.prototype.getExtent = function () { | 
|     return this._extent.slice(); | 
|   }; | 
|   /** | 
|    * Get precision used for formatting | 
|    */ | 
|   | 
|   | 
|   Axis.prototype.getPixelPrecision = function (dataExtent) { | 
|     return getPixelPrecision(dataExtent || this.scale.getExtent(), this._extent); | 
|   }; | 
|   /** | 
|    * Set coord extent | 
|    */ | 
|   | 
|   | 
|   Axis.prototype.setExtent = function (start, end) { | 
|     var extent = this._extent; | 
|     extent[0] = start; | 
|     extent[1] = end; | 
|   }; | 
|   /** | 
|    * Convert data to coord. Data is the rank if it has an ordinal scale | 
|    */ | 
|   | 
|   | 
|   Axis.prototype.dataToCoord = function (data, clamp) { | 
|     var extent = this._extent; | 
|     var scale = this.scale; | 
|     data = scale.normalize(data); | 
|   | 
|     if (this.onBand && scale.type === 'ordinal') { | 
|       extent = extent.slice(); | 
|       fixExtentWithBands(extent, scale.count()); | 
|     } | 
|   | 
|     return linearMap(data, NORMALIZED_EXTENT, extent, clamp); | 
|   }; | 
|   /** | 
|    * Convert coord to data. Data is the rank if it has an ordinal scale | 
|    */ | 
|   | 
|   | 
|   Axis.prototype.coordToData = function (coord, clamp) { | 
|     var extent = this._extent; | 
|     var scale = this.scale; | 
|   | 
|     if (this.onBand && scale.type === 'ordinal') { | 
|       extent = extent.slice(); | 
|       fixExtentWithBands(extent, scale.count()); | 
|     } | 
|   | 
|     var t = linearMap(coord, extent, NORMALIZED_EXTENT, clamp); | 
|     return this.scale.scale(t); | 
|   }; | 
|   /** | 
|    * Convert pixel point to data in axis | 
|    */ | 
|   | 
|   | 
|   Axis.prototype.pointToData = function (point, clamp) { | 
|     // Should be implemented in derived class if necessary. | 
|     return; | 
|   }; | 
|   /** | 
|    * Different from `zrUtil.map(axis.getTicks(), axis.dataToCoord, axis)`, | 
|    * `axis.getTicksCoords` considers `onBand`, which is used by | 
|    * `boundaryGap:true` of category axis and splitLine and splitArea. | 
|    * @param opt.tickModel default: axis.model.getModel('axisTick') | 
|    * @param opt.clamp If `true`, the first and the last | 
|    *        tick must be at the axis end points. Otherwise, clip ticks | 
|    *        that outside the axis extent. | 
|    */ | 
|   | 
|   | 
|   Axis.prototype.getTicksCoords = function (opt) { | 
|     opt = opt || {}; | 
|     var tickModel = opt.tickModel || this.getTickModel(); | 
|     var result = createAxisTicks(this, tickModel); | 
|     var ticks = result.ticks; | 
|     var ticksCoords = map(ticks, function (tickVal) { | 
|       return { | 
|         coord: this.dataToCoord(this.scale.type === 'ordinal' ? this.scale.getRawOrdinalNumber(tickVal) : tickVal), | 
|         tickValue: tickVal | 
|       }; | 
|     }, this); | 
|     var alignWithLabel = tickModel.get('alignWithLabel'); | 
|     fixOnBandTicksCoords(this, ticksCoords, alignWithLabel, opt.clamp); | 
|     return ticksCoords; | 
|   }; | 
|   | 
|   Axis.prototype.getMinorTicksCoords = function () { | 
|     if (this.scale.type === 'ordinal') { | 
|       // Category axis doesn't support minor ticks | 
|       return []; | 
|     } | 
|   | 
|     var minorTickModel = this.model.getModel('minorTick'); | 
|     var splitNumber = minorTickModel.get('splitNumber'); // Protection. | 
|   | 
|     if (!(splitNumber > 0 && splitNumber < 100)) { | 
|       splitNumber = 5; | 
|     } | 
|   | 
|     var minorTicks = this.scale.getMinorTicks(splitNumber); | 
|     var minorTicksCoords = map(minorTicks, function (minorTicksGroup) { | 
|       return map(minorTicksGroup, function (minorTick) { | 
|         return { | 
|           coord: this.dataToCoord(minorTick), | 
|           tickValue: minorTick | 
|         }; | 
|       }, this); | 
|     }, this); | 
|     return minorTicksCoords; | 
|   }; | 
|   | 
|   Axis.prototype.getViewLabels = function () { | 
|     return createAxisLabels(this).labels; | 
|   }; | 
|   | 
|   Axis.prototype.getLabelModel = function () { | 
|     return this.model.getModel('axisLabel'); | 
|   }; | 
|   /** | 
|    * Notice here we only get the default tick model. For splitLine | 
|    * or splitArea, we should pass the splitLineModel or splitAreaModel | 
|    * manually when calling `getTicksCoords`. | 
|    * In GL, this method may be overrided to: | 
|    * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));` | 
|    */ | 
|   | 
|   | 
|   Axis.prototype.getTickModel = function () { | 
|     return this.model.getModel('axisTick'); | 
|   }; | 
|   /** | 
|    * Get width of band | 
|    */ | 
|   | 
|   | 
|   Axis.prototype.getBandWidth = function () { | 
|     var axisExtent = this._extent; | 
|     var dataExtent = this.scale.getExtent(); | 
|     var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0); // Fix #2728, avoid NaN when only one data. | 
|   | 
|     len === 0 && (len = 1); | 
|     var size = Math.abs(axisExtent[1] - axisExtent[0]); | 
|     return Math.abs(size) / len; | 
|   }; | 
|   /** | 
|    * Only be called in category axis. | 
|    * Can be overrided, consider other axes like in 3D. | 
|    * @return Auto interval for cateogry axis tick and label | 
|    */ | 
|   | 
|   | 
|   Axis.prototype.calculateCategoryInterval = function () { | 
|     return calculateCategoryInterval(this); | 
|   }; | 
|   | 
|   return Axis; | 
| }(); | 
|   | 
| function fixExtentWithBands(extent, nTick) { | 
|   var size = extent[1] - extent[0]; | 
|   var len = nTick; | 
|   var margin = size / len / 2; | 
|   extent[0] += margin; | 
|   extent[1] -= margin; | 
| } // If axis has labels [1, 2, 3, 4]. Bands on the axis are | 
| // |---1---|---2---|---3---|---4---|. | 
| // So the displayed ticks and splitLine/splitArea should between | 
| // each data item, otherwise cause misleading (e.g., split tow bars | 
| // of a single data item when there are two bar series). | 
| // Also consider if tickCategoryInterval > 0 and onBand, ticks and | 
| // splitLine/spliteArea should layout appropriately corresponding | 
| // to displayed labels. (So we should not use `getBandWidth` in this | 
| // case). | 
|   | 
|   | 
| function fixOnBandTicksCoords(axis, ticksCoords, alignWithLabel, clamp) { | 
|   var ticksLen = ticksCoords.length; | 
|   | 
|   if (!axis.onBand || alignWithLabel || !ticksLen) { | 
|     return; | 
|   } | 
|   | 
|   var axisExtent = axis.getExtent(); | 
|   var last; | 
|   var diffSize; | 
|   | 
|   if (ticksLen === 1) { | 
|     ticksCoords[0].coord = axisExtent[0]; | 
|     last = ticksCoords[1] = { | 
|       coord: axisExtent[0] | 
|     }; | 
|   } else { | 
|     var crossLen = ticksCoords[ticksLen - 1].tickValue - ticksCoords[0].tickValue; | 
|     var shift_1 = (ticksCoords[ticksLen - 1].coord - ticksCoords[0].coord) / crossLen; | 
|     each(ticksCoords, function (ticksItem) { | 
|       ticksItem.coord -= shift_1 / 2; | 
|     }); | 
|     var dataExtent = axis.scale.getExtent(); | 
|     diffSize = 1 + dataExtent[1] - ticksCoords[ticksLen - 1].tickValue; | 
|     last = { | 
|       coord: ticksCoords[ticksLen - 1].coord + shift_1 * diffSize | 
|     }; | 
|     ticksCoords.push(last); | 
|   } | 
|   | 
|   var inverse = axisExtent[0] > axisExtent[1]; // Handling clamp. | 
|   | 
|   if (littleThan(ticksCoords[0].coord, axisExtent[0])) { | 
|     clamp ? ticksCoords[0].coord = axisExtent[0] : ticksCoords.shift(); | 
|   } | 
|   | 
|   if (clamp && littleThan(axisExtent[0], ticksCoords[0].coord)) { | 
|     ticksCoords.unshift({ | 
|       coord: axisExtent[0] | 
|     }); | 
|   } | 
|   | 
|   if (littleThan(axisExtent[1], last.coord)) { | 
|     clamp ? last.coord = axisExtent[1] : ticksCoords.pop(); | 
|   } | 
|   | 
|   if (clamp && littleThan(last.coord, axisExtent[1])) { | 
|     ticksCoords.push({ | 
|       coord: axisExtent[1] | 
|     }); | 
|   } | 
|   | 
|   function littleThan(a, b) { | 
|     // Avoid rounding error cause calculated tick coord different with extent. | 
|     // It may cause an extra unecessary tick added. | 
|     a = round(a); | 
|     b = round(b); | 
|     return inverse ? a > b : a < b; | 
|   } | 
| } | 
|   | 
| export default Axis; |