UNPKG

@devexperts/dxcharts-lite

Version:
63 lines (62 loc) 2.97 kB
/* * Copyright (C) 2019 - 2025 Devexperts Solutions IE Limited * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import { CandleSeriesModel } from '../../model/candle-series.model'; import { flat } from '../../utils/array.utils'; import { avoidAntialiasing } from '../../utils/canvas/canvas-drawing-functions.utils'; import { floorToDPR } from '../../utils/device/device-pixel-ratio.utils'; import { setLineWidth } from '../data-series.drawer'; export class BarDrawer { constructor(config) { this.config = config; } setFillStyle(ctx, hitTestDrawerConfig, candleSeries, visualCandle) { if (hitTestDrawerConfig.color) { ctx.strokeStyle = hitTestDrawerConfig.color; } else { const barTheme = candleSeries.colors.barTheme; if (barTheme) { ctx.strokeStyle = barTheme[`${visualCandle.name}Color`]; } } } draw(ctx, points, candleSeries, hitTestDrawerConfig) { if (candleSeries instanceof CandleSeriesModel) { // @ts-ignore const visualCandles = flat(points); setLineWidth(ctx, this.config.barLineWidth, candleSeries, hitTestDrawerConfig); avoidAntialiasing(ctx, () => { for (const visualCandle of visualCandles) { this.setFillStyle(ctx, hitTestDrawerConfig, candleSeries, visualCandle); ctx.beginPath(); const bodyLineX = candleSeries.view.toX(visualCandle.centerUnit); const openLineStartX = candleSeries.view.toX(visualCandle.startUnit); const [wickStartY, bodyStartY, bodyEndY, wickEndY] = visualCandle.yBodyKeyPoints(candleSeries.view); const w = floorToDPR(candleSeries.view.xPixels(visualCandle.width) / 2); const bodyCloseY = candleSeries.view.toY(visualCandle.close); const bodyOpenY = candleSeries.view.toY(visualCandle.open); if (this.config.showWicks) { ctx.moveTo(bodyLineX, wickStartY); ctx.lineTo(bodyLineX, wickEndY); } else { ctx.moveTo(bodyLineX, bodyStartY); ctx.lineTo(bodyLineX, bodyEndY); } /* close line start */ ctx.moveTo(bodyLineX, bodyCloseY); ctx.lineTo(bodyLineX + w, bodyCloseY); /* close line end */ /* open line start */ ctx.moveTo(openLineStartX, bodyOpenY); ctx.lineTo(bodyLineX, bodyOpenY); /* open line end */ ctx.stroke(); } }); } } }