@perspective-dev/viewer-charts 4.3.0

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/LICENSE.md +193 -0
  2. package/dist/cdn/perspective-viewer-charts.js +3 -0
  3. package/dist/cdn/perspective-viewer-charts.js.map +7 -0
  4. package/dist/esm/axis/axis-primitives.d.ts +24 -0
  5. package/dist/esm/axis/bar-axis.d.ts +51 -0
  6. package/dist/esm/axis/canvas.d.ts +24 -0
  7. package/dist/esm/axis/categorical-axis-core.d.ts +42 -0
  8. package/dist/esm/axis/categorical-axis.d.ts +27 -0
  9. package/dist/esm/axis/facet-chrome.d.ts +13 -0
  10. package/dist/esm/axis/label-geometry.d.ts +41 -0
  11. package/dist/esm/axis/legend.d.ts +44 -0
  12. package/dist/esm/axis/numeric-axis.d.ts +20 -0
  13. package/dist/esm/charts/candlestick/candlestick-build.d.ts +129 -0
  14. package/dist/esm/charts/candlestick/candlestick-interact.d.ts +10 -0
  15. package/dist/esm/charts/candlestick/candlestick-render.d.ts +24 -0
  16. package/dist/esm/charts/candlestick/candlestick.d.ts +144 -0
  17. package/dist/esm/charts/candlestick/glyphs/draw-candlesticks.d.ts +36 -0
  18. package/dist/esm/charts/candlestick/glyphs/draw-ohlc.d.ts +33 -0
  19. package/dist/esm/charts/canvas-types.d.ts +15 -0
  20. package/dist/esm/charts/cartesian/cartesian-build.d.ts +14 -0
  21. package/dist/esm/charts/cartesian/cartesian-interact.d.ts +20 -0
  22. package/dist/esm/charts/cartesian/cartesian-render.d.ts +26 -0
  23. package/dist/esm/charts/cartesian/cartesian.d.ts +239 -0
  24. package/dist/esm/charts/cartesian/glyph.d.ts +53 -0
  25. package/dist/esm/charts/cartesian/glyphs/density.d.ts +142 -0
  26. package/dist/esm/charts/cartesian/glyphs/lines.d.ts +23 -0
  27. package/dist/esm/charts/cartesian/glyphs/points.d.ts +24 -0
  28. package/dist/esm/charts/cartesian/label-interner.d.ts +21 -0
  29. package/dist/esm/charts/cartesian/tooltip-lines.d.ts +11 -0
  30. package/dist/esm/charts/chart-base.d.ts +402 -0
  31. package/dist/esm/charts/chart.d.ts +338 -0
  32. package/dist/esm/charts/common/band-layout.d.ts +32 -0
  33. package/dist/esm/charts/common/categorical-y-chart.d.ts +53 -0
  34. package/dist/esm/charts/common/category-axis-resolver.d.ts +90 -0
  35. package/dist/esm/charts/common/chrome-cache.d.ts +18 -0
  36. package/dist/esm/charts/common/draw-tooltip-box.d.ts +9 -0
  37. package/dist/esm/charts/common/leaf-color.d.ts +33 -0
  38. package/dist/esm/charts/common/node-store.d.ts +81 -0
  39. package/dist/esm/charts/common/tree-chart.d.ts +48 -0
  40. package/dist/esm/charts/common/tree-chrome.d.ts +31 -0
  41. package/dist/esm/charts/common/tree-data.d.ts +54 -0
  42. package/dist/esm/charts/common/visible-extent.d.ts +51 -0
  43. package/dist/esm/charts/heatmap/heatmap-build.d.ts +86 -0
  44. package/dist/esm/charts/heatmap/heatmap-interact.d.ts +19 -0
  45. package/dist/esm/charts/heatmap/heatmap-render.d.ts +19 -0
  46. package/dist/esm/charts/heatmap/heatmap-y-axis.d.ts +46 -0
  47. package/dist/esm/charts/heatmap/heatmap.d.ts +117 -0
  48. package/dist/esm/charts/map/map.d.ts +67 -0
  49. package/dist/esm/charts/registry.d.ts +14 -0
  50. package/dist/esm/charts/series/glyphs/draw-areas.d.ts +30 -0
  51. package/dist/esm/charts/series/glyphs/draw-bars.d.ts +15 -0
  52. package/dist/esm/charts/series/glyphs/draw-lines.d.ts +34 -0
  53. package/dist/esm/charts/series/glyphs/draw-scatter.d.ts +33 -0
  54. package/dist/esm/charts/series/series-build.d.ts +228 -0
  55. package/dist/esm/charts/series/series-interact.d.ts +35 -0
  56. package/dist/esm/charts/series/series-render.d.ts +41 -0
  57. package/dist/esm/charts/series/series-type.d.ts +49 -0
  58. package/dist/esm/charts/series/series.d.ts +317 -0
  59. package/dist/esm/charts/sunburst/sunburst-interact.d.ts +7 -0
  60. package/dist/esm/charts/sunburst/sunburst-layout.d.ts +33 -0
  61. package/dist/esm/charts/sunburst/sunburst-render.d.ts +22 -0
  62. package/dist/esm/charts/sunburst/sunburst.d.ts +85 -0
  63. package/dist/esm/charts/treemap/treemap-interact.d.ts +12 -0
  64. package/dist/esm/charts/treemap/treemap-layout.d.ts +28 -0
  65. package/dist/esm/charts/treemap/treemap-render.d.ts +18 -0
  66. package/dist/esm/charts/treemap/treemap.d.ts +74 -0
  67. package/dist/esm/config.d.ts +27 -0
  68. package/dist/esm/data/lazy-row.d.ts +32 -0
  69. package/dist/esm/data/split-groups.d.ts +20 -0
  70. package/dist/esm/data/view-reader.d.ts +35 -0
  71. package/dist/esm/event-detail.d.ts +28 -0
  72. package/dist/esm/index.d.ts +3 -0
  73. package/dist/esm/interaction/hit-test.d.ts +30 -0
  74. package/dist/esm/interaction/host-sink-dom.d.ts +19 -0
  75. package/dist/esm/interaction/host-sink-message.d.ts +46 -0
  76. package/dist/esm/interaction/lazy-tooltip.d.ts +61 -0
  77. package/dist/esm/interaction/raw-event-forwarder.d.ts +27 -0
  78. package/dist/esm/interaction/spatial-grid.d.ts +15 -0
  79. package/dist/esm/interaction/tooltip-controller.d.ts +193 -0
  80. package/dist/esm/interaction/zoom-controller.d.ts +106 -0
  81. package/dist/esm/interaction/zoom-router.d.ts +48 -0
  82. package/dist/esm/layout/facet-grid.d.ts +126 -0
  83. package/dist/esm/layout/plot-layout.d.ts +104 -0
  84. package/dist/esm/layout/ticks.d.ts +17 -0
  85. package/dist/esm/map/mercator.d.ts +102 -0
  86. package/dist/esm/map/tile-cache.d.ts +38 -0
  87. package/dist/esm/map/tile-layer.d.ts +66 -0
  88. package/dist/esm/map/tile-loader.d.ts +52 -0
  89. package/dist/esm/map/tile-source.d.ts +66 -0
  90. package/dist/esm/perspective-viewer-charts.js +3 -0
  91. package/dist/esm/perspective-viewer-charts.js.map +7 -0
  92. package/dist/esm/plugin/charts.d.ts +40 -0
  93. package/dist/esm/plugin/plugin.d.ts +95 -0
  94. package/dist/esm/render/scheduler.d.ts +41 -0
  95. package/dist/esm/theme/gradient.d.ts +48 -0
  96. package/dist/esm/theme/palette.d.ts +13 -0
  97. package/dist/esm/theme/theme-snapshot.d.ts +7 -0
  98. package/dist/esm/theme/theme.d.ts +53 -0
  99. package/dist/esm/transport/protocol.d.ts +430 -0
  100. package/dist/esm/transport/renderer-transport.d.ts +201 -0
  101. package/dist/esm/utils/css.d.ts +1 -0
  102. package/dist/esm/utils/font-snapshot.d.ts +50 -0
  103. package/dist/esm/webgl/buffer-pool.d.ts +62 -0
  104. package/dist/esm/webgl/context-manager.d.ts +184 -0
  105. package/dist/esm/webgl/gradient-texture.d.ts +17 -0
  106. package/dist/esm/webgl/instanced-attrs.d.ts +44 -0
  107. package/dist/esm/webgl/plot-frame.d.ts +39 -0
  108. package/dist/esm/webgl/program-cache.d.ts +13 -0
  109. package/dist/esm/webgl/shader-manifest.d.ts +53 -0
  110. package/dist/esm/webgl/shader-registry.d.ts +22 -0
  111. package/dist/esm/worker/boot.d.ts +0 -0
  112. package/dist/esm/worker/dispatch.d.ts +9 -0
  113. package/dist/esm/worker/font-loader.d.ts +2 -0
  114. package/dist/esm/worker/renderer.worker.d.ts +115 -0
  115. package/dist/esm/worker/session-host.d.ts +26 -0
  116. package/package.json +47 -0
  117. package/src/css/perspective-viewer-charts.css +95 -0
  118. package/src/ts/axis/axis-primitives.ts +125 -0
  119. package/src/ts/axis/bar-axis.ts +345 -0
  120. package/src/ts/axis/canvas.ts +64 -0
  121. package/src/ts/axis/categorical-axis-core.ts +125 -0
  122. package/src/ts/axis/categorical-axis.ts +716 -0
  123. package/src/ts/axis/facet-chrome.ts +42 -0
  124. package/src/ts/axis/label-geometry.ts +188 -0
  125. package/src/ts/axis/legend.ts +218 -0
  126. package/src/ts/axis/numeric-axis.ts +353 -0
  127. package/src/ts/charts/candlestick/candlestick-build.ts +516 -0
  128. package/src/ts/charts/candlestick/candlestick-interact.ts +256 -0
  129. package/src/ts/charts/candlestick/candlestick-render.ts +387 -0
  130. package/src/ts/charts/candlestick/candlestick.ts +367 -0
  131. package/src/ts/charts/candlestick/glyphs/draw-candlesticks.ts +432 -0
  132. package/src/ts/charts/candlestick/glyphs/draw-ohlc.ts +317 -0
  133. package/src/ts/charts/canvas-types.ts +30 -0
  134. package/src/ts/charts/cartesian/cartesian-build.ts +616 -0
  135. package/src/ts/charts/cartesian/cartesian-interact.ts +355 -0
  136. package/src/ts/charts/cartesian/cartesian-render.ts +948 -0
  137. package/src/ts/charts/cartesian/cartesian.ts +469 -0
  138. package/src/ts/charts/cartesian/glyph.ts +81 -0
  139. package/src/ts/charts/cartesian/glyphs/density.ts +1263 -0
  140. package/src/ts/charts/cartesian/glyphs/lines.ts +320 -0
  141. package/src/ts/charts/cartesian/glyphs/points.ts +239 -0
  142. package/src/ts/charts/cartesian/label-interner.ts +56 -0
  143. package/src/ts/charts/cartesian/tooltip-lines.ts +80 -0
  144. package/src/ts/charts/chart-base.ts +840 -0
  145. package/src/ts/charts/chart.ts +427 -0
  146. package/src/ts/charts/common/band-layout.ts +63 -0
  147. package/src/ts/charts/common/categorical-y-chart.ts +81 -0
  148. package/src/ts/charts/common/category-axis-resolver.ts +314 -0
  149. package/src/ts/charts/common/chrome-cache.ts +79 -0
  150. package/src/ts/charts/common/draw-tooltip-box.ts +84 -0
  151. package/src/ts/charts/common/leaf-color.ts +92 -0
  152. package/src/ts/charts/common/node-store.ts +235 -0
  153. package/src/ts/charts/common/tree-chart.ts +76 -0
  154. package/src/ts/charts/common/tree-chrome.ts +123 -0
  155. package/src/ts/charts/common/tree-data.ts +623 -0
  156. package/src/ts/charts/common/visible-extent.ts +112 -0
  157. package/src/ts/charts/heatmap/heatmap-build.ts +426 -0
  158. package/src/ts/charts/heatmap/heatmap-interact.ts +274 -0
  159. package/src/ts/charts/heatmap/heatmap-render.ts +815 -0
  160. package/src/ts/charts/heatmap/heatmap-y-axis.ts +351 -0
  161. package/src/ts/charts/heatmap/heatmap.ts +368 -0
  162. package/src/ts/charts/map/map.ts +201 -0
  163. package/src/ts/charts/registry.ts +65 -0
  164. package/src/ts/charts/series/glyphs/draw-areas.ts +331 -0
  165. package/src/ts/charts/series/glyphs/draw-bars.ts +113 -0
  166. package/src/ts/charts/series/glyphs/draw-lines.ts +320 -0
  167. package/src/ts/charts/series/glyphs/draw-scatter.ts +328 -0
  168. package/src/ts/charts/series/series-build.ts +848 -0
  169. package/src/ts/charts/series/series-interact.ts +604 -0
  170. package/src/ts/charts/series/series-render.ts +1109 -0
  171. package/src/ts/charts/series/series-type.ts +99 -0
  172. package/src/ts/charts/series/series.ts +794 -0
  173. package/src/ts/charts/sunburst/sunburst-interact.ts +460 -0
  174. package/src/ts/charts/sunburst/sunburst-layout.ts +238 -0
  175. package/src/ts/charts/sunburst/sunburst-render.ts +887 -0
  176. package/src/ts/charts/sunburst/sunburst.ts +248 -0
  177. package/src/ts/charts/treemap/treemap-interact.ts +445 -0
  178. package/src/ts/charts/treemap/treemap-layout.ts +328 -0
  179. package/src/ts/charts/treemap/treemap-render.ts +886 -0
  180. package/src/ts/charts/treemap/treemap.ts +247 -0
  181. package/src/ts/config.ts +41 -0
  182. package/src/ts/data/lazy-row.ts +140 -0
  183. package/src/ts/data/split-groups.ts +97 -0
  184. package/src/ts/data/view-reader.ts +107 -0
  185. package/src/ts/event-detail.ts +44 -0
  186. package/src/ts/index.ts +53 -0
  187. package/src/ts/interaction/hit-test.ts +106 -0
  188. package/src/ts/interaction/host-sink-dom.ts +85 -0
  189. package/src/ts/interaction/host-sink-message.ts +75 -0
  190. package/src/ts/interaction/lazy-tooltip.ts +102 -0
  191. package/src/ts/interaction/raw-event-forwarder.ts +175 -0
  192. package/src/ts/interaction/spatial-grid.ts +100 -0
  193. package/src/ts/interaction/tooltip-controller.ts +407 -0
  194. package/src/ts/interaction/zoom-controller.ts +468 -0
  195. package/src/ts/interaction/zoom-router.ts +230 -0
  196. package/src/ts/layout/facet-grid.ts +346 -0
  197. package/src/ts/layout/plot-layout.ts +277 -0
  198. package/src/ts/layout/ticks.ts +168 -0
  199. package/src/ts/map/mercator.ts +204 -0
  200. package/src/ts/map/tile-cache.ts +96 -0
  201. package/src/ts/map/tile-layer.ts +382 -0
  202. package/src/ts/map/tile-loader.ts +143 -0
  203. package/src/ts/map/tile-source.ts +156 -0
  204. package/src/ts/plugin/charts.ts +286 -0
  205. package/src/ts/plugin/plugin.ts +668 -0
  206. package/src/ts/render/scheduler.ts +339 -0
  207. package/src/ts/shaders/area.frag.glsl +20 -0
  208. package/src/ts/shaders/area.vert.glsl +19 -0
  209. package/src/ts/shaders/bar.frag.glsl +25 -0
  210. package/src/ts/shaders/bar.vert.glsl +60 -0
  211. package/src/ts/shaders/candlestick-body.frag.glsl +19 -0
  212. package/src/ts/shaders/candlestick-body.vert.glsl +34 -0
  213. package/src/ts/shaders/density-extreme.frag.glsl +30 -0
  214. package/src/ts/shaders/density-mrt.frag.glsl +44 -0
  215. package/src/ts/shaders/density-mrt.vert.glsl +48 -0
  216. package/src/ts/shaders/density-resolve.frag.glsl +89 -0
  217. package/src/ts/shaders/density-resolve.vert.glsl +23 -0
  218. package/src/ts/shaders/density-splat.frag.glsl +34 -0
  219. package/src/ts/shaders/density-splat.vert.glsl +52 -0
  220. package/src/ts/shaders/gridline.frag.glsl +18 -0
  221. package/src/ts/shaders/gridline.vert.glsl +18 -0
  222. package/src/ts/shaders/heatmap.frag.glsl +23 -0
  223. package/src/ts/shaders/heatmap.vert.glsl +42 -0
  224. package/src/ts/shaders/line-uniform.frag.glsl +26 -0
  225. package/src/ts/shaders/line-uniform.vert.glsl +54 -0
  226. package/src/ts/shaders/line.frag.glsl +28 -0
  227. package/src/ts/shaders/line.vert.glsl +87 -0
  228. package/src/ts/shaders/scatter.frag.glsl +39 -0
  229. package/src/ts/shaders/scatter.vert.glsl +67 -0
  230. package/src/ts/shaders/sunburst-arc.frag.glsl +19 -0
  231. package/src/ts/shaders/sunburst-arc.vert.glsl +79 -0
  232. package/src/ts/shaders/tile.frag.glsl +27 -0
  233. package/src/ts/shaders/tile.vert.glsl +35 -0
  234. package/src/ts/shaders/treemap.frag.glsl +19 -0
  235. package/src/ts/shaders/treemap.vert.glsl +25 -0
  236. package/src/ts/shaders/y-scatter.frag.glsl +30 -0
  237. package/src/ts/shaders/y-scatter.vert.glsl +31 -0
  238. package/src/ts/theme/gradient.ts +312 -0
  239. package/src/ts/theme/palette.ts +64 -0
  240. package/src/ts/theme/theme-snapshot.ts +66 -0
  241. package/src/ts/theme/theme.ts +166 -0
  242. package/src/ts/transport/protocol.ts +497 -0
  243. package/src/ts/transport/renderer-transport.ts +788 -0
  244. package/src/ts/utils/css.ts +36 -0
  245. package/src/ts/utils/font-snapshot.ts +159 -0
  246. package/src/ts/webgl/buffer-pool.ts +163 -0
  247. package/src/ts/webgl/context-manager.ts +414 -0
  248. package/src/ts/webgl/gradient-texture.ts +84 -0
  249. package/src/ts/webgl/instanced-attrs.ts +139 -0
  250. package/src/ts/webgl/plot-frame.ts +91 -0
  251. package/src/ts/webgl/program-cache.ts +46 -0
  252. package/src/ts/webgl/shader-manifest.ts +148 -0
  253. package/src/ts/webgl/shader-registry.ts +97 -0
  254. package/src/ts/worker/boot.ts +22 -0
  255. package/src/ts/worker/dispatch.ts +99 -0
  256. package/src/ts/worker/font-loader.ts +89 -0
  257. package/src/ts/worker/renderer.worker.ts +734 -0
  258. package/src/ts/worker/session-host.ts +118 -0
@@ -0,0 +1,317 @@
1
+ // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ // ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
+ // ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
+ // ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
+ // ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
+ // ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
+ // ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
+ // ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
+ // ┃ This file is part of the Perspective library, distributed under the terms ┃
10
+ // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
+ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
+
13
+ import type { WebGLContextManager } from "../../../webgl/context-manager";
14
+ import type { CandlestickChart } from "../candlestick";
15
+ import {
16
+ createLineCornerBuffer,
17
+ getInstancing,
18
+ } from "../../../webgl/instanced-attrs";
19
+ import { compileProgram } from "../../../webgl/program-cache";
20
+ import lineVert from "../../../shaders/line-uniform.vert.glsl";
21
+ import lineFrag from "../../../shaders/line-uniform.frag.glsl";
22
+
23
+ type GL = WebGL2RenderingContext | WebGLRenderingContext;
24
+
25
+ interface OHLCCache {
26
+ program: WebGLProgram;
27
+ cornerBuffer: WebGLBuffer;
28
+ segmentBuffer: WebGLBuffer;
29
+ u_projection: WebGLUniformLocation | null;
30
+ u_color: WebGLUniformLocation | null;
31
+ u_resolution: WebGLUniformLocation | null;
32
+ u_line_width: WebGLUniformLocation | null;
33
+ a_corner: number;
34
+ a_start: number;
35
+ a_end: number;
36
+ }
37
+
38
+ /**
39
+ * Persistent OHLC vertex buffer state — one buffer per color group
40
+ * (up / down), each holding 3 line segments per candle (H–L vertical,
41
+ * open tick, close tick). Built once per data load; pan/zoom redraws
42
+ * rebind + dispatch with no uploads.
43
+ */
44
+ interface OHLCBuffers {
45
+ upBuffer: WebGLBuffer;
46
+ downBuffer: WebGLBuffer;
47
+
48
+ /**
49
+ * Number of line-segment instances in the up buffer (= 3 × up candle count).
50
+ */
51
+ upInstanceCount: number;
52
+ downInstanceCount: number;
53
+ }
54
+
55
+ /**
56
+ * OHLC bar glyph. Owns the OHLC program + per-color persistent segment
57
+ * buffers built per data load. Co-tenanted with `BodyWickGlyph` on
58
+ * `CandlestickChart`; only one of the two is active per frame depending
59
+ * on `_defaultChartType`.
60
+ */
61
+ export class OHLCGlyph {
62
+ private _program: OHLCCache | null = null;
63
+ private _buffers: OHLCBuffers | null = null;
64
+
65
+ private ensureProgram(glManager: WebGLContextManager): OHLCCache {
66
+ if (this._program) {
67
+ return this._program;
68
+ }
69
+
70
+ const gl = glManager.gl;
71
+ const cornerBuffer = createLineCornerBuffer(gl);
72
+ const partial = compileProgram<
73
+ Omit<OHLCCache, "cornerBuffer" | "segmentBuffer">
74
+ >(
75
+ glManager,
76
+ "line-uniform",
77
+ lineVert,
78
+ lineFrag,
79
+ ["u_projection", "u_color", "u_resolution", "u_line_width"],
80
+ ["a_corner", "a_start", "a_end"],
81
+ );
82
+ this._program = {
83
+ ...partial,
84
+ cornerBuffer,
85
+ segmentBuffer: gl.createBuffer()!,
86
+ };
87
+ return this._program;
88
+ }
89
+
90
+ /**
91
+ * Drop persistent OHLC vertex buffers. Called from data-load (before
92
+ * `rebuildBuffers`) and from chart-destroy paths.
93
+ */
94
+ invalidateBuffers(chart: CandlestickChart): void {
95
+ const buf = this._buffers;
96
+ if (!buf || !chart._glManager) {
97
+ this._buffers = null;
98
+ return;
99
+ }
100
+
101
+ const gl = chart._glManager.gl;
102
+ gl.deleteBuffer(buf.upBuffer);
103
+ gl.deleteBuffer(buf.downBuffer);
104
+ this._buffers = null;
105
+ }
106
+
107
+ /**
108
+ * Pre-build the per-group OHLC instance buffers. Each candle emits 3
109
+ * line segments (H–L, open tick, close tick); layout per instance is
110
+ * `[start.x, start.y, end.x, end.y]`. Single GPU upload per group per
111
+ * data load.
112
+ */
113
+ rebuildBuffers(
114
+ chart: CandlestickChart,
115
+ glManager: WebGLContextManager,
116
+ ): void {
117
+ // Only rebuild when this chart actually paints OHLC. Cheap enough
118
+ // to always rebuild but skipping avoids two empty GPU buffers on
119
+ // candlestick instances.
120
+ if (chart._defaultChartType !== "ohlc") {
121
+ return;
122
+ }
123
+
124
+ const candles = chart._candles;
125
+ const gl = glManager.gl;
126
+ this.ensureProgram(glManager);
127
+
128
+ const xOrigin = chart._categoryOrigin;
129
+ const xC = candles.xCenter;
130
+ const hw = candles.halfWidth;
131
+ const open = candles.open;
132
+ const close = candles.close;
133
+ const high = candles.high;
134
+ const low = candles.low;
135
+ const isUp = candles.isUp;
136
+
137
+ let upCount = 0;
138
+ let downCount = 0;
139
+ for (let i = 0; i < candles.count; i++) {
140
+ if (isUp[i] !== 0) {
141
+ upCount++;
142
+ } else {
143
+ downCount++;
144
+ }
145
+ }
146
+
147
+ const upData = new Float32Array(upCount * 3 * 4);
148
+ const downData = new Float32Array(downCount * 3 * 4);
149
+ let upW = 0;
150
+ let downW = 0;
151
+
152
+ for (let i = 0; i < candles.count; i++) {
153
+ const xc = xC[i] - xOrigin;
154
+ const o = open[i];
155
+ const c = close[i];
156
+ const lo = low[i];
157
+ const hi = high[i];
158
+ const halfW = hw[i];
159
+ const target = isUp[i] !== 0 ? upData : downData;
160
+ let w = isUp[i] !== 0 ? upW : downW;
161
+
162
+ // H–L vertical line.
163
+ target[w++] = xc;
164
+ target[w++] = lo;
165
+ target[w++] = xc;
166
+ target[w++] = hi;
167
+
168
+ // Open tick: left-facing horizontal stub at y=open.
169
+ target[w++] = xc - halfW;
170
+ target[w++] = o;
171
+ target[w++] = xc;
172
+ target[w++] = o;
173
+
174
+ // Close tick: right-facing horizontal stub at y=close.
175
+ target[w++] = xc;
176
+ target[w++] = c;
177
+ target[w++] = xc + halfW;
178
+ target[w++] = c;
179
+
180
+ if (isUp[i] !== 0) {
181
+ upW = w;
182
+ } else {
183
+ downW = w;
184
+ }
185
+ }
186
+
187
+ const prev = this._buffers;
188
+ const upBuf = prev?.upBuffer ?? gl.createBuffer()!;
189
+ const downBuf = prev?.downBuffer ?? gl.createBuffer()!;
190
+ gl.bindBuffer(gl.ARRAY_BUFFER, upBuf);
191
+ gl.bufferData(gl.ARRAY_BUFFER, upData, gl.STATIC_DRAW);
192
+ gl.bindBuffer(gl.ARRAY_BUFFER, downBuf);
193
+ gl.bufferData(gl.ARRAY_BUFFER, downData, gl.STATIC_DRAW);
194
+
195
+ this._buffers = {
196
+ upBuffer: upBuf,
197
+ downBuffer: downBuf,
198
+ upInstanceCount: upCount * 3,
199
+ downInstanceCount: downCount * 3,
200
+ };
201
+ }
202
+
203
+ /**
204
+ * Bind the persistent up/down OHLC buffers and dispatch one instanced
205
+ * draw per color group.
206
+ */
207
+ draw(
208
+ chart: CandlestickChart,
209
+ gl: GL,
210
+ glManager: WebGLContextManager,
211
+ projection: Float32Array,
212
+ ): void {
213
+ const buf = this._buffers;
214
+ if (
215
+ !buf ||
216
+ (buf.upInstanceCount === 0 && buf.downInstanceCount === 0)
217
+ ) {
218
+ return;
219
+ }
220
+
221
+ const cache = this.ensureProgram(glManager);
222
+ const dpr = glManager.dpr;
223
+
224
+ gl.useProgram(cache.program);
225
+ gl.uniformMatrix4fv(cache.u_projection, false, projection);
226
+ gl.uniform2f(cache.u_resolution, gl.canvas.width, gl.canvas.height);
227
+ gl.uniform1f(
228
+ cache.u_line_width,
229
+ chart._pluginConfig.ohlc_line_width_px * dpr,
230
+ );
231
+
232
+ const instancing = getInstancing(glManager);
233
+ const { setDivisor } = instancing;
234
+
235
+ gl.bindBuffer(gl.ARRAY_BUFFER, cache.cornerBuffer);
236
+ gl.enableVertexAttribArray(cache.a_corner);
237
+ gl.vertexAttribPointer(cache.a_corner, 1, gl.FLOAT, false, 0, 0);
238
+ setDivisor(cache.a_corner, 0);
239
+
240
+ drawGroup(
241
+ gl,
242
+ instancing,
243
+ cache,
244
+ buf.upBuffer,
245
+ buf.upInstanceCount,
246
+ chart._upColor,
247
+ );
248
+ drawGroup(
249
+ gl,
250
+ instancing,
251
+ cache,
252
+ buf.downBuffer,
253
+ buf.downInstanceCount,
254
+ chart._downColor,
255
+ );
256
+
257
+ setDivisor(cache.a_start, 0);
258
+ setDivisor(cache.a_end, 0);
259
+ }
260
+
261
+ destroy(chart: CandlestickChart): void {
262
+ const gl = chart._glManager?.gl;
263
+ if (gl) {
264
+ this.invalidateBuffers(chart);
265
+ const cache = this._program;
266
+ if (cache) {
267
+ gl.deleteBuffer(cache.cornerBuffer);
268
+ gl.deleteBuffer(cache.segmentBuffer);
269
+ }
270
+ }
271
+
272
+ this._program = null;
273
+ this._buffers = null;
274
+ }
275
+ }
276
+
277
+ function drawGroup(
278
+ gl: GL,
279
+ instancing: ReturnType<typeof getInstancing>,
280
+ cache: OHLCCache,
281
+ buffer: WebGLBuffer,
282
+ instanceCount: number,
283
+ color: [number, number, number],
284
+ ): void {
285
+ if (instanceCount === 0) {
286
+ return;
287
+ }
288
+
289
+ const instanceStride = 4 * Float32Array.BYTES_PER_ELEMENT;
290
+ const pointSize = 2 * Float32Array.BYTES_PER_ELEMENT;
291
+ const { setDivisor } = instancing;
292
+
293
+ gl.uniform4f(cache.u_color, color[0], color[1], color[2], 1.0);
294
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
295
+ gl.enableVertexAttribArray(cache.a_start);
296
+ gl.vertexAttribPointer(
297
+ cache.a_start,
298
+ 2,
299
+ gl.FLOAT,
300
+ false,
301
+ instanceStride,
302
+ 0,
303
+ );
304
+ setDivisor(cache.a_start, 1);
305
+ gl.enableVertexAttribArray(cache.a_end);
306
+ gl.vertexAttribPointer(
307
+ cache.a_end,
308
+ 2,
309
+ gl.FLOAT,
310
+ false,
311
+ instanceStride,
312
+ pointSize,
313
+ );
314
+ setDivisor(cache.a_end, 1);
315
+
316
+ instancing.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instanceCount);
317
+ }
@@ -0,0 +1,30 @@
1
+ // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ // ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
+ // ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
+ // ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
+ // ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
+ // ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
+ // ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
+ // ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
+ // ┃ This file is part of the Perspective library, distributed under the terms ┃
10
+ // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
+ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
+
13
+ /**
14
+ * Either flavor of 2D canvas the chart code may paint to. The chart's
15
+ * gridline and chrome canvases are `OffscreenCanvas` once the Host
16
+ * transfers rendering control to the Renderer (which it does in
17
+ * `LocalTransport` to validate that the chart code is DOM-free for
18
+ * worker mode). The GL canvas is also `HTMLCanvasElement | OffscreenCanvas`
19
+ * via WebGL's `gl.canvas`.
20
+ */
21
+ export type Canvas2D = HTMLCanvasElement | OffscreenCanvas;
22
+
23
+ /**
24
+ * 2D rendering context for either canvas flavor. The `OffscreenCanvas`
25
+ * variant is missing only `getContextAttributes` and `drawFocusIfNeeded` —
26
+ * neither used by the chart render paths.
27
+ */
28
+ export type Context2D =
29
+ | CanvasRenderingContext2D
30
+ | OffscreenCanvasRenderingContext2D;