minerva-design 1.0.2 → 1.2.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 (354) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +21 -19
  3. package/dist/charts/canvas.d.cts +7 -0
  4. package/dist/charts/canvas.d.ts +7 -0
  5. package/dist/charts/core.cjs +1 -0
  6. package/dist/charts/core.d.cts +7 -0
  7. package/dist/charts/core.d.ts +7 -0
  8. package/dist/charts/core.js +6 -0
  9. package/dist/charts/engine/axis.cjs +2 -0
  10. package/dist/charts/engine/axis.cjs.map +1 -0
  11. package/dist/charts/engine/axis.d.cts +13 -0
  12. package/dist/charts/engine/axis.d.ts +13 -0
  13. package/dist/charts/engine/axis.js +38 -0
  14. package/dist/charts/engine/axis.js.map +1 -0
  15. package/dist/charts/engine/canvas.cjs +2 -0
  16. package/dist/charts/engine/canvas.cjs.map +1 -0
  17. package/dist/charts/engine/canvas.d.cts +85 -0
  18. package/dist/charts/engine/canvas.d.ts +85 -0
  19. package/dist/charts/engine/canvas.js +165 -0
  20. package/dist/charts/engine/canvas.js.map +1 -0
  21. package/dist/charts/engine/chart.cjs +3 -0
  22. package/dist/charts/engine/chart.cjs.map +1 -0
  23. package/dist/charts/engine/chart.d.cts +6 -0
  24. package/dist/charts/engine/chart.d.ts +6 -0
  25. package/dist/charts/engine/chart.js +566 -0
  26. package/dist/charts/engine/chart.js.map +1 -0
  27. package/dist/charts/engine/color.cjs +2 -0
  28. package/dist/charts/engine/color.cjs.map +1 -0
  29. package/dist/charts/engine/color.d.cts +33 -0
  30. package/dist/charts/engine/color.d.ts +33 -0
  31. package/dist/charts/engine/color.js +167 -0
  32. package/dist/charts/engine/color.js.map +1 -0
  33. package/dist/charts/engine/controller.cjs +3 -0
  34. package/dist/charts/engine/controller.cjs.map +1 -0
  35. package/dist/charts/engine/controller.d.cts +182 -0
  36. package/dist/charts/engine/controller.d.ts +182 -0
  37. package/dist/charts/engine/controller.js +528 -0
  38. package/dist/charts/engine/controller.js.map +1 -0
  39. package/dist/charts/engine/data.cjs +2 -0
  40. package/dist/charts/engine/data.cjs.map +1 -0
  41. package/dist/charts/engine/data.d.cts +29 -0
  42. package/dist/charts/engine/data.d.ts +29 -0
  43. package/dist/charts/engine/data.js +104 -0
  44. package/dist/charts/engine/data.js.map +1 -0
  45. package/dist/charts/engine/decimate.cjs +2 -0
  46. package/dist/charts/engine/decimate.cjs.map +1 -0
  47. package/dist/charts/engine/decimate.d.cts +13 -0
  48. package/dist/charts/engine/decimate.d.ts +13 -0
  49. package/dist/charts/engine/decimate.js +28 -0
  50. package/dist/charts/engine/decimate.js.map +1 -0
  51. package/dist/charts/engine/dom.cjs +2 -0
  52. package/dist/charts/engine/dom.cjs.map +1 -0
  53. package/dist/charts/engine/dom.d.cts +21 -0
  54. package/dist/charts/engine/dom.d.ts +21 -0
  55. package/dist/charts/engine/dom.js +125 -0
  56. package/dist/charts/engine/dom.js.map +1 -0
  57. package/dist/charts/engine/format.cjs +2 -0
  58. package/dist/charts/engine/format.cjs.map +1 -0
  59. package/dist/charts/engine/format.d.cts +9 -0
  60. package/dist/charts/engine/format.d.ts +9 -0
  61. package/dist/charts/engine/format.js +34 -0
  62. package/dist/charts/engine/format.js.map +1 -0
  63. package/dist/charts/engine/items.cjs +2 -0
  64. package/dist/charts/engine/items.cjs.map +1 -0
  65. package/dist/charts/engine/items.d.cts +8 -0
  66. package/dist/charts/engine/items.d.ts +8 -0
  67. package/dist/charts/engine/items.js +91 -0
  68. package/dist/charts/engine/items.js.map +1 -0
  69. package/dist/charts/engine/layout.cjs +2 -0
  70. package/dist/charts/engine/layout.cjs.map +1 -0
  71. package/dist/charts/engine/layout.d.cts +37 -0
  72. package/dist/charts/engine/layout.d.ts +37 -0
  73. package/dist/charts/engine/layout.js +26 -0
  74. package/dist/charts/engine/layout.js.map +1 -0
  75. package/dist/charts/engine/model.cjs +2 -0
  76. package/dist/charts/engine/model.cjs.map +1 -0
  77. package/dist/charts/engine/model.d.cts +74 -0
  78. package/dist/charts/engine/model.d.ts +74 -0
  79. package/dist/charts/engine/model.js +175 -0
  80. package/dist/charts/engine/model.js.map +1 -0
  81. package/dist/charts/engine/overlay.cjs +2 -0
  82. package/dist/charts/engine/overlay.cjs.map +1 -0
  83. package/dist/charts/engine/overlay.d.cts +78 -0
  84. package/dist/charts/engine/overlay.d.ts +78 -0
  85. package/dist/charts/engine/overlay.js +137 -0
  86. package/dist/charts/engine/overlay.js.map +1 -0
  87. package/dist/charts/engine/presets.cjs +3 -0
  88. package/dist/charts/engine/presets.cjs.map +1 -0
  89. package/dist/charts/engine/presets.d.cts +103 -0
  90. package/dist/charts/engine/presets.d.ts +103 -0
  91. package/dist/charts/engine/presets.js +153 -0
  92. package/dist/charts/engine/presets.js.map +1 -0
  93. package/dist/charts/engine/renderers/canvas2d.cjs +2 -0
  94. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -0
  95. package/dist/charts/engine/renderers/canvas2d.d.cts +20 -0
  96. package/dist/charts/engine/renderers/canvas2d.d.ts +20 -0
  97. package/dist/charts/engine/renderers/canvas2d.js +193 -0
  98. package/dist/charts/engine/renderers/canvas2d.js.map +1 -0
  99. package/dist/charts/engine/renderers/detect.cjs +2 -0
  100. package/dist/charts/engine/renderers/detect.cjs.map +1 -0
  101. package/dist/charts/engine/renderers/detect.d.cts +12 -0
  102. package/dist/charts/engine/renderers/detect.d.ts +12 -0
  103. package/dist/charts/engine/renderers/detect.js +33 -0
  104. package/dist/charts/engine/renderers/detect.js.map +1 -0
  105. package/dist/charts/engine/renderers/range.cjs +2 -0
  106. package/dist/charts/engine/renderers/range.cjs.map +1 -0
  107. package/dist/charts/engine/renderers/range.d.cts +5 -0
  108. package/dist/charts/engine/renderers/range.d.ts +5 -0
  109. package/dist/charts/engine/renderers/range.js +32 -0
  110. package/dist/charts/engine/renderers/range.js.map +1 -0
  111. package/dist/charts/engine/renderers/shaders.cjs +266 -0
  112. package/dist/charts/engine/renderers/shaders.cjs.map +1 -0
  113. package/dist/charts/engine/renderers/shaders.d.cts +20 -0
  114. package/dist/charts/engine/renderers/shaders.d.ts +20 -0
  115. package/dist/charts/engine/renderers/shaders.js +251 -0
  116. package/dist/charts/engine/renderers/shaders.js.map +1 -0
  117. package/dist/charts/engine/renderers/types.cjs +2 -0
  118. package/dist/charts/engine/renderers/types.cjs.map +1 -0
  119. package/dist/charts/engine/renderers/types.d.cts +83 -0
  120. package/dist/charts/engine/renderers/types.d.ts +83 -0
  121. package/dist/charts/engine/renderers/types.js +6 -0
  122. package/dist/charts/engine/renderers/types.js.map +1 -0
  123. package/dist/charts/engine/renderers/webgl2.cjs +2 -0
  124. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -0
  125. package/dist/charts/engine/renderers/webgl2.d.cts +5 -0
  126. package/dist/charts/engine/renderers/webgl2.d.ts +5 -0
  127. package/dist/charts/engine/renderers/webgl2.js +134 -0
  128. package/dist/charts/engine/renderers/webgl2.js.map +1 -0
  129. package/dist/charts/engine/renderers/webgpu.cjs +2 -0
  130. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -0
  131. package/dist/charts/engine/renderers/webgpu.d.cts +6 -0
  132. package/dist/charts/engine/renderers/webgpu.d.ts +6 -0
  133. package/dist/charts/engine/renderers/webgpu.js +220 -0
  134. package/dist/charts/engine/renderers/webgpu.js.map +1 -0
  135. package/dist/charts/engine/scale.cjs +2 -0
  136. package/dist/charts/engine/scale.cjs.map +1 -0
  137. package/dist/charts/engine/scale.d.cts +13 -0
  138. package/dist/charts/engine/scale.d.ts +13 -0
  139. package/dist/charts/engine/scale.js +37 -0
  140. package/dist/charts/engine/scale.js.map +1 -0
  141. package/dist/charts/engine/scene.cjs +2 -0
  142. package/dist/charts/engine/scene.cjs.map +1 -0
  143. package/dist/charts/engine/scene.d.cts +89 -0
  144. package/dist/charts/engine/scene.d.ts +89 -0
  145. package/dist/charts/engine/scene.js +241 -0
  146. package/dist/charts/engine/scene.js.map +1 -0
  147. package/dist/charts/engine/spatial.cjs +2 -0
  148. package/dist/charts/engine/spatial.cjs.map +1 -0
  149. package/dist/charts/engine/spatial.d.cts +18 -0
  150. package/dist/charts/engine/spatial.d.ts +18 -0
  151. package/dist/charts/engine/spatial.js +53 -0
  152. package/dist/charts/engine/spatial.js.map +1 -0
  153. package/dist/charts/engine/theme.cjs +2 -0
  154. package/dist/charts/engine/theme.cjs.map +1 -0
  155. package/dist/charts/engine/theme.d.cts +45 -0
  156. package/dist/charts/engine/theme.d.ts +45 -0
  157. package/dist/charts/engine/theme.js +86 -0
  158. package/dist/charts/engine/theme.js.map +1 -0
  159. package/dist/charts/engine/time.cjs +2 -0
  160. package/dist/charts/engine/time.cjs.map +1 -0
  161. package/dist/charts/engine/time.d.cts +10 -0
  162. package/dist/charts/engine/time.d.ts +10 -0
  163. package/dist/charts/engine/time.js +189 -0
  164. package/dist/charts/engine/time.js.map +1 -0
  165. package/dist/charts/engine/types.d.cts +356 -0
  166. package/dist/charts/engine/types.d.ts +356 -0
  167. package/dist/charts/engine/viewport.cjs +2 -0
  168. package/dist/charts/engine/viewport.cjs.map +1 -0
  169. package/dist/charts/engine/viewport.d.cts +12 -0
  170. package/dist/charts/engine/viewport.d.ts +12 -0
  171. package/dist/charts/engine/viewport.js +15 -0
  172. package/dist/charts/engine/viewport.js.map +1 -0
  173. package/dist/charts/index.cjs +1 -0
  174. package/dist/charts/index.d.cts +4 -0
  175. package/dist/charts/index.d.ts +4 -0
  176. package/dist/charts/index.js +10 -0
  177. package/dist/charts/react/Chart.cjs +2 -0
  178. package/dist/charts/react/Chart.cjs.map +1 -0
  179. package/dist/charts/react/Chart.d.cts +35 -0
  180. package/dist/charts/react/Chart.d.ts +35 -0
  181. package/dist/charts/react/Chart.js +117 -0
  182. package/dist/charts/react/Chart.js.map +1 -0
  183. package/dist/charts/react/charts.cjs +2 -0
  184. package/dist/charts/react/charts.cjs.map +1 -0
  185. package/dist/charts/react/charts.d.cts +13 -0
  186. package/dist/charts/react/charts.d.ts +13 -0
  187. package/dist/charts/react/charts.js +133 -0
  188. package/dist/charts/react/charts.js.map +1 -0
  189. package/dist/charts/react/types.d.cts +136 -0
  190. package/dist/charts/react/types.d.ts +136 -0
  191. package/dist/native/charts/src/canvas.cjs +1 -0
  192. package/dist/native/charts/src/canvas.js +6 -0
  193. package/dist/native/charts/src/engine/axis.cjs +2 -0
  194. package/dist/native/charts/src/engine/axis.cjs.map +1 -0
  195. package/dist/native/charts/src/engine/axis.js +38 -0
  196. package/dist/native/charts/src/engine/axis.js.map +1 -0
  197. package/dist/native/charts/src/engine/canvas.cjs +1 -0
  198. package/dist/native/charts/src/engine/canvas.js +1 -0
  199. package/dist/native/charts/src/engine/color.cjs +2 -0
  200. package/dist/native/charts/src/engine/color.cjs.map +1 -0
  201. package/dist/native/charts/src/engine/color.js +130 -0
  202. package/dist/native/charts/src/engine/color.js.map +1 -0
  203. package/dist/native/charts/src/engine/controller.cjs +3 -0
  204. package/dist/native/charts/src/engine/controller.cjs.map +1 -0
  205. package/dist/native/charts/src/engine/controller.js +528 -0
  206. package/dist/native/charts/src/engine/controller.js.map +1 -0
  207. package/dist/native/charts/src/engine/data.cjs +2 -0
  208. package/dist/native/charts/src/engine/data.cjs.map +1 -0
  209. package/dist/native/charts/src/engine/data.js +104 -0
  210. package/dist/native/charts/src/engine/data.js.map +1 -0
  211. package/dist/native/charts/src/engine/decimate.cjs +2 -0
  212. package/dist/native/charts/src/engine/decimate.cjs.map +1 -0
  213. package/dist/native/charts/src/engine/decimate.js +28 -0
  214. package/dist/native/charts/src/engine/decimate.js.map +1 -0
  215. package/dist/native/charts/src/engine/format.cjs +2 -0
  216. package/dist/native/charts/src/engine/format.cjs.map +1 -0
  217. package/dist/native/charts/src/engine/format.js +34 -0
  218. package/dist/native/charts/src/engine/format.js.map +1 -0
  219. package/dist/native/charts/src/engine/layout.cjs +2 -0
  220. package/dist/native/charts/src/engine/layout.cjs.map +1 -0
  221. package/dist/native/charts/src/engine/layout.js +26 -0
  222. package/dist/native/charts/src/engine/layout.js.map +1 -0
  223. package/dist/native/charts/src/engine/model.cjs +2 -0
  224. package/dist/native/charts/src/engine/model.cjs.map +1 -0
  225. package/dist/native/charts/src/engine/model.js +175 -0
  226. package/dist/native/charts/src/engine/model.js.map +1 -0
  227. package/dist/native/charts/src/engine/overlay.cjs +2 -0
  228. package/dist/native/charts/src/engine/overlay.cjs.map +1 -0
  229. package/dist/native/charts/src/engine/overlay.js +49 -0
  230. package/dist/native/charts/src/engine/overlay.js.map +1 -0
  231. package/dist/native/charts/src/engine/presets.cjs +3 -0
  232. package/dist/native/charts/src/engine/presets.cjs.map +1 -0
  233. package/dist/native/charts/src/engine/presets.js +147 -0
  234. package/dist/native/charts/src/engine/presets.js.map +1 -0
  235. package/dist/native/charts/src/engine/scale.cjs +2 -0
  236. package/dist/native/charts/src/engine/scale.cjs.map +1 -0
  237. package/dist/native/charts/src/engine/scale.js +37 -0
  238. package/dist/native/charts/src/engine/scale.js.map +1 -0
  239. package/dist/native/charts/src/engine/scene.cjs +2 -0
  240. package/dist/native/charts/src/engine/scene.cjs.map +1 -0
  241. package/dist/native/charts/src/engine/scene.js +241 -0
  242. package/dist/native/charts/src/engine/scene.js.map +1 -0
  243. package/dist/native/charts/src/engine/spatial.cjs +2 -0
  244. package/dist/native/charts/src/engine/spatial.cjs.map +1 -0
  245. package/dist/native/charts/src/engine/spatial.js +53 -0
  246. package/dist/native/charts/src/engine/spatial.js.map +1 -0
  247. package/dist/native/charts/src/engine/theme.cjs +2 -0
  248. package/dist/native/charts/src/engine/theme.cjs.map +1 -0
  249. package/dist/native/charts/src/engine/theme.js +62 -0
  250. package/dist/native/charts/src/engine/theme.js.map +1 -0
  251. package/dist/native/charts/src/engine/time.cjs +2 -0
  252. package/dist/native/charts/src/engine/time.cjs.map +1 -0
  253. package/dist/native/charts/src/engine/time.js +189 -0
  254. package/dist/native/charts/src/engine/time.js.map +1 -0
  255. package/dist/native/charts/src/engine/viewport.cjs +2 -0
  256. package/dist/native/charts/src/engine/viewport.cjs.map +1 -0
  257. package/dist/native/charts/src/engine/viewport.js +12 -0
  258. package/dist/native/charts/src/engine/viewport.js.map +1 -0
  259. package/dist/native/components/Chart/ChartBase.cjs +2 -0
  260. package/dist/native/components/Chart/ChartBase.cjs.map +1 -0
  261. package/dist/native/components/Chart/ChartBase.d.cts +29 -0
  262. package/dist/native/components/Chart/ChartBase.d.ts +29 -0
  263. package/dist/native/components/Chart/ChartBase.js +287 -0
  264. package/dist/native/components/Chart/ChartBase.js.map +1 -0
  265. package/dist/native/components/Chart/charts.cjs +2 -0
  266. package/dist/native/components/Chart/charts.cjs.map +1 -0
  267. package/dist/native/components/Chart/charts.d.cts +19 -0
  268. package/dist/native/components/Chart/charts.d.ts +19 -0
  269. package/dist/native/components/Chart/charts.js +173 -0
  270. package/dist/native/components/Chart/charts.js.map +1 -0
  271. package/dist/native/components/Chart/index.cjs +1 -0
  272. package/dist/native/components/Chart/index.d.cts +2 -0
  273. package/dist/native/components/Chart/index.d.ts +2 -0
  274. package/dist/native/components/Chart/index.js +2 -0
  275. package/dist/native/components/Chart/measure.cjs +2 -0
  276. package/dist/native/components/Chart/measure.cjs.map +1 -0
  277. package/dist/native/components/Chart/measure.d.cts +5 -0
  278. package/dist/native/components/Chart/measure.d.ts +5 -0
  279. package/dist/native/components/Chart/measure.js +11 -0
  280. package/dist/native/components/Chart/measure.js.map +1 -0
  281. package/dist/native/components/Chart/scene.cjs +2 -0
  282. package/dist/native/components/Chart/scene.cjs.map +1 -0
  283. package/dist/native/components/Chart/scene.d.cts +41 -0
  284. package/dist/native/components/Chart/scene.d.ts +41 -0
  285. package/dist/native/components/Chart/scene.js +419 -0
  286. package/dist/native/components/Chart/scene.js.map +1 -0
  287. package/dist/native/components/Chart/theme.cjs +2 -0
  288. package/dist/native/components/Chart/theme.cjs.map +1 -0
  289. package/dist/native/components/Chart/theme.d.cts +10 -0
  290. package/dist/native/components/Chart/theme.d.ts +10 -0
  291. package/dist/native/components/Chart/theme.js +10 -0
  292. package/dist/native/components/Chart/theme.js.map +1 -0
  293. package/dist/native/components/Chart/types.d.cts +129 -0
  294. package/dist/native/components/Chart/types.d.ts +129 -0
  295. package/dist/native/index.cjs +1 -1
  296. package/dist/native/index.d.cts +1 -0
  297. package/dist/native/index.d.ts +1 -0
  298. package/dist/native/index.js +6 -4
  299. package/dist/native/manifest.d.cts +7 -0
  300. package/dist/native/manifest.d.ts +7 -0
  301. package/dist/native/source/components/Chart/ChartBase.tsx +545 -0
  302. package/dist/native/source/components/Chart/charts.tsx +291 -0
  303. package/dist/native/source/components/Chart/index.ts +8 -0
  304. package/dist/native/source/components/Chart/measure.ts +50 -0
  305. package/dist/native/source/components/Chart/scene.tsx +987 -0
  306. package/dist/native/source/components/Chart/theme.ts +16 -0
  307. package/dist/native/source/components/Chart/types.ts +194 -0
  308. package/dist/native/source/index.ts +1 -0
  309. package/dist/native/source/manifest.ts +14 -0
  310. package/dist/taro/charts.d.ts +144 -0
  311. package/dist/taro/index.d.ts +1 -0
  312. package/dist/taro/index.js +3064 -618
  313. package/dist/uni/BarChart.vue +75 -0
  314. package/dist/uni/BarChart.vue.d.ts +111 -0
  315. package/dist/uni/Chart.vue +68 -0
  316. package/dist/uni/Chart.vue.d.ts +100 -0
  317. package/dist/uni/LineChart.vue +75 -0
  318. package/dist/uni/LineChart.vue.d.ts +111 -0
  319. package/dist/uni/ProgressIndicator.vue.d.ts +1 -1
  320. package/dist/uni/QuadrantChart.vue +184 -0
  321. package/dist/uni/QuadrantChart.vue.d.ts +173 -0
  322. package/dist/uni/ScatterChart.vue +69 -0
  323. package/dist/uni/ScatterChart.vue.d.ts +100 -0
  324. package/dist/uni/chart-canvas.d.ts +68 -0
  325. package/dist/uni/chart-canvas.js +363 -0
  326. package/dist/uni/chart-types.d.ts +135 -0
  327. package/dist/uni/chart-types.js +84 -0
  328. package/dist/uni/charts-canvas.d.ts +1 -0
  329. package/dist/uni/charts-canvas.js +8 -0
  330. package/dist/uni/index.d.ts +6 -0
  331. package/dist/uni/index.js +6 -0
  332. package/dist/weapp/bar-chart/index.js +1 -0
  333. package/dist/weapp/bar-chart/index.json +1 -0
  334. package/dist/weapp/bar-chart/index.wxml +1 -0
  335. package/dist/weapp/bar-chart/index.wxss +1 -0
  336. package/dist/weapp/chart/index.js +1 -0
  337. package/dist/weapp/chart/index.json +1 -0
  338. package/dist/weapp/chart/index.wxml +1 -0
  339. package/dist/weapp/chart/index.wxss +1 -0
  340. package/dist/weapp/controls.js +4019 -266
  341. package/dist/weapp/line-chart/index.js +1 -0
  342. package/dist/weapp/line-chart/index.json +1 -0
  343. package/dist/weapp/line-chart/index.wxml +1 -0
  344. package/dist/weapp/line-chart/index.wxss +1 -0
  345. package/dist/weapp/quadrant-chart/index.js +1 -0
  346. package/dist/weapp/quadrant-chart/index.json +1 -0
  347. package/dist/weapp/quadrant-chart/index.wxml +1 -0
  348. package/dist/weapp/quadrant-chart/index.wxss +1 -0
  349. package/dist/weapp/scatter-chart/index.js +1 -0
  350. package/dist/weapp/scatter-chart/index.json +1 -0
  351. package/dist/weapp/scatter-chart/index.wxml +1 -0
  352. package/dist/weapp/scatter-chart/index.wxss +1 -0
  353. package/dist/weapp/types.d.ts +295 -0
  354. package/package.json +48 -2
@@ -0,0 +1,83 @@
1
+ import { Rgba } from '../color.cjs';
2
+ import { ChartRendererKind } from '../types.cjs';
3
+ /**
4
+ * Data -> clip-space transform. Positions are uploaded relative to an
5
+ * origin (float32 keeps its precision for timestamps), so
6
+ * `clip = relative * scale + offset`.
7
+ */
8
+ export interface RenderTransform {
9
+ xScale: number;
10
+ xOffset: number;
11
+ yScale: number;
12
+ yOffset: number;
13
+ }
14
+ export interface RenderFrame {
15
+ transform: RenderTransform;
16
+ /** Size of the drawing buffer in device pixels */
17
+ width: number;
18
+ height: number;
19
+ /** Device pixel ratio */
20
+ dpr: number;
21
+ }
22
+ /** Missing values are written as this sentinel (NaN is unreliable in shaders) */
23
+ export declare const GAP = 3e+38;
24
+ interface RenderItemBase {
25
+ /** Identifies the GPU resources of the item */
26
+ key: string;
27
+ /** Changes when the buffers must be uploaded again */
28
+ version: number;
29
+ /** Straight RGBA */
30
+ color: Rgba;
31
+ }
32
+ export interface LineItem extends RenderItemBase {
33
+ kind: "line";
34
+ /** Interleaved relative x, y */
35
+ points: Float32Array;
36
+ count: number;
37
+ /** CSS pixels */
38
+ width: number;
39
+ sorted: boolean;
40
+ }
41
+ export interface AreaItem extends RenderItemBase {
42
+ kind: "area";
43
+ points: Float32Array;
44
+ count: number;
45
+ /** Relative y of the baseline */
46
+ baseline: number;
47
+ opacity: number;
48
+ sorted: boolean;
49
+ }
50
+ export interface BarItem extends RenderItemBase {
51
+ kind: "bar";
52
+ /** Interleaved relative x (center), y0, y1 */
53
+ instances: Float32Array;
54
+ count: number;
55
+ /** Half of the bar width, in relative x units */
56
+ halfWidth: number;
57
+ /** Corner radius in CSS pixels */
58
+ radius: number;
59
+ /** Instances are sorted by x */
60
+ sorted: boolean;
61
+ }
62
+ export interface ScatterItem extends RenderItemBase {
63
+ kind: "scatter";
64
+ /** Per point: x f32, y f32, diameter (CSS px) f32, color unorm8x4 */
65
+ instances: ArrayBuffer;
66
+ count: number;
67
+ opacity: number;
68
+ /** Outline width in CSS pixels */
69
+ stroke: number;
70
+ }
71
+ export type RenderItem = LineItem | AreaItem | BarItem | ScatterItem;
72
+ export interface ChartRenderer {
73
+ readonly kind: ChartRendererKind;
74
+ readonly canvas: HTMLCanvasElement;
75
+ /** Drawing buffer size in device pixels */
76
+ resize(width: number, height: number): void;
77
+ render(items: readonly RenderItem[], frame: RenderFrame): void;
78
+ destroy(): void;
79
+ }
80
+ /** Called when the backend is lost (GPU reset, too many contexts, ...) */
81
+ export type RendererLostHandler = () => void;
82
+ export declare const SCATTER_STRIDE = 16;
83
+ export {};
@@ -0,0 +1,83 @@
1
+ import { Rgba } from '../color.js';
2
+ import { ChartRendererKind } from '../types.js';
3
+ /**
4
+ * Data -> clip-space transform. Positions are uploaded relative to an
5
+ * origin (float32 keeps its precision for timestamps), so
6
+ * `clip = relative * scale + offset`.
7
+ */
8
+ export interface RenderTransform {
9
+ xScale: number;
10
+ xOffset: number;
11
+ yScale: number;
12
+ yOffset: number;
13
+ }
14
+ export interface RenderFrame {
15
+ transform: RenderTransform;
16
+ /** Size of the drawing buffer in device pixels */
17
+ width: number;
18
+ height: number;
19
+ /** Device pixel ratio */
20
+ dpr: number;
21
+ }
22
+ /** Missing values are written as this sentinel (NaN is unreliable in shaders) */
23
+ export declare const GAP = 3e+38;
24
+ interface RenderItemBase {
25
+ /** Identifies the GPU resources of the item */
26
+ key: string;
27
+ /** Changes when the buffers must be uploaded again */
28
+ version: number;
29
+ /** Straight RGBA */
30
+ color: Rgba;
31
+ }
32
+ export interface LineItem extends RenderItemBase {
33
+ kind: "line";
34
+ /** Interleaved relative x, y */
35
+ points: Float32Array;
36
+ count: number;
37
+ /** CSS pixels */
38
+ width: number;
39
+ sorted: boolean;
40
+ }
41
+ export interface AreaItem extends RenderItemBase {
42
+ kind: "area";
43
+ points: Float32Array;
44
+ count: number;
45
+ /** Relative y of the baseline */
46
+ baseline: number;
47
+ opacity: number;
48
+ sorted: boolean;
49
+ }
50
+ export interface BarItem extends RenderItemBase {
51
+ kind: "bar";
52
+ /** Interleaved relative x (center), y0, y1 */
53
+ instances: Float32Array;
54
+ count: number;
55
+ /** Half of the bar width, in relative x units */
56
+ halfWidth: number;
57
+ /** Corner radius in CSS pixels */
58
+ radius: number;
59
+ /** Instances are sorted by x */
60
+ sorted: boolean;
61
+ }
62
+ export interface ScatterItem extends RenderItemBase {
63
+ kind: "scatter";
64
+ /** Per point: x f32, y f32, diameter (CSS px) f32, color unorm8x4 */
65
+ instances: ArrayBuffer;
66
+ count: number;
67
+ opacity: number;
68
+ /** Outline width in CSS pixels */
69
+ stroke: number;
70
+ }
71
+ export type RenderItem = LineItem | AreaItem | BarItem | ScatterItem;
72
+ export interface ChartRenderer {
73
+ readonly kind: ChartRendererKind;
74
+ readonly canvas: HTMLCanvasElement;
75
+ /** Drawing buffer size in device pixels */
76
+ resize(width: number, height: number): void;
77
+ render(items: readonly RenderItem[], frame: RenderFrame): void;
78
+ destroy(): void;
79
+ }
80
+ /** Called when the backend is lost (GPU reset, too many contexts, ...) */
81
+ export type RendererLostHandler = () => void;
82
+ export declare const SCATTER_STRIDE = 16;
83
+ export {};
@@ -0,0 +1,6 @@
1
+ //#region src/engine/renderers/types.ts
2
+ var e = 3e38;
3
+ //#endregion
4
+ export { e as GAP };
5
+
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":["GAP"],"sources":["../../../../../charts/src/engine/renderers/types.ts"],"sourcesContent":["// Contract between the chart and its data-layer backends.\n\nimport type { Rgba } from \"../color\";\nimport type { ChartRendererKind } from \"../types\";\n\n/**\n * Data -> clip-space transform. Positions are uploaded relative to an\n * origin (float32 keeps its precision for timestamps), so\n * `clip = relative * scale + offset`.\n */\nexport interface RenderTransform {\n xScale: number;\n xOffset: number;\n yScale: number;\n yOffset: number;\n}\n\nexport interface RenderFrame {\n transform: RenderTransform;\n /** Size of the drawing buffer in device pixels */\n width: number;\n height: number;\n /** Device pixel ratio */\n dpr: number;\n}\n\n/** Missing values are written as this sentinel (NaN is unreliable in shaders) */\nexport const GAP = 3e38;\n\ninterface RenderItemBase {\n /** Identifies the GPU resources of the item */\n key: string;\n /** Changes when the buffers must be uploaded again */\n version: number;\n /** Straight RGBA */\n color: Rgba;\n}\n\nexport interface LineItem extends RenderItemBase {\n kind: \"line\";\n /** Interleaved relative x, y */\n points: Float32Array;\n count: number;\n /** CSS pixels */\n width: number;\n sorted: boolean;\n}\n\nexport interface AreaItem extends RenderItemBase {\n kind: \"area\";\n points: Float32Array;\n count: number;\n /** Relative y of the baseline */\n baseline: number;\n opacity: number;\n sorted: boolean;\n}\n\nexport interface BarItem extends RenderItemBase {\n kind: \"bar\";\n /** Interleaved relative x (center), y0, y1 */\n instances: Float32Array;\n count: number;\n /** Half of the bar width, in relative x units */\n halfWidth: number;\n /** Corner radius in CSS pixels */\n radius: number;\n /** Instances are sorted by x */\n sorted: boolean;\n}\n\nexport interface ScatterItem extends RenderItemBase {\n kind: \"scatter\";\n /** Per point: x f32, y f32, diameter (CSS px) f32, color unorm8x4 */\n instances: ArrayBuffer;\n count: number;\n opacity: number;\n /** Outline width in CSS pixels */\n stroke: number;\n}\n\nexport type RenderItem = LineItem | AreaItem | BarItem | ScatterItem;\n\nexport interface ChartRenderer {\n readonly kind: ChartRendererKind;\n readonly canvas: HTMLCanvasElement;\n /** Drawing buffer size in device pixels */\n resize(width: number, height: number): void;\n render(items: readonly RenderItem[], frame: RenderFrame): void;\n destroy(): void;\n}\n\n/** Called when the backend is lost (GPU reset, too many contexts, ...) */\nexport type RendererLostHandler = () => void;\n\nexport const SCATTER_STRIDE = 16;\n"],"mappings":";AA2BA,IAAaA,IAAM"}
@@ -0,0 +1,2 @@
1
+ const e=require("./range.cjs"),t=require("./shaders.cjs");var n={line:[`a_a`,`a_b`],area:[`a_a`,`a_b`],bar:[`a_inst`],scatter:[`a_pos`,`a_size`,`a_color`]},r=(e,t,n)=>{let r=(t,n)=>{let r=e.createShader(t);return r?(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)):null},i=r(e.VERTEX_SHADER,t.vertex),a=r(e.FRAGMENT_SHADER,t.fragment),o=e.createProgram();return!i||!a||!o?null:(e.attachShader(o,i),e.attachShader(o,a),n.forEach((t,n)=>e.bindAttribLocation(o,n,t)),e.linkProgram(o),e.deleteShader(i),e.deleteShader(a),e.getProgramParameter(o,e.LINK_STATUS)?{program:o,xform:e.getUniformLocation(o,`u_xform`),viewport:e.getUniformLocation(o,`u_viewport`),color:e.getUniformLocation(o,`u_color`),params:e.getUniformLocation(o,`u_params`)}:(e.deleteProgram(o),null))},i=/swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i,a=e=>{let t=e.getExtension(`WEBGL_debug_renderer_info`),n=t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER);return i.test(String(n??``))},o=(i,o,s=!1)=>{let c=i.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!1,depth:!1,stencil:!1,preserveDrawingBuffer:!1,failIfMajorPerformanceCaveat:s});if(!c)return null;if(s&&a(c))return c.getExtension(`WEBGL_lose_context`)?.loseContext(),null;let l=r(c,t.GLSL_LINE,n.line),u=r(c,t.GLSL_AREA,n.area),d=r(c,t.GLSL_BAR,n.bar),f=r(c,t.GLSL_SCATTER,n.scatter);if(!l||!u||!d||!f)return null;let p={line:l,area:u,bar:d,scatter:f},m=!1,h=e=>{e.preventDefault(),m=!0,o()};i.addEventListener(`webglcontextlost`,h);let g=new Map,_=(e,t)=>{let n=c.FLOAT;switch(e.kind){case`line`:case`area`:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,2,n,!1,8,t*8),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,2,n,!1,8,t*8+8),c.vertexAttribDivisor(1,1);break;case`bar`:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,3,n,!1,12,t*12),c.vertexAttribDivisor(0,1);break;default:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,2,n,!1,16,0),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,1,n,!1,16,8),c.vertexAttribDivisor(1,1),c.enableVertexAttribArray(2),c.vertexAttribPointer(2,4,c.UNSIGNED_BYTE,!0,16,12),c.vertexAttribDivisor(2,1)}},v=e=>{c.deleteBuffer(e.buffer),c.deleteVertexArray(e.vao)},y=e=>{let t=g.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return t;t&&v(t);let n=c.createBuffer(),r=c.createVertexArray();if(!n||!r)return null;switch(c.bindVertexArray(r),c.bindBuffer(c.ARRAY_BUFFER,n),e.kind){case`line`:case`area`:c.bufferData(c.ARRAY_BUFFER,e.points,c.STATIC_DRAW,0,e.count*2);break;case`bar`:c.bufferData(c.ARRAY_BUFFER,e.instances,c.STATIC_DRAW,0,e.count*3);break;default:c.bufferData(c.ARRAY_BUFFER,e.instances,c.STATIC_DRAW)}_(e,0),c.bindVertexArray(null);let i={version:e.version,kind:e.kind,buffer:n,vao:r,first:0};return g.set(e.key,i),i},b=(e,t)=>{switch(e.kind){case`line`:return[e.width*t.dpr/2,0];case`area`:return[e.baseline,e.opacity];case`bar`:return[e.halfWidth,e.radius];default:return[e.opacity,e.stroke]}};return{kind:`webgl2`,canvas:i,resize(e,t){i.width=Math.max(1,e),i.height=Math.max(1,t)},render(t,n){if(m||c.isContextLost())return;c.viewport(0,0,i.width,i.height),c.clearColor(0,0,0,0),c.clear(c.COLOR_BUFFER_BIT),c.enable(c.BLEND),c.blendFunc(c.ONE,c.ONE_MINUS_SRC_ALPHA);let r=n.transform,a=new Set;for(let i of t){a.add(i.key);let[t,o]=e.instanceRange(i,n);if(o<=0)continue;let s=y(i);if(!s)continue;let l=p[i.kind];c.useProgram(l.program),c.uniform4f(l.xform,r.xScale,r.xOffset,r.yScale,r.yOffset),c.uniform4f(l.viewport,n.width,n.height,n.dpr,0),c.uniform4f(l.color,i.color[0],i.color[1],i.color[2],i.color[3]);let[u,d]=b(i,n);c.uniform4f(l.params,u,d,0,0),c.bindVertexArray(s.vao),s.first!==t&&(c.bindBuffer(c.ARRAY_BUFFER,s.buffer),_(i,t),s.first=t),c.drawArraysInstanced(c.TRIANGLE_STRIP,0,4,o)}c.bindVertexArray(null);for(let[e,t]of g)a.has(e)||(v(t),g.delete(e))},destroy(){if(i.removeEventListener(`webglcontextlost`,h),!c.isContextLost()){for(let e of g.values())v(e);for(let e of Object.values(p))c.deleteProgram(e.program)}g.clear(),c.getExtension(`WEBGL_lose_context`)?.loseContext()}}};exports.SOFTWARE_RENDERER=i,exports.createWebGl2Renderer=o;
2
+ //# sourceMappingURL=webgl2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl2.cjs","names":["GLSL_LINE","GLSL_AREA","GLSL_BAR","GLSL_SCATTER","instanceRange","require_range","require_shaders","ATTRIBUTES","compile","shader","s","gl","type","code","vs","source","fs","program","attributes","i","name","SOFTWARE_RENDERER","isSoftwareRenderer","info","createWebGl2Renderer","canvas","requireHardware","line","area","bar","scatter","programs","lost","handleLost","event","onLost","resources","setupAttributes","F","item","first","release","res","upload","existing","buffer","vao","params","frame","width","height","t","seen","items","instances","p0","p1","key","p"],"sources":["../../../../../charts/src/engine/renderers/webgl2.ts"],"sourcesContent":["// WebGL2 backend: same instanced primitives as WebGPU, in GLSL ES 3.0.\n\nimport { instanceRange } from \"./range\";\nimport { GLSL_AREA, GLSL_BAR, GLSL_LINE, GLSL_SCATTER } from \"./shaders\";\nimport {\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface Program {\n program: WebGLProgram;\n xform: WebGLUniformLocation | null;\n viewport: WebGLUniformLocation | null;\n color: WebGLUniformLocation | null;\n params: WebGLUniformLocation | null;\n}\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n vao: WebGLVertexArrayObject;\n /** First instance the attribute pointers start at */\n first: number;\n}\n\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_a\", \"a_b\"],\n area: [\"a_a\", \"a_b\"],\n bar: [\"a_inst\"],\n scatter: [\"a_pos\", \"a_size\", \"a_color\"],\n};\n\nconst compile = (\n gl: WebGL2RenderingContext,\n source: { vertex: string; fragment: string },\n attributes: string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n return {\n program,\n xform: gl.getUniformLocation(program, \"u_xform\"),\n viewport: gl.getUniformLocation(program, \"u_viewport\"),\n color: gl.getUniformLocation(program, \"u_color\"),\n params: gl.getUniformLocation(program, \"u_params\"),\n };\n};\n\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\n/** Software rasterizer (SwiftShader, llvmpipe, ...) behind the WebGL context */\nconst isSoftwareRenderer = (gl: WebGL2RenderingContext): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nexport const createWebGl2Renderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: true,\n premultipliedAlpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n });\n if (!gl) return null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n const line = compile(gl, GLSL_LINE, ATTRIBUTES.line);\n const area = compile(gl, GLSL_AREA, ATTRIBUTES.area);\n const bar = compile(gl, GLSL_BAR, ATTRIBUTES.bar);\n const scatter = compile(gl, GLSL_SCATTER, ATTRIBUTES.scatter);\n if (!line || !area || !bar || !scatter) return null;\n const programs = { line, area, bar, scatter };\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n\n /** WebGL2 has no base instance: the pointers start at the first instance */\n const setupAttributes = (item: RenderItem, first: number) => {\n const F = gl.FLOAT;\n switch (item.kind) {\n case \"line\":\n case \"area\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 8, first * 8);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, F, false, 8, first * 8 + 8);\n gl.vertexAttribDivisor(1, 1);\n break;\n case \"bar\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, 12, first * 12);\n gl.vertexAttribDivisor(0, 1);\n break;\n default:\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, SCATTER_STRIDE, 0);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 1, F, false, SCATTER_STRIDE, 8);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(\n 2,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n SCATTER_STRIDE,\n 12,\n );\n gl.vertexAttribDivisor(2, 1);\n break;\n }\n };\n\n const release = (res: ItemResources) => {\n gl.deleteBuffer(res.buffer);\n gl.deleteVertexArray(res.vao);\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) release(existing);\n const buffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n if (!buffer || !vao) return null;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * 2,\n );\n break;\n case \"bar\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.instances,\n gl.STATIC_DRAW,\n 0,\n item.count * 3,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n setupAttributes(item, 0);\n gl.bindVertexArray(null);\n const res = {\n version: item.version,\n kind: item.kind,\n buffer,\n vao,\n first: 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): [number, number] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0];\n case \"area\":\n return [item.baseline, item.opacity];\n case \"bar\":\n return [item.halfWidth, item.radius];\n default:\n return [item.opacity, item.stroke];\n }\n };\n\n return {\n kind: \"webgl2\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1] = params(item, frame);\n gl.uniform4f(program.params, p0, p1, 0, 0);\n gl.bindVertexArray(res.vao);\n if (res.first !== first) {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.buffer);\n setupAttributes(item, first);\n res.first = first;\n }\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n gl.bindVertexArray(null);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) release(res);\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n }\n resources.clear();\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n },\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ChartRenderer, RendererLostHandler } from './types.cjs';
2
+ export declare const SOFTWARE_RENDERER: RegExp;
3
+ export declare const createWebGl2Renderer: (canvas: HTMLCanvasElement, onLost: RendererLostHandler,
4
+ /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */
5
+ requireHardware?: boolean) => ChartRenderer | null;
@@ -0,0 +1,5 @@
1
+ import { ChartRenderer, RendererLostHandler } from './types.js';
2
+ export declare const SOFTWARE_RENDERER: RegExp;
3
+ export declare const createWebGl2Renderer: (canvas: HTMLCanvasElement, onLost: RendererLostHandler,
4
+ /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */
5
+ requireHardware?: boolean) => ChartRenderer | null;
@@ -0,0 +1,134 @@
1
+ import { instanceRange as e } from "./range.js";
2
+ import { GLSL_AREA as t, GLSL_BAR as n, GLSL_LINE as r, GLSL_SCATTER as i } from "./shaders.js";
3
+ //#region src/engine/renderers/webgl2.ts
4
+ var a = {
5
+ line: ["a_a", "a_b"],
6
+ area: ["a_a", "a_b"],
7
+ bar: ["a_inst"],
8
+ scatter: [
9
+ "a_pos",
10
+ "a_size",
11
+ "a_color"
12
+ ]
13
+ }, o = (e, t, n) => {
14
+ let r = (t, n) => {
15
+ let r = e.createShader(t);
16
+ return r ? (e.shaderSource(r, n), e.compileShader(r), e.getShaderParameter(r, e.COMPILE_STATUS) ? r : (e.deleteShader(r), null)) : null;
17
+ }, i = r(e.VERTEX_SHADER, t.vertex), a = r(e.FRAGMENT_SHADER, t.fragment), o = e.createProgram();
18
+ return !i || !a || !o ? null : (e.attachShader(o, i), e.attachShader(o, a), n.forEach((t, n) => e.bindAttribLocation(o, n, t)), e.linkProgram(o), e.deleteShader(i), e.deleteShader(a), e.getProgramParameter(o, e.LINK_STATUS) ? {
19
+ program: o,
20
+ xform: e.getUniformLocation(o, "u_xform"),
21
+ viewport: e.getUniformLocation(o, "u_viewport"),
22
+ color: e.getUniformLocation(o, "u_color"),
23
+ params: e.getUniformLocation(o, "u_params")
24
+ } : (e.deleteProgram(o), null));
25
+ }, s = /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i, c = (e) => {
26
+ let t = e.getExtension("WEBGL_debug_renderer_info"), n = t ? e.getParameter(t.UNMASKED_RENDERER_WEBGL) : e.getParameter(e.RENDERER);
27
+ return s.test(String(n ?? ""));
28
+ }, l = (s, l, u = !1) => {
29
+ let d = s.getContext("webgl2", {
30
+ alpha: !0,
31
+ premultipliedAlpha: !0,
32
+ antialias: !1,
33
+ depth: !1,
34
+ stencil: !1,
35
+ preserveDrawingBuffer: !1,
36
+ failIfMajorPerformanceCaveat: u
37
+ });
38
+ if (!d) return null;
39
+ if (u && c(d)) return d.getExtension("WEBGL_lose_context")?.loseContext(), null;
40
+ let f = o(d, r, a.line), p = o(d, t, a.area), m = o(d, n, a.bar), h = o(d, i, a.scatter);
41
+ if (!f || !p || !m || !h) return null;
42
+ let g = {
43
+ line: f,
44
+ area: p,
45
+ bar: m,
46
+ scatter: h
47
+ }, _ = !1, v = (e) => {
48
+ e.preventDefault(), _ = !0, l();
49
+ };
50
+ s.addEventListener("webglcontextlost", v);
51
+ let y = /* @__PURE__ */ new Map(), b = (e, t) => {
52
+ let n = d.FLOAT;
53
+ switch (e.kind) {
54
+ case "line":
55
+ case "area":
56
+ d.enableVertexAttribArray(0), d.vertexAttribPointer(0, 2, n, !1, 8, t * 8), d.vertexAttribDivisor(0, 1), d.enableVertexAttribArray(1), d.vertexAttribPointer(1, 2, n, !1, 8, t * 8 + 8), d.vertexAttribDivisor(1, 1);
57
+ break;
58
+ case "bar":
59
+ d.enableVertexAttribArray(0), d.vertexAttribPointer(0, 3, n, !1, 12, t * 12), d.vertexAttribDivisor(0, 1);
60
+ break;
61
+ default: d.enableVertexAttribArray(0), d.vertexAttribPointer(0, 2, n, !1, 16, 0), d.vertexAttribDivisor(0, 1), d.enableVertexAttribArray(1), d.vertexAttribPointer(1, 1, n, !1, 16, 8), d.vertexAttribDivisor(1, 1), d.enableVertexAttribArray(2), d.vertexAttribPointer(2, 4, d.UNSIGNED_BYTE, !0, 16, 12), d.vertexAttribDivisor(2, 1);
62
+ }
63
+ }, x = (e) => {
64
+ d.deleteBuffer(e.buffer), d.deleteVertexArray(e.vao);
65
+ }, S = (e) => {
66
+ let t = y.get(e.key);
67
+ if (t && t.version === e.version && t.kind === e.kind) return t;
68
+ t && x(t);
69
+ let n = d.createBuffer(), r = d.createVertexArray();
70
+ if (!n || !r) return null;
71
+ switch (d.bindVertexArray(r), d.bindBuffer(d.ARRAY_BUFFER, n), e.kind) {
72
+ case "line":
73
+ case "area":
74
+ d.bufferData(d.ARRAY_BUFFER, e.points, d.STATIC_DRAW, 0, e.count * 2);
75
+ break;
76
+ case "bar":
77
+ d.bufferData(d.ARRAY_BUFFER, e.instances, d.STATIC_DRAW, 0, e.count * 3);
78
+ break;
79
+ default: d.bufferData(d.ARRAY_BUFFER, e.instances, d.STATIC_DRAW);
80
+ }
81
+ b(e, 0), d.bindVertexArray(null);
82
+ let i = {
83
+ version: e.version,
84
+ kind: e.kind,
85
+ buffer: n,
86
+ vao: r,
87
+ first: 0
88
+ };
89
+ return y.set(e.key, i), i;
90
+ }, C = (e, t) => {
91
+ switch (e.kind) {
92
+ case "line": return [e.width * t.dpr / 2, 0];
93
+ case "area": return [e.baseline, e.opacity];
94
+ case "bar": return [e.halfWidth, e.radius];
95
+ default: return [e.opacity, e.stroke];
96
+ }
97
+ };
98
+ return {
99
+ kind: "webgl2",
100
+ canvas: s,
101
+ resize(e, t) {
102
+ s.width = Math.max(1, e), s.height = Math.max(1, t);
103
+ },
104
+ render(t, n) {
105
+ if (_ || d.isContextLost()) return;
106
+ d.viewport(0, 0, s.width, s.height), d.clearColor(0, 0, 0, 0), d.clear(d.COLOR_BUFFER_BIT), d.enable(d.BLEND), d.blendFunc(d.ONE, d.ONE_MINUS_SRC_ALPHA);
107
+ let r = n.transform, i = /* @__PURE__ */ new Set();
108
+ for (let a of t) {
109
+ i.add(a.key);
110
+ let [t, o] = e(a, n);
111
+ if (o <= 0) continue;
112
+ let s = S(a);
113
+ if (!s) continue;
114
+ let c = g[a.kind];
115
+ d.useProgram(c.program), d.uniform4f(c.xform, r.xScale, r.xOffset, r.yScale, r.yOffset), d.uniform4f(c.viewport, n.width, n.height, n.dpr, 0), d.uniform4f(c.color, a.color[0], a.color[1], a.color[2], a.color[3]);
116
+ let [l, u] = C(a, n);
117
+ d.uniform4f(c.params, l, u, 0, 0), d.bindVertexArray(s.vao), s.first !== t && (d.bindBuffer(d.ARRAY_BUFFER, s.buffer), b(a, t), s.first = t), d.drawArraysInstanced(d.TRIANGLE_STRIP, 0, 4, o);
118
+ }
119
+ d.bindVertexArray(null);
120
+ for (let [e, t] of y) i.has(e) || (x(t), y.delete(e));
121
+ },
122
+ destroy() {
123
+ if (s.removeEventListener("webglcontextlost", v), !d.isContextLost()) {
124
+ for (let e of y.values()) x(e);
125
+ for (let e of Object.values(g)) d.deleteProgram(e.program);
126
+ }
127
+ y.clear(), d.getExtension("WEBGL_lose_context")?.loseContext();
128
+ }
129
+ };
130
+ };
131
+ //#endregion
132
+ export { s as SOFTWARE_RENDERER, l as createWebGl2Renderer };
133
+
134
+ //# sourceMappingURL=webgl2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl2.js","names":["ATTRIBUTES","compile","shader","s","gl","type","code","vs","source","fs","program","attributes","i","name","SOFTWARE_RENDERER","isSoftwareRenderer","info","createWebGl2Renderer","canvas","requireHardware","line","GLSL_LINE","area","GLSL_AREA","bar","GLSL_BAR","scatter","GLSL_SCATTER","programs","lost","handleLost","event","onLost","resources","setupAttributes","F","item","first","release","res","upload","existing","buffer","vao","params","frame","width","height","t","seen","items","instances","instanceRange","p0","p1","key","p"],"sources":["../../../../../charts/src/engine/renderers/webgl2.ts"],"sourcesContent":["// WebGL2 backend: same instanced primitives as WebGPU, in GLSL ES 3.0.\n\nimport { instanceRange } from \"./range\";\nimport { GLSL_AREA, GLSL_BAR, GLSL_LINE, GLSL_SCATTER } from \"./shaders\";\nimport {\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface Program {\n program: WebGLProgram;\n xform: WebGLUniformLocation | null;\n viewport: WebGLUniformLocation | null;\n color: WebGLUniformLocation | null;\n params: WebGLUniformLocation | null;\n}\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n vao: WebGLVertexArrayObject;\n /** First instance the attribute pointers start at */\n first: number;\n}\n\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_a\", \"a_b\"],\n area: [\"a_a\", \"a_b\"],\n bar: [\"a_inst\"],\n scatter: [\"a_pos\", \"a_size\", \"a_color\"],\n};\n\nconst compile = (\n gl: WebGL2RenderingContext,\n source: { vertex: string; fragment: string },\n attributes: string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n return {\n program,\n xform: gl.getUniformLocation(program, \"u_xform\"),\n viewport: gl.getUniformLocation(program, \"u_viewport\"),\n color: gl.getUniformLocation(program, \"u_color\"),\n params: gl.getUniformLocation(program, \"u_params\"),\n };\n};\n\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\n/** Software rasterizer (SwiftShader, llvmpipe, ...) behind the WebGL context */\nconst isSoftwareRenderer = (gl: WebGL2RenderingContext): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nexport const createWebGl2Renderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: true,\n premultipliedAlpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n });\n if (!gl) return null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n const line = compile(gl, GLSL_LINE, ATTRIBUTES.line);\n const area = compile(gl, GLSL_AREA, ATTRIBUTES.area);\n const bar = compile(gl, GLSL_BAR, ATTRIBUTES.bar);\n const scatter = compile(gl, GLSL_SCATTER, ATTRIBUTES.scatter);\n if (!line || !area || !bar || !scatter) return null;\n const programs = { line, area, bar, scatter };\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n\n /** WebGL2 has no base instance: the pointers start at the first instance */\n const setupAttributes = (item: RenderItem, first: number) => {\n const F = gl.FLOAT;\n switch (item.kind) {\n case \"line\":\n case \"area\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 8, first * 8);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, F, false, 8, first * 8 + 8);\n gl.vertexAttribDivisor(1, 1);\n break;\n case \"bar\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, 12, first * 12);\n gl.vertexAttribDivisor(0, 1);\n break;\n default:\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, SCATTER_STRIDE, 0);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 1, F, false, SCATTER_STRIDE, 8);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(\n 2,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n SCATTER_STRIDE,\n 12,\n );\n gl.vertexAttribDivisor(2, 1);\n break;\n }\n };\n\n const release = (res: ItemResources) => {\n gl.deleteBuffer(res.buffer);\n gl.deleteVertexArray(res.vao);\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) release(existing);\n const buffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n if (!buffer || !vao) return null;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * 2,\n );\n break;\n case \"bar\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.instances,\n gl.STATIC_DRAW,\n 0,\n item.count * 3,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n setupAttributes(item, 0);\n gl.bindVertexArray(null);\n const res = {\n version: item.version,\n kind: item.kind,\n buffer,\n vao,\n first: 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): [number, number] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0];\n case \"area\":\n return [item.baseline, item.opacity];\n case \"bar\":\n return [item.halfWidth, item.radius];\n default:\n return [item.opacity, item.stroke];\n }\n };\n\n return {\n kind: \"webgl2\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1] = params(item, frame);\n gl.uniform4f(program.params, p0, p1, 0, 0);\n gl.bindVertexArray(res.vao);\n if (res.first !== first) {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.buffer);\n setupAttributes(item, first);\n res.first = first;\n }\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n gl.bindVertexArray(null);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) release(res);\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n }\n resources.clear();\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n },\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require("./range.cjs"),t=require("./shaders.cjs");var n=64,r=async(r,i,a=!1)=>{let o=navigator.gpu;if(!o)return null;let s=await o.requestAdapter();if(!s)return null;let c=s;if(a&&(c.info?.isFallbackAdapter||c.isFallbackAdapter))return null;let l=await s.requestDevice(),u=r.getContext(`webgpu`);if(!u)return l.destroy(),null;let d=o.getPreferredCanvasFormat();u.configure({device:l,format:d,alphaMode:`premultiplied`});let f=!1;l.lost.then(()=>{f||i()});let p=l.createBindGroupLayout({entries:[{binding:0,visibility:3,buffer:{type:`uniform`}}]}),m=l.createPipelineLayout({bindGroupLayouts:[p]}),h={color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}},g=(e,t)=>{let n=l.createShaderModule({code:e});return l.createRenderPipeline({layout:m,vertex:{module:n,entryPoint:`vs`,buffers:t},fragment:{module:n,entryPoint:`fs`,targets:[{format:d,blend:h}]},primitive:{topology:`triangle-strip`}})},_=[{arrayStride:8,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x2`}]},{arrayStride:8,stepMode:`instance`,attributes:[{shaderLocation:1,offset:0,format:`float32x2`}]}],v={line:g(t.WGSL_LINE,_),area:g(t.WGSL_AREA,_),bar:g(t.WGSL_BAR,[{arrayStride:12,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`}]}]),scatter:g(t.WGSL_SCATTER,[{arrayStride:16,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x2`},{shaderLocation:1,offset:8,format:`float32`},{shaderLocation:2,offset:12,format:`unorm8x4`}]}])},y=new Map,b=new Float32Array(n/4),x=e=>{switch(e.kind){case`line`:case`area`:return e.points.subarray(0,e.count*2);case`bar`:return e.instances.subarray(0,e.count*3);default:return e.instances}},S=e=>{let t=y.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return t;t?.vertex?.destroy();let r=x(e),i=Math.max(16,Math.ceil(r.byteLength/4)*4),a=r.byteLength>0?l.createBuffer({size:i,usage:40}):null;if(a&&(r instanceof Float32Array?l.queue.writeBuffer(a,0,r.buffer,r.byteOffset,r.byteLength):l.queue.writeBuffer(a,0,r)),t)t.version=e.version,t.kind=e.kind,t.vertex=a;else{let r=l.createBuffer({size:n,usage:72});t={version:e.version,kind:e.kind,vertex:a,uniform:r,bindGroup:l.createBindGroup({layout:p,entries:[{binding:0,resource:{buffer:r}}]})},y.set(e.key,t)}return t},C=(e,t)=>{switch(e.kind){case`line`:return[e.width*t.dpr/2,0,0,0];case`area`:return[e.baseline,e.opacity,0,0];case`bar`:return[e.halfWidth,e.radius,0,0];default:return[e.opacity,e.stroke,0,0]}};return{kind:`webgpu`,canvas:r,resize(e,t){r.width=Math.max(1,e),r.height=Math.max(1,t)},render(t,n){if(f)return;let r=new Set,i=l.createCommandEncoder(),a=i.beginRenderPass({colorAttachments:[{view:u.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:`clear`,storeOp:`store`}]}),o=n.transform;for(let i of t){r.add(i.key);let[t,s]=e.instanceRange(i,n);if(s<=0)continue;let c=S(i);c.vertex&&(b.set([o.xScale,o.xOffset,o.yScale,o.yOffset,n.width,n.height,n.dpr,0,...i.color,...C(i,n)],0),l.queue.writeBuffer(c.uniform,0,b),a.setPipeline(v[i.kind]),a.setBindGroup(0,c.bindGroup),a.setVertexBuffer(0,c.vertex),(i.kind===`line`||i.kind===`area`)&&a.setVertexBuffer(1,c.vertex,8),a.draw(4,s,0,t))}a.end(),l.queue.submit([i.finish()]);for(let[e,t]of y)r.has(e)||(t.vertex?.destroy(),t.uniform.destroy(),y.delete(e))},destroy(){f=!0;for(let e of y.values())e.vertex?.destroy(),e.uniform.destroy();y.clear(),u.unconfigure(),l.destroy()}}};exports.createWebGpuRenderer=r;
2
+ //# sourceMappingURL=webgpu.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgpu.cjs","names":["WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","instanceRange","require_range","require_shaders","UNIFORM_SIZE","createWebGpuRenderer","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","pipeline","module","segment","pipelines","resources","uniformData","vertexData","item","upload","res","data","size","vertex","uniform","params","frame","width","height","seen","encoder","pass","t","items","first","instances","key"],"sources":["../../../../../charts/src/engine/renderers/webgpu.ts"],"sourcesContent":["// WebGPU backend: one instanced draw per series.\n\nimport type { ChartRendererKind } from \"../types\";\nimport { instanceRange } from \"./range\";\nimport { WGSL_AREA, WGSL_BAR, WGSL_LINE, WGSL_SCATTER } from \"./shaders\";\nimport {\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nconst UNIFORM_SIZE = 64;\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n vertex: GPUBuffer | null;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n/** Whether `navigator.gpu` exists (an adapter may still be unavailable) */\nexport const hasWebGpu = (): boolean =>\n typeof navigator !== \"undefined\" && !!(navigator as GpuNavigator).gpu;\n\nexport const createWebGpuRenderer = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<ChartRenderer | null> => {\n const gpu = (navigator as GpuNavigator).gpu;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const pipeline = (code: string, buffers: GPUVertexBufferLayout[]) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n };\n const segment: GPUVertexBufferLayout[] = [\n {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }],\n },\n {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format: \"float32x2\" }],\n },\n ];\n const pipelines = {\n line: pipeline(WGSL_LINE, segment),\n area: pipeline(WGSL_AREA, segment),\n bar: pipeline(WGSL_BAR, [\n {\n arrayStride: 12,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x3\" }],\n },\n ]),\n scatter: pipeline(WGSL_SCATTER, [\n {\n arrayStride: SCATTER_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32\" },\n { shaderLocation: 2, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_SIZE / 4);\n\n const vertexData = (item: RenderItem): ArrayBuffer | Float32Array => {\n switch (item.kind) {\n case \"line\":\n case \"area\":\n return item.points.subarray(0, item.count * 2);\n case \"bar\":\n return item.instances.subarray(0, item.count * 3);\n default:\n return item.instances;\n }\n };\n\n const upload = (item: RenderItem): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n return res;\n }\n res?.vertex?.destroy();\n const data = vertexData(item);\n const size = Math.max(16, Math.ceil(data.byteLength / 4) * 4);\n const vertex =\n data.byteLength > 0\n ? device.createBuffer({ size, usage: BUFFER_VERTEX | BUFFER_COPY_DST })\n : null;\n if (vertex) {\n if (data instanceof Float32Array) {\n device.queue.writeBuffer(\n vertex,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength,\n );\n } else {\n device.queue.writeBuffer(vertex, 0, data);\n }\n }\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_SIZE,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n }\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): number[] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [item.baseline, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, 0, 0];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n const renderer: ChartRenderer = {\n kind: \"webgpu\" satisfies ChartRendererKind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const seen = new Set<string>();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n const t = frame.transform;\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n uniformData.set(\n [\n t.xScale,\n t.xOffset,\n t.yScale,\n t.yOffset,\n frame.width,\n frame.height,\n frame.dpr,\n 0,\n ...item.color,\n ...params(item, frame),\n ],\n 0,\n );\n device.queue.writeBuffer(res.uniform, 0, uniformData);\n pass.setPipeline(pipelines[item.kind]);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"line\" || item.kind === \"area\") {\n pass.setVertexBuffer(1, res.vertex, 8);\n }\n pass.draw(4, instances, 0, first);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n res.vertex?.destroy();\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n res.vertex?.destroy();\n res.uniform.destroy();\n }\n resources.clear();\n context.unconfigure();\n device.destroy();\n },\n };\n return renderer;\n};\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ChartRenderer, RendererLostHandler } from './types.cjs';
2
+ /** Whether `navigator.gpu` exists (an adapter may still be unavailable) */
3
+ export declare const hasWebGpu: () => boolean;
4
+ export declare const createWebGpuRenderer: (canvas: HTMLCanvasElement, onLost: RendererLostHandler,
5
+ /** Refuses fallback (software) adapters */
6
+ requireHardware?: boolean) => Promise<ChartRenderer | null>;
@@ -0,0 +1,6 @@
1
+ import { ChartRenderer, RendererLostHandler } from './types.js';
2
+ /** Whether `navigator.gpu` exists (an adapter may still be unavailable) */
3
+ export declare const hasWebGpu: () => boolean;
4
+ export declare const createWebGpuRenderer: (canvas: HTMLCanvasElement, onLost: RendererLostHandler,
5
+ /** Refuses fallback (software) adapters */
6
+ requireHardware?: boolean) => Promise<ChartRenderer | null>;