@devexperts/dxcharts-lite 1.0.2 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/README.md +2 -2
  2. package/dist/chart/animation/canvas-animation.js +134 -1
  3. package/dist/chart/animation/types/animation.js +43 -1
  4. package/dist/chart/animation/types/color-alpha-animation.d.ts +1 -1
  5. package/dist/chart/animation/types/color-alpha-animation.js +60 -1
  6. package/dist/chart/animation/types/color-transition-animation.d.ts +1 -1
  7. package/dist/chart/animation/types/color-transition-animation.js +86 -1
  8. package/dist/chart/animation/types/viewport-movement-animation.js +63 -1
  9. package/dist/chart/animation/viewport-model-animation.js +20 -1
  10. package/dist/chart/bootstrap.d.ts +51 -48
  11. package/dist/chart/bootstrap.js +449 -1
  12. package/dist/chart/canvas/canvas-bounds-container.d.ts +0 -5
  13. package/dist/chart/canvas/canvas-bounds-container.js +815 -1
  14. package/dist/chart/canvas/canvas-chart-html.js +16 -18
  15. package/dist/chart/canvas/chart-elements.d.ts +1 -4
  16. package/dist/chart/canvas/chart-elements.js +22 -1
  17. package/dist/chart/canvas/cursor.handler.js +122 -1
  18. package/dist/chart/canvas/layout-creator.js +34 -1
  19. package/dist/chart/canvas/y-axis-bounds.container.d.ts +2 -2
  20. package/dist/chart/canvas/y-axis-bounds.container.js +67 -1
  21. package/dist/chart/chart-container.js +1 -1
  22. package/dist/chart/chart.config.d.ts +4 -5
  23. package/dist/chart/chart.config.js +645 -1
  24. package/dist/chart/chart.d.ts +62 -0
  25. package/dist/chart/chart.js +106 -0
  26. package/dist/chart/components/chart/basic-scale.d.ts +2 -2
  27. package/dist/chart/components/chart/basic-scale.js +31 -1
  28. package/dist/chart/components/chart/candle-transformer.functions.js +15 -1
  29. package/dist/chart/components/chart/candle-width-calculator.functions.js +2 -1
  30. package/dist/chart/components/chart/candle.functions.js +44 -1
  31. package/dist/chart/components/chart/chart-area-pan.handler.d.ts +3 -3
  32. package/dist/chart/components/chart/chart-area-pan.handler.js +197 -1
  33. package/dist/chart/components/chart/chart-base.model.js +66 -1
  34. package/dist/chart/components/chart/chart.component.d.ts +7 -3
  35. package/dist/chart/components/chart/chart.component.js +408 -1
  36. package/dist/chart/components/chart/chart.model.d.ts +4 -11
  37. package/dist/chart/components/chart/chart.model.js +954 -1
  38. package/dist/chart/components/chart/data-series.high-low-provider.js +34 -1
  39. package/dist/chart/components/chart/fake-candles.js +97 -1
  40. package/dist/chart/components/chart/price.formatter.js +35 -1
  41. package/dist/chart/components/chart/secondary-chart-colors-pool.js +68 -1
  42. package/dist/chart/components/cross_tool/cross-tool.component.js +85 -1
  43. package/dist/chart/components/cross_tool/cross-tool.drawer.js +32 -1
  44. package/dist/chart/components/cross_tool/cross-tool.model.js +107 -1
  45. package/dist/chart/components/cross_tool/types/cross-and-labels.drawer.js +137 -1
  46. package/dist/chart/components/cross_tool/types/none.drawer.js +3 -1
  47. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-x.component.js +28 -1
  48. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-y.component.js +24 -1
  49. package/dist/chart/components/dran-n-drop_helper/drag-n-drop.component.js +53 -1
  50. package/dist/chart/components/dynamic-objects/dynamic-objects.component.d.ts +13 -0
  51. package/dist/chart/components/dynamic-objects/dynamic-objects.component.js +20 -0
  52. package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.d.ts +18 -0
  53. package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.js +23 -0
  54. package/dist/chart/components/dynamic-objects/dynamic-objects.model.d.ts +63 -0
  55. package/dist/chart/components/dynamic-objects/dynamic-objects.model.js +136 -0
  56. package/dist/chart/components/events/events-hit-test.drawer.js +63 -1
  57. package/dist/chart/components/events/events.component.js +61 -1
  58. package/dist/chart/components/events/events.drawer.js +195 -1
  59. package/dist/chart/components/events/events.model.js +69 -1
  60. package/dist/chart/components/grid/grid.component.d.ts +2 -2
  61. package/dist/chart/components/grid/grid.component.js +31 -1
  62. package/dist/chart/components/grid/grid.drawer.d.ts +4 -3
  63. package/dist/chart/components/grid/grid.drawer.js +106 -1
  64. package/dist/chart/components/high_low/high-low.component.js +12 -1
  65. package/dist/chart/components/high_low/high-low.drawer.js +126 -1
  66. package/dist/chart/components/highlights/highlights.component.js +46 -1
  67. package/dist/chart/components/highlights/highlights.drawer.js +154 -1
  68. package/dist/chart/components/highlights/highlights.model.js +75 -1
  69. package/dist/chart/components/labels_generator/numeric-axis-labels.generator.d.ts +1 -1
  70. package/dist/chart/components/labels_generator/numeric-axis-labels.generator.js +199 -1
  71. package/dist/chart/components/navigation_map/navigation-map-move.handler.d.ts +2 -2
  72. package/dist/chart/components/navigation_map/navigation-map-move.handler.js +108 -1
  73. package/dist/chart/components/navigation_map/navigation-map.component.js +112 -1
  74. package/dist/chart/components/navigation_map/navigation-map.drawer.js +244 -1
  75. package/dist/chart/components/navigation_map/navigation-map.model.js +33 -2
  76. package/dist/chart/components/pan/chart-pan.component.d.ts +2 -2
  77. package/dist/chart/components/pan/chart-pan.component.js +51 -1
  78. package/dist/chart/components/pane/extent/y-extent-component.d.ts +12 -18
  79. package/dist/chart/components/pane/extent/y-extent-component.js +120 -1
  80. package/dist/chart/components/pane/pane-hit-test.controller.d.ts +2 -2
  81. package/dist/chart/components/pane/pane-hit-test.controller.js +55 -1
  82. package/dist/chart/components/pane/pane-manager.component.d.ts +12 -6
  83. package/dist/chart/components/pane/pane-manager.component.js +149 -1
  84. package/dist/chart/components/pane/pane.component.d.ts +16 -32
  85. package/dist/chart/components/pane/pane.component.js +278 -1
  86. package/dist/chart/components/resizer/bar-resizer.component.js +139 -1
  87. package/dist/chart/components/resizer/bar-resizer.drawer.js +46 -1
  88. package/dist/chart/components/snapshot/snapshot.component.js +48 -1
  89. package/dist/chart/components/volumes/separate-volumes.component.d.ts +6 -10
  90. package/dist/chart/components/volumes/separate-volumes.component.js +63 -1
  91. package/dist/chart/components/volumes/volume-color-resolvers.functions.js +18 -1
  92. package/dist/chart/components/volumes/volumes.component.d.ts +6 -7
  93. package/dist/chart/components/volumes/volumes.component.js +94 -1
  94. package/dist/chart/components/volumes/volumes.drawer.d.ts +5 -12
  95. package/dist/chart/components/volumes/volumes.drawer.js +140 -1
  96. package/dist/chart/components/volumes/volumes.formatter.js +31 -1
  97. package/dist/chart/components/volumes/volumes.model.d.ts +2 -2
  98. package/dist/chart/components/volumes/volumes.model.js +43 -1
  99. package/dist/chart/components/watermark/water-mark.component.js +103 -1
  100. package/dist/chart/components/watermark/water-mark.drawer.js +187 -1
  101. package/dist/chart/components/x_axis/numeric-x-axis-labels.generator.js +27 -1
  102. package/dist/chart/components/x_axis/time/parser/time-formats-matchers.functions.js +187 -1
  103. package/dist/chart/components/x_axis/time/parser/time-formats-parser.functions.js +76 -1
  104. package/dist/chart/components/x_axis/time/parser/time-formats-validators.functions.js +79 -1
  105. package/dist/chart/components/x_axis/time/parser/time-formats.model.js +14 -1
  106. package/dist/chart/components/x_axis/time/x-axis-weights.functions.d.ts +1 -1
  107. package/dist/chart/components/x_axis/time/x-axis-weights.functions.js +143 -1
  108. package/dist/chart/components/x_axis/time/x-axis-weights.generator.js +73 -1
  109. package/dist/chart/components/x_axis/x-axis-draw.functions.js +49 -1
  110. package/dist/chart/components/x_axis/x-axis-labels.drawer.js +70 -1
  111. package/dist/chart/components/x_axis/x-axis-labels.generator.d.ts +2 -2
  112. package/dist/chart/components/x_axis/x-axis-labels.generator.js +332 -1
  113. package/dist/chart/components/x_axis/x-axis-labels.model.js +35 -1
  114. package/dist/chart/components/x_axis/x-axis-scale.handler.d.ts +2 -2
  115. package/dist/chart/components/x_axis/x-axis-scale.handler.js +60 -1
  116. package/dist/chart/components/x_axis/x-axis-time-labels.drawer.js +82 -1
  117. package/dist/chart/components/x_axis/x-axis.component.d.ts +2 -2
  118. package/dist/chart/components/x_axis/x-axis.component.js +119 -1
  119. package/dist/chart/components/y_axis/label-color.functions.js +53 -1
  120. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.d.ts +4 -4
  121. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.js +33 -1
  122. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.d.ts +3 -3
  123. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.js +67 -1
  124. package/dist/chart/components/y_axis/price_labels/labels-positions-calculator.js +56 -1
  125. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.d.ts +4 -3
  126. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.js +96 -1
  127. package/dist/chart/components/y_axis/price_labels/price-label.drawer.d.ts +2 -2
  128. package/dist/chart/components/y_axis/price_labels/price-label.drawer.js +119 -1
  129. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.d.ts +9 -8
  130. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.js +201 -1
  131. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.d.ts +6 -7
  132. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.js +58 -1
  133. package/dist/chart/components/y_axis/y-axis-base-labels.model.d.ts +6 -4
  134. package/dist/chart/components/y_axis/y-axis-base-labels.model.js +47 -1
  135. package/dist/chart/components/y_axis/y-axis-labels.drawer.d.ts +4 -4
  136. package/dist/chart/components/y_axis/y-axis-labels.drawer.js +161 -1
  137. package/dist/chart/components/y_axis/y-axis-scale.handler.d.ts +2 -2
  138. package/dist/chart/components/y_axis/y-axis-scale.handler.js +72 -1
  139. package/dist/chart/components/y_axis/y-axis.component.d.ts +32 -41
  140. package/dist/chart/components/y_axis/y-axis.component.js +220 -1
  141. package/dist/chart/components/y_axis/y-axis.drawer.d.ts +9 -12
  142. package/dist/chart/components/y_axis/y-axis.drawer.js +96 -1
  143. package/dist/chart/components/y_axis/y-axis.model.d.ts +10 -17
  144. package/dist/chart/components/y_axis/y-axis.model.js +34 -1
  145. package/dist/chart/drawers/chart-background.drawer.js +69 -1
  146. package/dist/chart/drawers/chart-type-drawers/area.drawer.js +69 -1
  147. package/dist/chart/drawers/chart-type-drawers/bar.drawer.js +57 -1
  148. package/dist/chart/drawers/chart-type-drawers/baseline.drawer.js +84 -1
  149. package/dist/chart/drawers/chart-type-drawers/candle.drawer.js +162 -1
  150. package/dist/chart/drawers/chart-type-drawers/histogram.drawer.js +57 -1
  151. package/dist/chart/drawers/chart-type-drawers/line.drawer.js +38 -1
  152. package/dist/chart/drawers/chart-type-drawers/scatter-plot.drawer.js +19 -1
  153. package/dist/chart/drawers/clear-canvas.drawer.js +14 -1
  154. package/dist/chart/drawers/composite.drawer.js +67 -1
  155. package/dist/chart/drawers/data-series-drawers/candle-series-wrapper.js +50 -1
  156. package/dist/chart/drawers/data-series-drawers/color-candle.drawer.js +35 -1
  157. package/dist/chart/drawers/data-series-drawers/data-series-drawers.utils.js +16 -1
  158. package/dist/chart/drawers/data-series-drawers/difference-cloud.drawer.js +106 -1
  159. package/dist/chart/drawers/data-series-drawers/histogram.drawer.js +23 -1
  160. package/dist/chart/drawers/data-series-drawers/linear.drawer.js +19 -1
  161. package/dist/chart/drawers/data-series-drawers/points.drawer.js +19 -1
  162. package/dist/chart/drawers/data-series-drawers/rectangular-tool.drawer.js +7 -1
  163. package/dist/chart/drawers/data-series-drawers/text.drawer.js +25 -1
  164. package/dist/chart/drawers/data-series-drawers/trend-histogram.drawer.js +35 -1
  165. package/dist/chart/drawers/data-series-drawers/triangle.drawer.js +22 -1
  166. package/dist/chart/drawers/data-series.drawer.d.ts +5 -7
  167. package/dist/chart/drawers/data-series.drawer.js +56 -1
  168. package/dist/chart/drawers/drawing-manager.d.ts +1 -1
  169. package/dist/chart/drawers/drawing-manager.js +177 -1
  170. package/dist/chart/drawers/ht-data-series.drawer.js +37 -1
  171. package/dist/chart/events/event-bus.js +73 -1
  172. package/dist/chart/events/events.js +3 -1
  173. package/dist/chart/inputhandlers/candle-tap.handler.js +46 -1
  174. package/dist/chart/inputhandlers/chart-resize.handler.js +98 -1
  175. package/dist/chart/inputhandlers/cross-event-producer.component.js +67 -1
  176. package/dist/chart/inputhandlers/hover-producer.component.d.ts +2 -2
  177. package/dist/chart/inputhandlers/hover-producer.component.js +228 -1
  178. package/dist/chart/inputhandlers/main-canvas-touch.handler.d.ts +2 -2
  179. package/dist/chart/inputhandlers/main-canvas-touch.handler.js +80 -1
  180. package/dist/chart/inputlisteners/canvas-input-listener.component.js +629 -1
  181. package/dist/chart/model/baseline.model.js +88 -1
  182. package/dist/chart/model/bounds.model.js +1 -1
  183. package/dist/chart/model/candle-hover.js +70 -1
  184. package/dist/chart/model/candle-series-high-low.provider.js +45 -1
  185. package/dist/chart/model/candle-series.model.d.ts +3 -3
  186. package/dist/chart/model/candle-series.model.js +245 -1
  187. package/dist/chart/model/candle.model.js +69 -1
  188. package/dist/chart/model/canvas.model.js +228 -1
  189. package/dist/chart/model/chart-base-element.js +129 -1
  190. package/dist/chart/model/compare-series-hover.js +25 -1
  191. package/dist/chart/model/data-series-view.d.ts +5 -5
  192. package/dist/chart/model/data-series-view.js +111 -1
  193. package/dist/chart/model/data-series.config.js +14 -1
  194. package/dist/chart/model/data-series.model.d.ts +4 -4
  195. package/dist/chart/model/data-series.model.js +281 -1
  196. package/dist/chart/model/date-time.formatter.js +151 -1
  197. package/dist/chart/model/hit-test-canvas.model.d.ts +1 -1
  198. package/dist/chart/model/hit-test-canvas.model.js +256 -1
  199. package/dist/chart/model/main-candle-series.model.d.ts +1 -1
  200. package/dist/chart/model/main-candle-series.model.js +29 -1
  201. package/dist/chart/model/scale.model.d.ts +3 -2
  202. package/dist/chart/model/scale.model.js +316 -1
  203. package/dist/chart/model/scaling/auto-scale.model.d.ts +2 -4
  204. package/dist/chart/model/scaling/auto-scale.model.js +91 -1
  205. package/dist/chart/model/scaling/constrait.functions.js +61 -1
  206. package/dist/chart/model/scaling/lock-ratio.model.js +17 -1
  207. package/dist/chart/model/scaling/move-chart.functions.js +22 -1
  208. package/dist/chart/model/scaling/viewport.model.d.ts +2 -2
  209. package/dist/chart/model/scaling/viewport.model.js +279 -1
  210. package/dist/chart/model/scaling/x-zooming.functions.js +35 -1
  211. package/dist/chart/model/time-zone.model.js +109 -1
  212. package/dist/chart/model/visual-candle.js +134 -1
  213. package/dist/chart/utils/__tests__/array.utils.test.js +135 -1
  214. package/dist/chart/utils/__tests__/math.utils.test.js +14 -1
  215. package/dist/chart/utils/__tests__/object.utils.test.js +11 -1
  216. package/dist/chart/utils/__tests__/priceIncrementsUtils.test.js +29 -1
  217. package/dist/chart/utils/array.utils.d.ts +1 -1
  218. package/dist/chart/utils/array.utils.js +269 -1
  219. package/dist/chart/utils/auto-period-detector.utils.js +39 -1
  220. package/dist/chart/utils/candles-generator-ts.utils.js +20 -1
  221. package/dist/chart/utils/candles-generator.utils.js +161 -1
  222. package/dist/chart/utils/candles.utils.js +42 -1
  223. package/dist/chart/utils/canvas/canvas-drawing-functions.utils.js +144 -1
  224. package/dist/chart/utils/canvas/canvas-font-measure-tool.utils.js +51 -1
  225. package/dist/chart/utils/canvas/canvas-text-functions.utils.js +156 -1
  226. package/dist/chart/utils/color.utils.js +31 -1
  227. package/dist/chart/utils/device/browser.utils.js +10 -1
  228. package/dist/chart/utils/device/device-detector.utils.js +24 -1
  229. package/dist/chart/utils/device/device-pixel-ratio.utils.js +21 -1
  230. package/dist/chart/utils/device/touchpad.utils.js +91 -1
  231. package/dist/chart/utils/dom.utils.js +15 -1
  232. package/dist/chart/utils/function.utils.js +16 -1
  233. package/dist/chart/utils/linkedList.utils.d.ts +28 -0
  234. package/dist/chart/utils/linkedList.utils.js +138 -0
  235. package/dist/chart/utils/math.utils.js +115 -1
  236. package/dist/chart/utils/merge.utils.js +56 -1
  237. package/dist/chart/utils/object.utils.js +43 -1
  238. package/dist/chart/utils/performance/animation-frame-cache.utils.js +77 -0
  239. package/dist/chart/utils/{perfomance → performance}/debounce.utils.js +7 -1
  240. package/dist/chart/utils/performance/memoize.utils.js +74 -0
  241. package/dist/chart/utils/performance/request-animation-frame-throttle.utils.js +43 -0
  242. package/dist/chart/utils/performance/throttle.utils.js +26 -0
  243. package/dist/chart/utils/price-increments.utils.d.ts +1 -0
  244. package/dist/chart/utils/price-increments.utils.js +127 -1
  245. package/dist/chart/utils/uuid.utils.js +4 -1
  246. package/dist/dxchart.min.js +9 -12
  247. package/dist/index.d.ts +3 -3
  248. package/dist/index.js +20 -1
  249. package/package.json +4 -4
  250. package/dist/chart/utils/perfomance/animation-frame-cache.utils.js +0 -6
  251. package/dist/chart/utils/perfomance/memoize.utils.js +0 -6
  252. package/dist/chart/utils/perfomance/request-animation-frame-throttle.utils.js +0 -6
  253. package/dist/chart/utils/perfomance/throttle.utils.js +0 -6
  254. /package/dist/chart/utils/{perfomance → performance}/animation-frame-cache.utils.d.ts +0 -0
  255. /package/dist/chart/utils/{perfomance → performance}/debounce.utils.d.ts +0 -0
  256. /package/dist/chart/utils/{perfomance → performance}/memoize.utils.d.ts +0 -0
  257. /package/dist/chart/utils/{perfomance → performance}/request-animation-frame-throttle.utils.d.ts +0 -0
  258. /package/dist/chart/utils/{perfomance → performance}/throttle.utils.d.ts +0 -0
@@ -3,12 +3,13 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import { ChartConfigComponentsYAxis, FullChartConfig } from '../../chart.config';
7
- import { CanvasModel } from '../../model/canvas.model';
8
- import { NumericAxisLabel } from '../labels_generator/numeric-axis-labels.generator';
6
+ import { FullChartConfig } from '../../chart.config';
9
7
  import { Drawer } from '../../drawers/drawing-manager';
10
- import { Unit, ViewportModel } from '../../model/scaling/viewport.model';
11
- import { Bounds, BoundsProvider } from '../../model/bounds.model';
8
+ import { Bounds } from '../../model/bounds.model';
9
+ import { CanvasModel } from '../../model/canvas.model';
10
+ import { Unit } from '../../model/scaling/viewport.model';
11
+ import { PaneManager } from '../pane/pane-manager.component';
12
+ import { YAxisComponent } from './y-axis.component';
12
13
  export interface YAxisLabel {
13
14
  readonly text: string;
14
15
  readonly value: Unit;
@@ -23,13 +24,9 @@ export interface YAxisAnimationParameters {
23
24
  */
24
25
  export declare class YAxisDrawer implements Drawer {
25
26
  private fullConfig;
26
- private yAxisState;
27
27
  private canvasModel;
28
- private labelsProvider;
29
- private axisBounds;
30
- private drawPredicate;
31
- private toY;
32
- constructor(fullConfig: FullChartConfig, yAxisState: ChartConfigComponentsYAxis, canvasModel: CanvasModel, labelsProvider: () => Array<NumericAxisLabel>, axisBounds: BoundsProvider, drawPredicate: () => boolean, toY: ViewportModel['toY']);
28
+ private paneManager;
29
+ constructor(fullConfig: FullChartConfig, canvasModel: CanvasModel, paneManager: PaneManager);
33
30
  /**
34
31
  * Draws the axis on the canvas if the drawPredicate is true.
35
32
  * It gets the labels from the labelsProvider and the bounds from the axisBounds.
@@ -48,7 +45,7 @@ export declare class YAxisDrawer implements Drawer {
48
45
  * @param {string} font - The font used for the labels.
49
46
  * @param {string} labelTextColor - The color of the label text.
50
47
  */
51
- drawLabels(ctx: CanvasRenderingContext2D, labels: YAxisLabel[], axisBounds: Bounds, fontHeight: number, font: string, labelTextColor: string): void;
48
+ drawLabels(ctx: CanvasRenderingContext2D, labels: YAxisLabel[], axisBounds: Bounds, fontHeight: number, font: string, labelTextColor: string, yAxis: YAxisComponent): void;
52
49
  /**
53
50
  * Returns an array of canvas IDs.
54
51
  *
@@ -3,4 +3,99 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{getFontFromConfig as x}from"../../chart.config";import{calculateSymbolHeight as f,calculateTextWidth as u}from"../../utils/canvas/canvas-font-measure-tool.utils";import{clipToBounds as y}from"../../drawers/data-series.drawer";export class YAxisDrawer{constructor(e,o,t,s,i,l=()=>!0,r){this.fullConfig=e,this.yAxisState=o,this.canvasModel=t,this.labelsProvider=s,this.axisBounds=i,this.drawPredicate=l,this.toY=r}draw(){if(this.drawPredicate()){const e=this.labelsProvider(),o=this.axisBounds(),t=this.canvasModel.ctx;t.fillStyle=this.getBackgroundColor(),t.fillRect(o.x,o.y,o.width,o.height);const s=x(this.yAxisState),i=f(s,t),l=this.getLabelTextColor();t.save(),y(t,o),this.drawLabels(t,e,o,i,s,l),t.restore()}}drawLabels(e,o,t,s,i,l){e.fillStyle=l,e.font=i;const r=e.measureText("00.0"),a=r.actualBoundingBoxAscent+r.actualBoundingBoxDescent,d=t.y+a,g=t.y+t.height-a;o.forEach(h=>{const c=this.toY(h.value);c>d&&c<g&&m(e,t,h.text,c,s,i,this.yAxisState.labelBoxMargin.end,this.yAxisState.align)})}getCanvasIds(){return[this.canvasModel.canvasId]}getBackgroundColor(){return this.fullConfig.colors.yAxis.backgroundColor}getLabelTextColor(){return this.fullConfig.colors.yAxis.labelTextColor}}const m=(n,e,o,t,s,i,l,r)=>{const a=r==="right"?e.x+e.width-u(o,n,i)-l:e.x+l;n.fillText(o,a,t+s/2-1)};
6
+ import { getFontFromConfig } from '../../chart.config';
7
+ import { clipToBounds } from '../../drawers/data-series.drawer';
8
+ import { calculateSymbolHeight, calculateTextWidth } from '../../utils/canvas/canvas-font-measure-tool.utils';
9
+ /**
10
+ * Draws the Y_AXIS rectangle + it's base labels.
11
+ */
12
+ export class YAxisDrawer {
13
+ constructor(fullConfig, canvasModel, paneManager) {
14
+ this.fullConfig = fullConfig;
15
+ this.canvasModel = canvasModel;
16
+ this.paneManager = paneManager;
17
+ }
18
+ /**
19
+ * Draws the axis on the canvas if the drawPredicate is true.
20
+ * It gets the labels from the labelsProvider and the bounds from the axisBounds.
21
+ * It sets the background color of the axis and fills the background rectangle.
22
+ * It gets the font from the yAxisState and calculates the font height.
23
+ * It saves the context, clips it to the bounds and draws the labels with the given font and text color.
24
+ * @function
25
+ */
26
+ draw() {
27
+ this.paneManager.yExtents.forEach(extent => {
28
+ const yAxisComponent = extent.yAxis;
29
+ if (yAxisComponent.state.visible) {
30
+ const labels = yAxisComponent.model.baseLabelsModel.labels;
31
+ const bounds = yAxisComponent.getBounds();
32
+ const ctx = this.canvasModel.ctx;
33
+ // draw axis background rect animation
34
+ ctx.fillStyle = this.getBackgroundColor();
35
+ ctx.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
36
+ const font = getFontFromConfig(yAxisComponent.state);
37
+ const fontHeight = calculateSymbolHeight(font, ctx);
38
+ const textColor = this.getLabelTextColor();
39
+ ctx.save();
40
+ clipToBounds(ctx, bounds);
41
+ this.drawLabels(ctx, labels, bounds, fontHeight, font, textColor, yAxisComponent);
42
+ ctx.restore();
43
+ }
44
+ });
45
+ }
46
+ /**
47
+ * Draws labels on the Y-axis of a canvas chart.
48
+ * @param {CanvasRenderingContext2D} ctx - The 2D rendering context of the canvas.
49
+ * @param {YAxisLabel[]} labels - An array of objects containing the value and text of each label.
50
+ * @param {Bounds} axisBounds - An object containing the x, y, width, and height of the Y-axis.
51
+ * @param {number} fontHeight - The height of the font used for the labels.
52
+ * @param {string} font - The font used for the labels.
53
+ * @param {string} labelTextColor - The color of the label text.
54
+ */
55
+ drawLabels(ctx, labels, axisBounds, fontHeight, font, labelTextColor, yAxis) {
56
+ ctx.fillStyle = labelTextColor;
57
+ ctx.font = font;
58
+ const metrics = ctx.measureText('00.0');
59
+ const textHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;
60
+ const topY = axisBounds.y + textHeight;
61
+ const bottomY = axisBounds.y + axisBounds.height - textHeight;
62
+ labels.forEach(label => {
63
+ const y = yAxis.scale.toY(label.value);
64
+ if (y > topY && y < bottomY) {
65
+ drawSimpleLabel(ctx, axisBounds, label.text, y, fontHeight, font, yAxis.state.labelBoxMargin.end, yAxis.state.align);
66
+ }
67
+ });
68
+ }
69
+ /**
70
+ * Returns an array of canvas IDs.
71
+ *
72
+ * @returns {Array<string>} An array containing the canvas ID.
73
+ */
74
+ getCanvasIds() {
75
+ return [this.canvasModel.canvasId];
76
+ }
77
+ /**
78
+ * Returns the background color of the Y-axis.
79
+ *
80
+ * @protected
81
+ * @returns {string} The background color of the Y-axis.
82
+ */
83
+ getBackgroundColor() {
84
+ return this.fullConfig.colors.yAxis.backgroundColor;
85
+ }
86
+ /**
87
+ * Returns the color of the label text for the chart area axis.
88
+ *
89
+ * @protected
90
+ * @returns {string} The color of the label text.
91
+ */
92
+ getLabelTextColor() {
93
+ return this.fullConfig.colors.yAxis.labelTextColor;
94
+ }
95
+ }
96
+ const drawSimpleLabel = (ctx, bounds, text, centralY, fontHeight, font, padding, yAxisAlign) => {
97
+ const xTextBounds = yAxisAlign === 'right'
98
+ ? bounds.x + bounds.width - calculateTextWidth(text, ctx, font) - padding
99
+ : bounds.x + padding;
100
+ ctx.fillText(text, xTextBounds, centralY + fontHeight / 2 - 1); // -1 for font height adjustment
101
+ };
@@ -4,30 +4,23 @@
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
6
  import { CanvasBoundsContainer } from '../../canvas/canvas-bounds-container';
7
- import { FullChartConfig } from '../../chart.config';
7
+ import { YAxisConfig } from '../../chart.config';
8
8
  import EventBus from '../../events/event-bus';
9
9
  import { CanvasModel } from '../../model/canvas.model';
10
10
  import { ChartBaseElement } from '../../model/chart-base-element';
11
+ import { DataSeriesModel } from '../../model/data-series.model';
11
12
  import { ScaleModel } from '../../model/scale.model';
12
- import { ChartModel } from '../chart/chart.model';
13
- import { PaneComponent } from '../pane/pane.component';
14
13
  import { NumericYAxisLabelsGenerator } from './numeric-y-axis-labels.generator';
15
- import { YAxisLabelsModel } from './price_labels/y-axis-labels.model';
14
+ import { FancyYAxisLabelsModel } from './price_labels/y-axis-labels.model';
16
15
  import { YAxisBaseLabelsModel } from './y-axis-base-labels.model';
17
16
  export declare class YAxisModel extends ChartBaseElement {
18
- private config;
17
+ private paneUUID;
18
+ private state;
19
19
  private canvasBoundsContainer;
20
- private canvasModel;
21
- private chartModel;
22
- yAxisLabelsGenerator: NumericYAxisLabelsGenerator;
23
- yAxisBaseLabelsModel: YAxisBaseLabelsModel;
24
- yAxisLabelsModel: YAxisLabelsModel;
25
- constructor(paneComponent: PaneComponent, eventBus: EventBus, config: FullChartConfig, canvasBoundsContainer: CanvasBoundsContainer, canvasModel: CanvasModel, chartModel: ChartModel, scaleModel: ScaleModel);
26
- /**
27
- * This method is used to activate the chart and auto-adjust the width of the Y axis depending on data.
28
- * It subscribes to the candlesSetSubject and invalidates the labelsCache of yAxisLabelsGenerator, updates the labels of yAxisLabelsModel and yAxisBaseLabelsModel, and fires the draw event of canvasModel.
29
- * @protected
30
- * @returns {void}
31
- */
20
+ private extentIdx;
21
+ labelsGenerator: NumericYAxisLabelsGenerator;
22
+ baseLabelsModel: YAxisBaseLabelsModel;
23
+ fancyLabelsModel: FancyYAxisLabelsModel;
24
+ constructor(paneUUID: string, eventBus: EventBus, state: YAxisConfig, canvasBoundsContainer: CanvasBoundsContainer, canvasModel: CanvasModel, scale: ScaleModel, valueFormatter: (value: number) => string, dataSeriesProvider: () => DataSeriesModel | undefined, extentIdx: number);
32
25
  protected doActivate(): void;
33
26
  }
@@ -3,4 +3,37 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{merge as c}from"rxjs";import{ChartBaseElement as b}from"../../model/chart-base-element";import{NumericYAxisLabelsGenerator as x}from"./numeric-y-axis-labels.generator";import{YAxisLabelsModel as A}from"./price_labels/y-axis-labels.model";import{YAxisBaseLabelsModel as u}from"./y-axis-base-labels.model";export class YAxisModel extends b{constructor(t,l,i,d,a,o,n){super(),this.config=i,this.canvasBoundsContainer=d,this.canvasModel=a,this.chartModel=o;const h=t.valueFormatter;this.yAxisLabelsGenerator=new x(null,o,n,h,()=>this.config.components.yAxis.type,()=>this.chartModel.getBaseLine(),i.components.yAxis.labelHeight),this.yAxisBaseLabelsModel=new u(n,this.yAxisLabelsGenerator,this.canvasBoundsContainer),this.addChildEntity(this.yAxisBaseLabelsModel),this.yAxisLabelsModel=new A(l,this.chartModel,this.canvasBoundsContainer,this.config,a,()=>this.canvasBoundsContainer.updateYAxisWidths()),this.addChildEntity(this.yAxisLabelsModel),this.canvasBoundsContainer.yAxisBoundsContainer.registerYAxisWidthContributor({getLargestLabel:()=>{var s;return((s=this.yAxisLabelsGenerator.labelsCache.getLastCachedValue())!==null&&s!==void 0?s:[]).map(e=>e.text).concat(this.yAxisLabelsModel.orderedLabels.flatMap(e=>e.labels).map(e=>e.labelText)).reduce((e,r)=>r.length>e.length?r:e,"")},getYAxisIndex:()=>0,getYAxisAlign:()=>this.config.components.yAxis.align,getPaneUUID:()=>t.uuid})}doActivate(){super.doActivate(),this.addRxSubscription(c(this.chartModel.candlesSetSubject).subscribe(()=>{this.yAxisLabelsGenerator.labelsCache.invalidate(),this.yAxisLabelsModel.updateLabels(),this.yAxisBaseLabelsModel.updateLabels(),this.canvasModel.fireDraw()}))}}
6
+ import { ChartBaseElement } from '../../model/chart-base-element';
7
+ import { NumericYAxisLabelsGenerator } from './numeric-y-axis-labels.generator';
8
+ import { FancyYAxisLabelsModel } from './price_labels/y-axis-labels.model';
9
+ import { YAxisBaseLabelsModel } from './y-axis-base-labels.model';
10
+ export class YAxisModel extends ChartBaseElement {
11
+ constructor(paneUUID, eventBus, state, canvasBoundsContainer, canvasModel, scale, valueFormatter, dataSeriesProvider, extentIdx) {
12
+ super();
13
+ this.paneUUID = paneUUID;
14
+ this.state = state;
15
+ this.canvasBoundsContainer = canvasBoundsContainer;
16
+ this.extentIdx = extentIdx;
17
+ this.labelsGenerator = new NumericYAxisLabelsGenerator(null, dataSeriesProvider, scale, valueFormatter, () => this.state.type, state.labelHeight);
18
+ this.baseLabelsModel = new YAxisBaseLabelsModel(scale, this.labelsGenerator, this.canvasBoundsContainer, paneUUID, extentIdx);
19
+ this.addChildEntity(this.baseLabelsModel);
20
+ this.fancyLabelsModel = new FancyYAxisLabelsModel(eventBus, scale, canvasBoundsContainer, state, canvasModel, paneUUID, () => this.canvasBoundsContainer.updateYAxisWidths());
21
+ this.addChildEntity(this.fancyLabelsModel);
22
+ }
23
+ doActivate() {
24
+ const contributor = {
25
+ getLargestLabel: () => {
26
+ var _a;
27
+ return ((_a = this.labelsGenerator.labelsCache.getLastCachedValue()) !== null && _a !== void 0 ? _a : [])
28
+ .map(label => label.text)
29
+ .concat(this.fancyLabelsModel.orderedLabels.flatMap(l => l.labels).map(l => l.labelText))
30
+ .reduce((maxLengthText, label) => (label.length > maxLengthText.length ? label : maxLengthText), '');
31
+ },
32
+ getYAxisIndex: () => this.extentIdx,
33
+ getYAxisState: () => this.state,
34
+ getPaneUUID: () => this.paneUUID,
35
+ };
36
+ this.canvasBoundsContainer.yAxisBoundsContainer.registerYAxisWidthContributor(contributor);
37
+ this.addSubscription(() => this.canvasBoundsContainer.yAxisBoundsContainer.removeYAxisWidthContributor(contributor));
38
+ }
39
+ }
@@ -3,4 +3,72 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{getDPR as f}from"../utils/device/device-pixel-ratio.utils";import{deepEqual as p}from"../utils/object.utils";import{floor as s}from"../utils/math.utils";export class BackgroundDrawer{constructor(e,o){this.canvasModel=e,this.config=o,this.prevState={},this.prevWidth=0,this.prevHeight=0}draw(){if(p(this.config.colors.chartAreaTheme,this.prevState)&&this.prevHeight===this.canvasModel.height&&this.prevWidth===this.canvasModel.width)return;this.canvasModel.clear();const e=this.canvasModel.ctx;if(this.config.colors.chartAreaTheme.backgroundMode==="gradient"){const o=e.createLinearGradient(0,0,this.canvasModel.width,this.canvasModel.height);o.addColorStop(0,this.config.colors.chartAreaTheme.backgroundGradientTopColor),o.addColorStop(1,this.config.colors.chartAreaTheme.backgroundGradientBottomColor),e.fillStyle=o}else e.fillStyle=this.config.colors.chartAreaTheme.backgroundColor;e.fillRect(0,0,this.canvasModel.width,this.canvasModel.height),this.prevState=Object.assign({},this.config.colors.chartAreaTheme),this.prevWidth=this.canvasModel.width,this.prevHeight=this.canvasModel.height}getCanvasIds(){return[this.canvasModel.canvasId]}}export const redrawBackgroundArea=(c,e,o,l,g,v,i)=>{const r=f(),h=[o*r,l*r,g*r,v*r];let t=c.getImageData(...h);if(i!==void 0){const d=t.data[3]/255;if(d===1)for(let a=3;a<t.data.length;a+=4)t.data[a]=s(t.data[a]*i);else for(let a=0;a<t.data.length;a++){const n=t.data[a];t.data[a]=a%4===3?s(n*i):s(d*n)}t=new ImageData(t.data,t.width,t.height,{colorSpace:t.colorSpace})}e.putImageData(t,h[0],h[1])};
6
+ import { getDPR } from '../utils/device/device-pixel-ratio.utils';
7
+ import { deepEqual } from '../utils/object.utils';
8
+ import { floor } from '../utils/math.utils';
9
+ export class BackgroundDrawer {
10
+ constructor(canvasModel, config) {
11
+ this.canvasModel = canvasModel;
12
+ this.config = config;
13
+ // we need to save previous state to avoid unnecessary redraws
14
+ this.prevState = {};
15
+ this.prevWidth = 0;
16
+ this.prevHeight = 0;
17
+ }
18
+ draw() {
19
+ if (deepEqual(this.config.colors.chartAreaTheme, this.prevState) &&
20
+ this.prevHeight === this.canvasModel.height &&
21
+ this.prevWidth === this.canvasModel.width) {
22
+ return;
23
+ }
24
+ this.canvasModel.clear();
25
+ const ctx = this.canvasModel.ctx;
26
+ if (this.config.colors.chartAreaTheme.backgroundMode === 'gradient') {
27
+ const grd = ctx.createLinearGradient(0, 0, this.canvasModel.width, this.canvasModel.height);
28
+ grd.addColorStop(0, this.config.colors.chartAreaTheme.backgroundGradientTopColor);
29
+ grd.addColorStop(1, this.config.colors.chartAreaTheme.backgroundGradientBottomColor);
30
+ ctx.fillStyle = grd;
31
+ }
32
+ else {
33
+ ctx.fillStyle = this.config.colors.chartAreaTheme.backgroundColor;
34
+ }
35
+ ctx.fillRect(0, 0, this.canvasModel.width, this.canvasModel.height);
36
+ // save prev state
37
+ this.prevState = Object.assign({}, this.config.colors.chartAreaTheme);
38
+ this.prevWidth = this.canvasModel.width;
39
+ this.prevHeight = this.canvasModel.height;
40
+ }
41
+ getCanvasIds() {
42
+ return [this.canvasModel.canvasId];
43
+ }
44
+ }
45
+ // this function in used in case when
46
+ // some entity can overlap with another chart entity, so we need to hide the another entity
47
+ export const redrawBackgroundArea = (backgroundCtx, ctx, x, y, width, height, opacity) => {
48
+ const dpr = getDPR();
49
+ const backgroundCoords = [x * dpr, y * dpr, width * dpr, height * dpr];
50
+ let imageData = backgroundCtx.getImageData(...backgroundCoords);
51
+ if (opacity !== undefined) {
52
+ // convert rgba to rgb for black background
53
+ // Target.R = (Source.A * Source.R)
54
+ // Target.G = (Source.A * Source.G)
55
+ // Target.B = (Source.A * Source.B)
56
+ const alpha = imageData.data[3] / 255;
57
+ if (alpha === 1) {
58
+ // fast path
59
+ for (let i = 3; i < imageData.data.length; i += 4) {
60
+ imageData.data[i] = floor(imageData.data[i] * opacity);
61
+ }
62
+ }
63
+ else {
64
+ for (let i = 0; i < imageData.data.length; i++) {
65
+ const v = imageData.data[i];
66
+ imageData.data[i] = i % 4 === 3 ? floor(v * opacity) : floor(alpha * v);
67
+ }
68
+ }
69
+ imageData = new ImageData(
70
+ // i % 4 === 3 - this condition is for alpha channel
71
+ imageData.data, imageData.width, imageData.height, { colorSpace: imageData.colorSpace });
72
+ }
73
+ ctx.putImageData(imageData, backgroundCoords[0], backgroundCoords[1]);
74
+ };
@@ -3,4 +3,72 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{CandleSeriesModel as d}from"../../model/candle-series.model";import{flat as S}from"../../utils/array.utils";import{floor as l}from"../../utils/math.utils";export class AreaDrawer{constructor(e){this.config=e}draw(e,C,o,r){if(o instanceof d){const i=S(C);if(i.length===0)return;r.singleColor?e.strokeStyle=r.singleColor:e.strokeStyle=o.colors.areaTheme.lineColor,o.hovered?e.lineWidth=this.config.selectedWidth:e.lineWidth=this.config.areaLineWidth;const a=o.extentComponent.getBounds(),p=i[0],T=o.view.toX(p.centerUnit);for(let t=0;t<i.length;t++){const g=i[t-1],v=i[t+1],c=i[t],s=o.view.toX(c.centerUnit),h=o.view.toY(c.close),f=a.y+a.height;if(g===void 0)e.beginPath(),e.lineTo(l(s),f),e.moveTo(l(s),h);else if(v===void 0){e.lineTo(l(s),h),e.stroke(),e.lineTo(l(s),f),e.lineTo(l(T),f),e.closePath();let n;r.singleColor?e.fillStyle=r.singleColor:e.fillStyle=o.colors.areaTheme.startColor&&o.colors.areaTheme.stopColor?(n=e.createLinearGradient(0,0,0,a.height),n.addColorStop(0,o.colors.areaTheme.startColor),n.addColorStop(1,o.colors.areaTheme.stopColor),n):"",e.fill()}else e.lineTo(l(s),h)}}}}
6
+ import { CandleSeriesModel } from '../../model/candle-series.model';
7
+ import { flat } from '../../utils/array.utils';
8
+ import { floor } from '../../utils/math.utils';
9
+ export class AreaDrawer {
10
+ constructor(config) {
11
+ this.config = config;
12
+ }
13
+ draw(ctx, points, model, drawerConfig) {
14
+ if (model instanceof CandleSeriesModel) {
15
+ // @ts-ignore
16
+ const visualCandles = flat(points);
17
+ if (visualCandles.length === 0) {
18
+ return;
19
+ }
20
+ if (drawerConfig.singleColor) {
21
+ ctx.strokeStyle = drawerConfig.singleColor;
22
+ }
23
+ else {
24
+ ctx.strokeStyle = model.colors.areaTheme.lineColor;
25
+ }
26
+ if (model.hovered) {
27
+ ctx.lineWidth = this.config.selectedWidth;
28
+ }
29
+ else {
30
+ ctx.lineWidth = this.config.areaLineWidth;
31
+ }
32
+ const paneBounds = model.extentComponent.getBounds();
33
+ const first = visualCandles[0];
34
+ const firstLineX = model.view.toX(first.centerUnit);
35
+ for (let i = 0; i < visualCandles.length; i++) {
36
+ const prev = visualCandles[i - 1];
37
+ const next = visualCandles[i + 1];
38
+ const visualCandle = visualCandles[i];
39
+ const lineX = model.view.toX(visualCandle.centerUnit);
40
+ const closeY = model.view.toY(visualCandle.close);
41
+ const bottomY = paneBounds.y + paneBounds.height;
42
+ if (prev === void 0) {
43
+ ctx.beginPath();
44
+ ctx.lineTo(floor(lineX), bottomY);
45
+ ctx.moveTo(floor(lineX), closeY);
46
+ }
47
+ else if (next === void 0) {
48
+ ctx.lineTo(floor(lineX), closeY);
49
+ ctx.stroke();
50
+ ctx.lineTo(floor(lineX), bottomY);
51
+ ctx.lineTo(floor(firstLineX), bottomY);
52
+ ctx.closePath();
53
+ let fillColor;
54
+ if (drawerConfig.singleColor) {
55
+ ctx.fillStyle = drawerConfig.singleColor;
56
+ }
57
+ else {
58
+ ctx.fillStyle =
59
+ model.colors.areaTheme.startColor && model.colors.areaTheme.stopColor
60
+ ? ((fillColor = ctx.createLinearGradient(0, 0, 0, paneBounds.height)),
61
+ fillColor.addColorStop(0, model.colors.areaTheme.startColor),
62
+ fillColor.addColorStop(1, model.colors.areaTheme.stopColor),
63
+ fillColor)
64
+ : '';
65
+ }
66
+ ctx.fill();
67
+ }
68
+ else {
69
+ ctx.lineTo(floor(lineX), closeY);
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
@@ -3,4 +3,60 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{CandleSeriesModel as b}from"../../model/candle-series.model";import{flat as p}from"../../utils/array.utils";import{avoidAntialiasing as Y}from"../../utils/canvas/canvas-drawing-functions.utils";import{floorToDPR as s}from"../../utils/device/device-pixel-ratio.utils";import{setLineWidth as d}from"../data-series.drawer";export class BarDrawer{constructor(o){this.config=o}setFillStyle(o,n,i,l){if(n.singleColor)o.strokeStyle=n.singleColor;else{const r=i.colors.barTheme;r&&(o.strokeStyle=r[`${l.name}Color`])}}draw(o,n,i,l){if(i instanceof b){const r=p(n);d(o,this.config.barLineWidth,i,l),Y(o,()=>{for(const t of r){this.setFillStyle(o,l,i,t),o.beginPath();const e=s(i.view.toX(t.centerUnit)),a=s(i.view.toX(t.startUnit)),[v,y,h,w]=t.yBodyKeyPoints(i.view),T=s(i.view.xPixels(t.width)/2),m=s(i.view.toY(t.close)),f=s(i.view.toY(t.open));this.config.showWicks?(o.moveTo(e,v),o.lineTo(e,w)):(o.moveTo(e,y),o.lineTo(e,h)),o.moveTo(e,m),o.lineTo(e+T,m),o.moveTo(a,f),o.lineTo(e,f),o.stroke()}})}}}
6
+ import { CandleSeriesModel } from '../../model/candle-series.model';
7
+ import { flat } from '../../utils/array.utils';
8
+ import { avoidAntialiasing } from '../../utils/canvas/canvas-drawing-functions.utils';
9
+ import { floorToDPR } from '../../utils/device/device-pixel-ratio.utils';
10
+ import { setLineWidth } from '../data-series.drawer';
11
+ export class BarDrawer {
12
+ constructor(config) {
13
+ this.config = config;
14
+ }
15
+ setFillStyle(ctx, drawerConfig, candleSeries, visualCandle) {
16
+ if (drawerConfig.singleColor) {
17
+ ctx.strokeStyle = drawerConfig.singleColor;
18
+ }
19
+ else {
20
+ const barTheme = candleSeries.colors.barTheme;
21
+ if (barTheme) {
22
+ ctx.strokeStyle = barTheme[`${visualCandle.name}Color`];
23
+ }
24
+ }
25
+ }
26
+ draw(ctx, points, candleSeries, drawerConfig) {
27
+ if (candleSeries instanceof CandleSeriesModel) {
28
+ // @ts-ignore
29
+ const visualCandles = flat(points);
30
+ setLineWidth(ctx, this.config.barLineWidth, candleSeries, drawerConfig);
31
+ avoidAntialiasing(ctx, () => {
32
+ for (const visualCandle of visualCandles) {
33
+ this.setFillStyle(ctx, drawerConfig, candleSeries, visualCandle);
34
+ ctx.beginPath();
35
+ const bodyLineX = floorToDPR(candleSeries.view.toX(visualCandle.centerUnit));
36
+ const openLineStartX = floorToDPR(candleSeries.view.toX(visualCandle.startUnit));
37
+ const [wickStartY, bodyStartY, bodyEndY, wickEndY] = visualCandle.yBodyKeyPoints(candleSeries.view);
38
+ const w = floorToDPR(candleSeries.view.xPixels(visualCandle.width) / 2);
39
+ const bodyCloseY = floorToDPR(candleSeries.view.toY(visualCandle.close));
40
+ const bodyOpenY = floorToDPR(candleSeries.view.toY(visualCandle.open));
41
+ if (this.config.showWicks) {
42
+ ctx.moveTo(bodyLineX, wickStartY);
43
+ ctx.lineTo(bodyLineX, wickEndY);
44
+ }
45
+ else {
46
+ ctx.moveTo(bodyLineX, bodyStartY);
47
+ ctx.lineTo(bodyLineX, bodyEndY);
48
+ }
49
+ /* close line start */
50
+ ctx.moveTo(bodyLineX, bodyCloseY);
51
+ ctx.lineTo(bodyLineX + w, bodyCloseY);
52
+ /* close line end */
53
+ /* open line start */
54
+ ctx.moveTo(openLineStartX, bodyOpenY);
55
+ ctx.lineTo(bodyLineX, bodyOpenY);
56
+ /* open line end */
57
+ ctx.stroke();
58
+ }
59
+ });
60
+ }
61
+ }
62
+ }
@@ -3,4 +3,87 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{CanvasElement as X}from"../../canvas/canvas-bounds-container";import{CandleSeriesModel as d}from"../../model/candle-series.model";import{flat as H}from"../../utils/array.utils";export class BaselineDrawer{constructor(e,s){this.baseLineModel=e,this.canvasBoundContainer=s}draw(e,s,o,h){if(h!==void 0&&o instanceof d){const a=H(s),p=this.baseLineModel.baselineYPercents,T=this.canvasBoundContainer.getBounds(X.CHART),n=T.y+T.height*(p/100),B=a[0];for(let c=0;c<a.length;c++){const f=a[c],i=a[c-1],S=a[c+1],v=o.view.toX(B.centerUnit),t=o.view.toX(f.centerUnit),l=o.view.toY(f.close),L=i?o.view.toY(i.close)<n:!1,b=l<n;if(i!==void 0&&L!==b){g(e,o,h,L);const P=o.view.toX(i.centerUnit),k=o.view.toY(i.close),u=t-P,y=l-k,Y=u/y,m=l-n,w=Y*m,C=P+(u-w);e.lineTo(C,n),e.stroke(),e.lineTo(v,n),e.closePath(),e.fill(),e.beginPath(),e.moveTo(C,n)}i===void 0?(e.beginPath(),e.moveTo(t,l)):S===void 0?(g(e,o,h,b),e.lineTo(t,l),e.stroke(),e.lineTo(t,n),e.lineTo(v,n),e.closePath(),e.fill(),e.beginPath(),e.moveTo(v,n),e.lineTo(t,n),e.strokeStyle=o.colors.baseLineTheme.baselineColor,e.stroke()):e.lineTo(t,l)}}}}const g=(r,e,s,o)=>{s.singleColor?(r.fillStyle=s.singleColor,r.strokeStyle=s.singleColor):(r.fillStyle=o?e.colors.baseLineTheme.upperSectionFillColor:e.colors.baseLineTheme.lowerSectionFillColor,r.strokeStyle=o?e.colors.baseLineTheme.upperSectionStrokeColor:e.colors.baseLineTheme.lowerSectionStrokeColor)};
6
+ import { CanvasElement } from '../../canvas/canvas-bounds-container';
7
+ import { CandleSeriesModel } from '../../model/candle-series.model';
8
+ import { flat } from '../../utils/array.utils';
9
+ export class BaselineDrawer {
10
+ constructor(baseLineModel, canvasBoundContainer) {
11
+ this.baseLineModel = baseLineModel;
12
+ this.canvasBoundContainer = canvasBoundContainer;
13
+ }
14
+ draw(ctx, points, model, drawerConfig) {
15
+ if (drawerConfig !== undefined && model instanceof CandleSeriesModel) {
16
+ const visualCandles = flat(points);
17
+ // calculate baseline
18
+ const baselineYPercents = this.baseLineModel.baselineYPercents;
19
+ const chartBounds = this.canvasBoundContainer.getBounds(CanvasElement.CHART);
20
+ const baseLine = chartBounds.y + chartBounds.height * (baselineYPercents / 100);
21
+ const first = visualCandles[0];
22
+ for (let i = 0; i < visualCandles.length; i++) {
23
+ const current = visualCandles[i];
24
+ const prev = visualCandles[i - 1];
25
+ const next = visualCandles[i + 1];
26
+ const firstLineXPx = model.view.toX(first.centerUnit);
27
+ const currentLineXPx = model.view.toX(current.centerUnit);
28
+ const currentCloseYPx = model.view.toY(current.close);
29
+ const prevHigherThanBL = prev ? model.view.toY(prev.close) < baseLine : false;
30
+ const curHigherThanBL = currentCloseYPx < baseLine;
31
+ if (prev !== void 0 && prevHigherThanBL !== curHigherThanBL) {
32
+ setBaselineFillStyle(ctx, model, drawerConfig, prevHigherThanBL);
33
+ const prevLineXPx = model.view.toX(prev.centerUnit);
34
+ const prevCloseYPx = model.view.toY(prev.close);
35
+ // our goal here is to find the crossing point X between chart line and baseline
36
+ const distanceWidth = currentLineXPx - prevLineXPx;
37
+ const distanceHeight = currentCloseYPx - prevCloseYPx;
38
+ const tg = distanceWidth / distanceHeight;
39
+ const distanceHeightToBL = currentCloseYPx - baseLine;
40
+ // distance from crossing point BL and area line to current candle X
41
+ const distanceWidthBL = tg * distanceHeightToBL;
42
+ const xPx = prevLineXPx + (distanceWidth - distanceWidthBL);
43
+ ctx.lineTo(xPx, baseLine);
44
+ ctx.stroke();
45
+ ctx.lineTo(firstLineXPx, baseLine);
46
+ ctx.closePath();
47
+ ctx.fill();
48
+ ctx.beginPath();
49
+ ctx.moveTo(xPx, baseLine);
50
+ }
51
+ if (prev === void 0) {
52
+ ctx.beginPath();
53
+ ctx.moveTo(currentLineXPx, currentCloseYPx);
54
+ }
55
+ else if (next === void 0) {
56
+ setBaselineFillStyle(ctx, model, drawerConfig, curHigherThanBL);
57
+ ctx.lineTo(currentLineXPx, currentCloseYPx);
58
+ ctx.stroke();
59
+ ctx.lineTo(currentLineXPx, baseLine);
60
+ ctx.lineTo(firstLineXPx, baseLine);
61
+ ctx.closePath();
62
+ ctx.fill();
63
+ ctx.beginPath();
64
+ ctx.moveTo(firstLineXPx, baseLine);
65
+ ctx.lineTo(currentLineXPx, baseLine);
66
+ ctx.strokeStyle = model.colors.baseLineTheme.baselineColor;
67
+ ctx.stroke();
68
+ }
69
+ else {
70
+ ctx.lineTo(currentLineXPx, currentCloseYPx);
71
+ }
72
+ }
73
+ }
74
+ }
75
+ }
76
+ const setBaselineFillStyle = (ctx, candleSeries, drawerConfig, upper) => {
77
+ if (drawerConfig.singleColor) {
78
+ ctx.fillStyle = drawerConfig.singleColor;
79
+ ctx.strokeStyle = drawerConfig.singleColor;
80
+ }
81
+ else {
82
+ ctx.fillStyle = upper
83
+ ? candleSeries.colors.baseLineTheme.upperSectionFillColor
84
+ : candleSeries.colors.baseLineTheme.lowerSectionFillColor;
85
+ ctx.strokeStyle = upper
86
+ ? candleSeries.colors.baseLineTheme.upperSectionStrokeColor
87
+ : candleSeries.colors.baseLineTheme.lowerSectionStrokeColor;
88
+ }
89
+ };