/* * 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 {map} from 'zrender/src/core/util'; import createRenderPlanner from '../chart/helper/createRenderPlanner'; import {isDimensionStacked} from '../data/helper/dataStackHelper'; import SeriesModel from '../model/Series'; import { StageHandler, ParsedValueNumeric } from '../util/types'; import { createFloat32Array } from '../util/vendor'; export default function pointsLayout(seriesType: string, forceStoreInTypedArray?: boolean): StageHandler { return { seriesType: seriesType, plan: createRenderPlanner(), reset: function (seriesModel: SeriesModel) { const data = seriesModel.getData(); const coordSys = seriesModel.coordinateSystem; const pipelineContext = seriesModel.pipelineContext; const useTypedArray = forceStoreInTypedArray || pipelineContext.large; if (!coordSys) { return; } const dims = map(coordSys.dimensions, function (dim) { return data.mapDimension(dim); }).slice(0, 2); const dimLen = dims.length; const stackResultDim = data.getCalculationInfo('stackResultDimension'); if (isDimensionStacked(data, dims[0])) { dims[0] = stackResultDim; } if (isDimensionStacked(data, dims[1])) { dims[1] = stackResultDim; } const store = data.getStore(); const dimIdx0 = data.getDimensionIndex(dims[0]); const dimIdx1 = data.getDimensionIndex(dims[1]); return dimLen && { progress(params, data) { const segCount = params.end - params.start; const points = useTypedArray && createFloat32Array(segCount * dimLen); const tmpIn: ParsedValueNumeric[] = []; const tmpOut: number[] = []; for (let i = params.start, offset = 0; i < params.end; i++) { let point; if (dimLen === 1) { const x = store.get(dimIdx0, i) as ParsedValueNumeric; // NOTE: Make sure the second parameter is null to use default strategy. point = coordSys.dataToPoint(x, null, tmpOut); } else { tmpIn[0] = store.get(dimIdx0, i) as ParsedValueNumeric; tmpIn[1] = store.get(dimIdx1, i) as ParsedValueNumeric; // Let coordinate system to handle the NaN data. point = coordSys.dataToPoint(tmpIn, null, tmpOut); } if (useTypedArray) { points[offset++] = point[0]; points[offset++] = point[1]; } else { data.setItemLayout(i, point.slice()); } } useTypedArray && data.setLayout('points', points); } }; } }; };