cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
146 lines (145 loc) • 6.25 kB
JavaScript
import { subPixelOptimize } from "../../util/graphic.mjs";
import createRenderPlanner from "../helper/createRenderPlanner.mjs";
import { parsePercent } from "../../util/number.mjs";
import { map, retrieve2 } from "../../../../zrender/lib/core/util.mjs";
import { createFloat32Array } from "../../util/vendor.mjs";
var candlestickLayout = {
seriesType: "candlestick",
plan: createRenderPlanner(),
reset: function(seriesModel) {
var coordSys = seriesModel.coordinateSystem;
var data = seriesModel.getData();
var candleWidth = calculateCandleWidth(seriesModel, data);
var cDimIdx = 0;
var vDimIdx = 1;
var coordDims = ["x", "y"];
var cDimI = data.getDimensionIndex(data.mapDimension(coordDims[cDimIdx]));
var vDimsI = map(data.mapDimensionsAll(coordDims[vDimIdx]), data.getDimensionIndex, data);
var openDimI = vDimsI[0];
var closeDimI = vDimsI[1];
var lowestDimI = vDimsI[2];
var highestDimI = vDimsI[3];
data.setLayout({
candleWidth,
isSimpleBox: candleWidth <= 1.3
});
if (cDimI < 0 || vDimsI.length < 4) {
return;
}
return {
progress: seriesModel.pipelineContext.large ? largeProgress : normalProgress
};
function normalProgress(params, data2) {
var dataIndex;
var store = data2.getStore();
while ((dataIndex = params.next()) != null) {
var axisDimVal = store.get(cDimI, dataIndex);
var openVal = store.get(openDimI, dataIndex);
var closeVal = store.get(closeDimI, dataIndex);
var lowestVal = store.get(lowestDimI, dataIndex);
var highestVal = store.get(highestDimI, dataIndex);
var ocLow = Math.min(openVal, closeVal);
var ocHigh = Math.max(openVal, closeVal);
var ocLowPoint = getPoint(ocLow, axisDimVal);
var ocHighPoint = getPoint(ocHigh, axisDimVal);
var lowestPoint = getPoint(lowestVal, axisDimVal);
var highestPoint = getPoint(highestVal, axisDimVal);
var ends = [];
addBodyEnd(ends, ocHighPoint, 0);
addBodyEnd(ends, ocLowPoint, 1);
ends.push(subPixelOptimizePoint(highestPoint), subPixelOptimizePoint(ocHighPoint), subPixelOptimizePoint(lowestPoint), subPixelOptimizePoint(ocLowPoint));
var itemModel = data2.getItemModel(dataIndex);
var hasDojiColor = !!itemModel.get(["itemStyle", "borderColorDoji"]);
data2.setItemLayout(dataIndex, {
sign: getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor),
initBaseline: openVal > closeVal ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx],
ends,
brushRect: makeBrushRect(lowestVal, highestVal, axisDimVal)
});
}
function getPoint(val, axisDimVal2) {
var p = [];
p[cDimIdx] = axisDimVal2;
p[vDimIdx] = val;
return isNaN(axisDimVal2) || isNaN(val) ? [NaN, NaN] : coordSys.dataToPoint(p);
}
function addBodyEnd(ends2, point, start) {
var point1 = point.slice();
var point2 = point.slice();
point1[cDimIdx] = subPixelOptimize(point1[cDimIdx] + candleWidth / 2, 1, false);
point2[cDimIdx] = subPixelOptimize(point2[cDimIdx] - candleWidth / 2, 1, true);
start ? ends2.push(point1, point2) : ends2.push(point2, point1);
}
function makeBrushRect(lowestVal2, highestVal2, axisDimVal2) {
var pmin = getPoint(lowestVal2, axisDimVal2);
var pmax = getPoint(highestVal2, axisDimVal2);
pmin[cDimIdx] -= candleWidth / 2;
pmax[cDimIdx] -= candleWidth / 2;
return {
x: pmin[0],
y: pmin[1],
width: candleWidth,
height: pmax[1] - pmin[1]
};
}
function subPixelOptimizePoint(point) {
point[cDimIdx] = subPixelOptimize(point[cDimIdx], 1);
return point;
}
}
function largeProgress(params, data2) {
var points = createFloat32Array(params.count * 4);
var offset = 0;
var point;
var tmpIn = [];
var tmpOut = [];
var dataIndex;
var store = data2.getStore();
var hasDojiColor = !!seriesModel.get(["itemStyle", "borderColorDoji"]);
while ((dataIndex = params.next()) != null) {
var axisDimVal = store.get(cDimI, dataIndex);
var openVal = store.get(openDimI, dataIndex);
var closeVal = store.get(closeDimI, dataIndex);
var lowestVal = store.get(lowestDimI, dataIndex);
var highestVal = store.get(highestDimI, dataIndex);
if (isNaN(axisDimVal) || isNaN(lowestVal) || isNaN(highestVal)) {
points[offset++] = NaN;
offset += 3;
continue;
}
points[offset++] = getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor);
tmpIn[cDimIdx] = axisDimVal;
tmpIn[vDimIdx] = lowestVal;
point = coordSys.dataToPoint(tmpIn, null, tmpOut);
points[offset++] = point ? point[0] : NaN;
points[offset++] = point ? point[1] : NaN;
tmpIn[vDimIdx] = highestVal;
point = coordSys.dataToPoint(tmpIn, null, tmpOut);
points[offset++] = point ? point[1] : NaN;
}
data2.setLayout("largePoints", points);
}
}
};
function getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor) {
var sign;
if (openVal > closeVal) {
sign = -1;
} else if (openVal < closeVal) {
sign = 1;
} else {
sign = hasDojiColor ? 0 : dataIndex > 0 ? store.get(closeDimI, dataIndex - 1) <= closeVal ? 1 : -1 : 1;
}
return sign;
}
function calculateCandleWidth(seriesModel, data) {
var baseAxis = seriesModel.getBaseAxis();
var extent;
var bandWidth = baseAxis.type === "category" ? baseAxis.getBandWidth() : (extent = baseAxis.getExtent(), Math.abs(extent[1] - extent[0]) / data.count());
var barMaxWidth = parsePercent(retrieve2(seriesModel.get("barMaxWidth"), bandWidth), bandWidth);
var barMinWidth = parsePercent(retrieve2(seriesModel.get("barMinWidth"), 1), bandWidth);
var barWidth = seriesModel.get("barWidth");
return barWidth != null ? parsePercent(barWidth, bandWidth) : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth);
}
var candlestickLayout$1 = candlestickLayout;
export { candlestickLayout$1 as default };