Skip to content

Commit 8d06e78

Browse files
Improve rendering code
1 parent 476bcda commit 8d06e78

2 files changed

Lines changed: 19 additions & 16 deletions

File tree

plugin-examples/src/plugins/pretty-histogram/example/example.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const options: DeepPartial<PrettyHistogramSeriesOptions> = {
2525
const maxValue = Math.max(baseRes.priceRange.maxValue, 0);
2626
return { ...baseRes, priceRange: { minValue, maxValue } };
2727
},
28-
radius: 2,
28+
radius: 6,
2929
widthPercent: 50,
3030
};
3131

plugin-examples/src/plugins/pretty-histogram/renderer.ts

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { BitmapCoordinatesRenderingScope, CanvasRenderingTarget2D } from 'fancy-canvas';
22

3-
import { CustomBarItemData, ICustomSeriesPaneRenderer, PaneRendererCustomData, PriceToCoordinateConverter, SeriesDataItemTypeMap, SingleValueData } from 'lightweight-charts';
3+
import { CustomBarItemData, ICustomSeriesPaneRenderer, PaneRendererCustomData, PriceToCoordinateConverter } from 'lightweight-charts';
44

55
import { PrettyHistogramSeriesOptions } from './options';
66
import { PrettyHistogramData } from './data';
7+
import { positionsBox } from '../../helpers/dimensions/positions';
78

89
interface PrettyHistogramBarItem {
910
x: number;
@@ -48,38 +49,40 @@ export class PrettyHistogramSeriesRenderer<HorzScaleItem, TData extends PrettyHi
4849
const bars: PrettyHistogramBarItem[] = this._data.bars.map((bar: CustomBarItemData<HorzScaleItem, TData>) => {
4950
return {
5051
x: bar.x * renderingScope.horizontalPixelRatio,
51-
value: priceToCoordinate(bar.originalData.value!)! * renderingScope.verticalPixelRatio,
52+
value: priceToCoordinate(bar.originalData.value!)!,
5253
color: bar.barColor ?? options.color,
5354
};
5455
});
5556

56-
const zeroCoordinate = priceToCoordinate(0)! * renderingScope.verticalPixelRatio;
57+
const zeroCoordinate = priceToCoordinate(0) ?? 0;
5758

5859
const ctx = renderingScope.context;
5960

6061
let prevColor: string | null = null;
6162
ctx.beginPath();
6263
const width = Math.max(1, Math.round(0.01 * options.widthPercent * this._data.barSpacing * renderingScope.horizontalPixelRatio));
6364
const radius = Math.floor(options.radius * renderingScope.horizontalPixelRatio);
64-
bars.forEach((item: PrettyHistogramBarItem) => {
65+
bars.slice(this._data.visibleRange.from, this._data.visibleRange.to + 1).forEach((item: PrettyHistogramBarItem) => {
6566
const color = item.color;
6667
if (prevColor !== null && prevColor !== color) {
6768
ctx.fill();
6869
ctx.beginPath();
6970
}
7071
ctx.fillStyle = color;
71-
const height = item.value - zeroCoordinate;
72-
const actualRadius = Math.floor(Math.min(radius, width / 2, Math.abs(height)));
73-
const vertRadius = Math.sign(height) * actualRadius;
72+
const yPositionBox = positionsBox(
73+
zeroCoordinate,
74+
item.value,
75+
renderingScope.verticalPixelRatio
76+
)
77+
const actualRadius = Math.floor(Math.min(radius, width / 2, Math.abs(yPositionBox.length)));
7478
const left = Math.round(item.x - width / 2);
75-
const right = left + width;
76-
ctx.moveTo(left, zeroCoordinate);
77-
ctx.lineTo(left, item.value - vertRadius);
78-
ctx.arcTo(left, item.value, left + actualRadius, item.value, actualRadius);
79-
ctx.lineTo(right - actualRadius, item.value);
80-
ctx.arcTo(right, item.value, right, item.value - vertRadius, actualRadius);
81-
ctx.lineTo(right, zeroCoordinate);
82-
ctx.lineTo(left, zeroCoordinate);
79+
ctx.roundRect(
80+
left,
81+
yPositionBox.position,
82+
width,
83+
yPositionBox.length,
84+
item.value < zeroCoordinate ? [actualRadius, actualRadius, 0, 0] : [0, 0, actualRadius, actualRadius]
85+
);
8386
prevColor = color;
8487
});
8588
ctx.fill();

0 commit comments

Comments
 (0)