@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,331 @@
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 { SeriesChart } from "../series";
15
+ import type { SeriesInfo } from "../series-build";
16
+ import { compileProgram } from "../../../webgl/program-cache";
17
+ import areaVert from "../../../shaders/area.vert.glsl";
18
+ import areaFrag from "../../../shaders/area.frag.glsl";
19
+
20
+ type GL = WebGL2RenderingContext | WebGLRenderingContext;
21
+
22
+ interface AreaProgramCache {
23
+ program: WebGLProgram;
24
+ u_projection: WebGLUniformLocation | null;
25
+ u_color: WebGLUniformLocation | null;
26
+ u_opacity: WebGLUniformLocation | null;
27
+ a_position: number;
28
+ }
29
+
30
+ interface AreaStrip {
31
+ /**
32
+ * Byte offset of the strip start within the per-series GPU buffer.
33
+ */
34
+ offsetBytes: number;
35
+
36
+ /**
37
+ * Vertex count (= 2 × number of categories in this run).
38
+ */
39
+ vertexCount: number;
40
+ }
41
+
42
+ interface AreaSeriesEntry {
43
+ seriesId: number;
44
+ axis: 0 | 1;
45
+ color: [number, number, number];
46
+ gpuBuffer: WebGLBuffer;
47
+ strips: AreaStrip[];
48
+ }
49
+
50
+ /**
51
+ * Persistent area glyph state. Built in `rebuildBuffers`. Each series
52
+ * owns one GPU buffer holding all of its strip vertices in
53
+ * `[x,y_bot, x,y_top, ...]` layout; draws rebind without uploading.
54
+ */
55
+ interface AreaBuffers {
56
+ series: AreaSeriesEntry[];
57
+ }
58
+
59
+ /**
60
+ * Reusable Float32 strip scratch. Sized to `N * 4` (two vertices per
61
+ * category: bottom + top). Grown on demand.
62
+ */
63
+ let _stripScratch: Float32Array = new Float32Array(0);
64
+
65
+ function ensureStripScratch(n: number): Float32Array {
66
+ if (_stripScratch.length >= n) {
67
+ return _stripScratch;
68
+ }
69
+
70
+ _stripScratch = new Float32Array(Math.max(n, _stripScratch.length * 2));
71
+ return _stripScratch;
72
+ }
73
+
74
+ /**
75
+ * Area glyph for {@link SeriesChart}. Owns its program + per-series
76
+ * strip buffers privately.
77
+ */
78
+ export class AreaGlyph {
79
+ private _program: AreaProgramCache | null = null;
80
+ private _buffers: AreaBuffers | null = null;
81
+
82
+ private ensureProgram(glManager: WebGLContextManager): AreaProgramCache {
83
+ if (this._program) {
84
+ return this._program;
85
+ }
86
+
87
+ this._program = compileProgram<AreaProgramCache>(
88
+ glManager,
89
+ "bar-area",
90
+ areaVert,
91
+ areaFrag,
92
+ ["u_projection", "u_color", "u_opacity"],
93
+ ["a_position"],
94
+ );
95
+ return this._program;
96
+ }
97
+
98
+ /**
99
+ * Drop persistent area buffers. Subsequent draws no-op until rebuild.
100
+ */
101
+ invalidateBuffers(chart: SeriesChart): void {
102
+ const buf = this._buffers;
103
+ if (!buf || !chart._glManager) {
104
+ this._buffers = null;
105
+ return;
106
+ }
107
+
108
+ const gl = chart._glManager.gl;
109
+ for (const s of buf.series) {
110
+ gl.deleteBuffer(s.gpuBuffer);
111
+ }
112
+
113
+ this._buffers = null;
114
+ }
115
+
116
+ /**
117
+ * Build per-series strip buffers for area glyphs. Reads stacked
118
+ * y0/y1 from `chart._areaBarIndex` (cached at data load) and
119
+ * unstacked values from `_samples`. Single GPU upload per series;
120
+ * subsequent frames just rebind.
121
+ */
122
+ rebuildBuffers(chart: SeriesChart, glManager: WebGLContextManager): void {
123
+ const areaSeries = chart._areaSeries;
124
+ if (areaSeries.length === 0) {
125
+ this._buffers = null;
126
+ return;
127
+ }
128
+
129
+ const N = chart._numCategories;
130
+ const S = chart._series.length;
131
+ if (N === 0 || S === 0) {
132
+ this._buffers = null;
133
+ return;
134
+ }
135
+
136
+ this.ensureProgram(glManager);
137
+ const gl = glManager.gl;
138
+ const samples = chart._samples;
139
+ const valid = chart._sampleValid;
140
+ const positions = chart._categoryPositions;
141
+ const xOrigin = chart._categoryOrigin;
142
+ const barIndex = chart._areaBarIndex;
143
+ const bars = chart._bars;
144
+
145
+ const entries: AreaSeriesEntry[] = [];
146
+ for (const s of areaSeries) {
147
+ const strips = collectAreaStrips(
148
+ s,
149
+ N,
150
+ S,
151
+ samples,
152
+ valid,
153
+ barIndex,
154
+ bars.y0,
155
+ bars.y1,
156
+ positions,
157
+ xOrigin,
158
+ );
159
+ if (strips.totalVertices === 0) {
160
+ continue;
161
+ }
162
+
163
+ const buf = gl.createBuffer()!;
164
+ gl.bindBuffer(gl.ARRAY_BUFFER, buf);
165
+ gl.bufferData(
166
+ gl.ARRAY_BUFFER,
167
+ strips.scratch.subarray(0, strips.totalVertices * 2),
168
+ gl.STATIC_DRAW,
169
+ );
170
+
171
+ entries.push({
172
+ seriesId: s.seriesId,
173
+ axis: s.axis,
174
+ color: [s.color[0], s.color[1], s.color[2]],
175
+ gpuBuffer: buf,
176
+ strips: strips.descriptors,
177
+ });
178
+ }
179
+
180
+ this._buffers = { series: entries };
181
+ }
182
+
183
+ /**
184
+ * Bind persistent strip buffers and dispatch one TRIANGLE_STRIP per
185
+ * series-run. Skips hidden series.
186
+ */
187
+ draw(
188
+ chart: SeriesChart,
189
+ gl: GL,
190
+ _glManager: WebGLContextManager,
191
+ projLeft: Float32Array,
192
+ projRight: Float32Array,
193
+ opacity: number,
194
+ ): void {
195
+ const buf = this._buffers;
196
+ const cache = this._program;
197
+ if (!buf || !cache || buf.series.length === 0) {
198
+ return;
199
+ }
200
+
201
+ gl.useProgram(cache.program);
202
+ gl.uniform1f(cache.u_opacity, opacity);
203
+
204
+ const hidden = chart._hiddenSeries;
205
+ for (const s of buf.series) {
206
+ if (hidden.has(s.seriesId)) {
207
+ continue;
208
+ }
209
+
210
+ gl.uniformMatrix4fv(
211
+ cache.u_projection,
212
+ false,
213
+ s.axis === 1 ? projRight : projLeft,
214
+ );
215
+ const color = chart._series[s.seriesId].color;
216
+ gl.uniform3f(cache.u_color, color[0], color[1], color[2]);
217
+
218
+ gl.bindBuffer(gl.ARRAY_BUFFER, s.gpuBuffer);
219
+ gl.enableVertexAttribArray(cache.a_position);
220
+ gl.vertexAttribPointer(cache.a_position, 2, gl.FLOAT, false, 0, 0);
221
+
222
+ for (const strip of s.strips) {
223
+ gl.bindBuffer(gl.ARRAY_BUFFER, s.gpuBuffer);
224
+ gl.vertexAttribPointer(
225
+ cache.a_position,
226
+ 2,
227
+ gl.FLOAT,
228
+ false,
229
+ 0,
230
+ strip.offsetBytes,
231
+ );
232
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, strip.vertexCount);
233
+ }
234
+ }
235
+ }
236
+
237
+ destroy(chart: SeriesChart): void {
238
+ this.invalidateBuffers(chart);
239
+ this._program = null;
240
+ }
241
+ }
242
+
243
+ interface CollectedStrips {
244
+ descriptors: AreaStrip[];
245
+ totalVertices: number;
246
+ scratch: Float32Array;
247
+ }
248
+
249
+ /**
250
+ * Walk the per-category sample grid for one series and emit strip
251
+ * descriptors. Each contiguous run of present cells becomes one
252
+ * `TRIANGLE_STRIP` with `[x,bot, x,top, ...]` layout.
253
+ *
254
+ * Reads stacked y0/y1 from the pre-built `barIndex` (cached on the
255
+ * chart at data load) so this hot path doesn't rebuild the map each
256
+ * call.
257
+ */
258
+ function collectAreaStrips(
259
+ s: SeriesInfo,
260
+ N: number,
261
+ S: number,
262
+ samples: Float32Array,
263
+ valid: Uint8Array,
264
+ barIndex: Map<number, number> | null,
265
+ barY0: Float64Array,
266
+ barY1: Float64Array,
267
+ positions: Float64Array | null,
268
+ xOrigin: number,
269
+ ): CollectedStrips {
270
+ const scratch = ensureStripScratch(N * 4);
271
+ const descriptors: AreaStrip[] = [];
272
+ const seriesBase = s.seriesId * 1_000_000_000;
273
+
274
+ let write = 0;
275
+ let runStart = 0;
276
+
277
+ for (let c = 0; c < N; c++) {
278
+ let bot = 0;
279
+ let top = 0;
280
+ let present = false;
281
+
282
+ if (s.stack) {
283
+ const idx = barIndex?.get(seriesBase + c);
284
+ if (idx !== undefined) {
285
+ bot = barY0[idx];
286
+ top = barY1[idx];
287
+ present = true;
288
+ }
289
+ } else {
290
+ const idx = c * S + s.seriesId;
291
+ if ((valid[idx >> 3] >> (idx & 7)) & 1) {
292
+ top = samples[idx];
293
+ present = true;
294
+ }
295
+ }
296
+
297
+ if (present) {
298
+ const x = positions ? positions[c] - xOrigin : c;
299
+ scratch[write++] = x;
300
+ scratch[write++] = bot;
301
+ scratch[write++] = x;
302
+ scratch[write++] = top;
303
+ } else if (write > runStart) {
304
+ const vertexCount = (write - runStart) / 2;
305
+ if (vertexCount >= 4) {
306
+ descriptors.push({
307
+ offsetBytes: runStart * 4,
308
+ vertexCount,
309
+ });
310
+ }
311
+
312
+ runStart = write;
313
+ }
314
+ }
315
+
316
+ if (write > runStart) {
317
+ const vertexCount = (write - runStart) / 2;
318
+ if (vertexCount >= 4) {
319
+ descriptors.push({
320
+ offsetBytes: runStart * 4,
321
+ vertexCount,
322
+ });
323
+ }
324
+ }
325
+
326
+ return {
327
+ descriptors,
328
+ totalVertices: write / 2,
329
+ scratch,
330
+ };
331
+ }
@@ -0,0 +1,113 @@
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 { SeriesChart } from "../series";
15
+ import {
16
+ getInstancing,
17
+ bindInstancedFloatAttr,
18
+ } from "../../../webgl/instanced-attrs";
19
+ import { BAR_TYPE_BAR } from "../series-build";
20
+
21
+ /**
22
+ * Re-export of the bar discriminator value so `series-render.ts` can
23
+ * filter the `_bars` columnar storage without pulling the full
24
+ * `series-build` types into its import surface.
25
+ */
26
+ export const BAR_TYPE_BAR_VAL = BAR_TYPE_BAR;
27
+
28
+ type GL = WebGL2RenderingContext | WebGLRenderingContext;
29
+
30
+ /**
31
+ * Draw the bar-typed subset of `chart._bars` as instanced quads. Assumes
32
+ * the caller has already `useProgram`'d the bar shader and set uniforms.
33
+ */
34
+ export function drawBars(
35
+ chart: SeriesChart,
36
+ gl: GL,
37
+ glManager: WebGLContextManager,
38
+ ): void {
39
+ if (chart._uploadedBars === 0) {
40
+ return;
41
+ }
42
+
43
+ const loc = chart._locations!;
44
+ const instancing = getInstancing(glManager);
45
+ const { setDivisor } = instancing;
46
+
47
+ gl.bindBuffer(gl.ARRAY_BUFFER, chart._cornerBuffer!);
48
+ gl.enableVertexAttribArray(loc.a_corner);
49
+ gl.vertexAttribPointer(loc.a_corner, 2, gl.FLOAT, false, 0, 0);
50
+ setDivisor(loc.a_corner, 0);
51
+
52
+ // If any per-instance buffer hasn't been uploaded yet, skip the
53
+ // draw rather than paint zeros: `bindInstancedFloatAttr` uses
54
+ // `peek` and returns `false` when the buffer is missing. This
55
+ // triggers when a render lands between a pending draw's
56
+ // `ensureBufferCapacity` and its first `bufferPool.upload` —
57
+ // common during pan/zoom while data is being repopulated.
58
+ const ok =
59
+ bindInstancedFloatAttr(
60
+ glManager,
61
+ instancing,
62
+ loc.a_x_center,
63
+ "bar_x",
64
+ 1,
65
+ ) &&
66
+ bindInstancedFloatAttr(
67
+ glManager,
68
+ instancing,
69
+ loc.a_half_width,
70
+ "bar_hw",
71
+ 1,
72
+ ) &&
73
+ bindInstancedFloatAttr(glManager, instancing, loc.a_y0, "bar_y0", 1) &&
74
+ bindInstancedFloatAttr(glManager, instancing, loc.a_y1, "bar_y1", 1) &&
75
+ bindInstancedFloatAttr(
76
+ glManager,
77
+ instancing,
78
+ loc.a_color,
79
+ "bar_color",
80
+ 3,
81
+ ) &&
82
+ bindInstancedFloatAttr(
83
+ glManager,
84
+ instancing,
85
+ loc.a_series_id,
86
+ "bar_sid",
87
+ 1,
88
+ ) &&
89
+ bindInstancedFloatAttr(
90
+ glManager,
91
+ instancing,
92
+ loc.a_axis,
93
+ "bar_axis",
94
+ 1,
95
+ );
96
+
97
+ if (ok) {
98
+ instancing.drawArraysInstanced(
99
+ gl.TRIANGLE_STRIP,
100
+ 0,
101
+ 4,
102
+ chart._uploadedBars,
103
+ );
104
+ }
105
+
106
+ setDivisor(loc.a_x_center, 0);
107
+ setDivisor(loc.a_half_width, 0);
108
+ setDivisor(loc.a_y0, 0);
109
+ setDivisor(loc.a_y1, 0);
110
+ setDivisor(loc.a_color, 0);
111
+ setDivisor(loc.a_series_id, 0);
112
+ setDivisor(loc.a_axis, 0);
113
+ }