Spaces:
Running
Running
/* | |
* 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. | |
*/ | |
/* global Float32Array */ | |
import createRenderPlanner from '../helper/createRenderPlanner'; | |
import { StageHandler } from '../../util/types'; | |
import LinesSeriesModel, {LinesDataItemOption} from './LinesSeries'; | |
import { error } from '../../util/log'; | |
const linesLayout: StageHandler = { | |
seriesType: 'lines', | |
plan: createRenderPlanner(), | |
reset: function (seriesModel: LinesSeriesModel) { | |
const coordSys = seriesModel.coordinateSystem; | |
if (!coordSys) { | |
if (__DEV__) { | |
error('The lines series must have a coordinate system.'); | |
} | |
return; | |
} | |
const isPolyline = seriesModel.get('polyline'); | |
const isLarge = seriesModel.pipelineContext.large; | |
return { | |
progress(params, lineData) { | |
const lineCoords: number[][] = []; | |
if (isLarge) { | |
let points; | |
const segCount = params.end - params.start; | |
if (isPolyline) { | |
let totalCoordsCount = 0; | |
for (let i = params.start; i < params.end; i++) { | |
totalCoordsCount += seriesModel.getLineCoordsCount(i); | |
} | |
points = new Float32Array(segCount + totalCoordsCount * 2); | |
} | |
else { | |
points = new Float32Array(segCount * 4); | |
} | |
let offset = 0; | |
let pt: number[] = []; | |
for (let i = params.start; i < params.end; i++) { | |
const len = seriesModel.getLineCoords(i, lineCoords); | |
if (isPolyline) { | |
points[offset++] = len; | |
} | |
for (let k = 0; k < len; k++) { | |
pt = coordSys.dataToPoint(lineCoords[k], false, pt); | |
points[offset++] = pt[0]; | |
points[offset++] = pt[1]; | |
} | |
} | |
lineData.setLayout('linesPoints', points); | |
} | |
else { | |
for (let i = params.start; i < params.end; i++) { | |
const itemModel = lineData.getItemModel<LinesDataItemOption>(i); | |
const len = seriesModel.getLineCoords(i, lineCoords); | |
const pts = []; | |
if (isPolyline) { | |
for (let j = 0; j < len; j++) { | |
pts.push(coordSys.dataToPoint(lineCoords[j])); | |
} | |
} | |
else { | |
pts[0] = coordSys.dataToPoint(lineCoords[0]); | |
pts[1] = coordSys.dataToPoint(lineCoords[1]); | |
const curveness = itemModel.get(['lineStyle', 'curveness']); | |
if (+curveness) { | |
pts[2] = [ | |
(pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness, | |
(pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness | |
]; | |
} | |
} | |
lineData.setItemLayout(i, pts); | |
} | |
} | |
} | |
}; | |
} | |
}; | |
export default linesLayout; | |