@363045841yyt/klinechart-core 0.9.0-alpha.0 → 0.9.0-alpha.2

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 (372) hide show
  1. package/dist/controllers/createChartController.d.ts.map +1 -1
  2. package/dist/controllers/createChartController.js +31 -13
  3. package/dist/controllers/createChartController.js.map +1 -1
  4. package/dist/controllers/index.d.ts +1 -0
  5. package/dist/controllers/index.d.ts.map +1 -1
  6. package/dist/controllers/index.js.map +1 -1
  7. package/dist/controllers/types.d.ts +12 -0
  8. package/dist/controllers/types.d.ts.map +1 -1
  9. package/dist/engine/chart.d.ts +29 -11
  10. package/dist/engine/chart.d.ts.map +1 -1
  11. package/dist/engine/chart.js +147 -25
  12. package/dist/engine/chart.js.map +1 -1
  13. package/dist/engine/controller/interaction.d.ts +29 -4
  14. package/dist/engine/controller/interaction.d.ts.map +1 -1
  15. package/dist/engine/controller/interaction.js +78 -31
  16. package/dist/engine/controller/interaction.js.map +1 -1
  17. package/dist/engine/data/incrementalLoadHint.d.ts.map +1 -1
  18. package/dist/engine/data/incrementalLoadHint.js +5 -1
  19. package/dist/engine/data/incrementalLoadHint.js.map +1 -1
  20. package/dist/engine/drawing/DrawingState.d.ts +19 -34
  21. package/dist/engine/drawing/DrawingState.d.ts.map +1 -1
  22. package/dist/engine/drawing/DrawingState.js +110 -92
  23. package/dist/engine/drawing/DrawingState.js.map +1 -1
  24. package/dist/engine/drawing/index.d.ts +4 -1
  25. package/dist/engine/drawing/index.d.ts.map +1 -1
  26. package/dist/engine/drawing/index.js +9 -4
  27. package/dist/engine/drawing/index.js.map +1 -1
  28. package/dist/engine/drawing/interaction.d.ts +9 -29
  29. package/dist/engine/drawing/interaction.d.ts.map +1 -1
  30. package/dist/engine/drawing/interaction.js +23 -40
  31. package/dist/engine/drawing/interaction.js.map +1 -1
  32. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  33. package/dist/engine/indicators/chartIndicatorManager.js +4 -12
  34. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  35. package/dist/engine/layout/chartPaneLayout.d.ts +0 -2
  36. package/dist/engine/layout/chartPaneLayout.d.ts.map +1 -1
  37. package/dist/engine/layout/chartPaneLayout.js +5 -9
  38. package/dist/engine/layout/chartPaneLayout.js.map +1 -1
  39. package/dist/engine/layout/pane.d.ts +0 -39
  40. package/dist/engine/layout/pane.d.ts.map +1 -1
  41. package/dist/engine/layout/pane.js +0 -9
  42. package/dist/engine/layout/pane.js.map +1 -1
  43. package/dist/engine/paneRenderer.d.ts +1 -10
  44. package/dist/engine/paneRenderer.d.ts.map +1 -1
  45. package/dist/engine/paneRenderer.js +2 -19
  46. package/dist/engine/paneRenderer.js.map +1 -1
  47. package/dist/engine/render/chartRenderer.d.ts +49 -8
  48. package/dist/engine/render/chartRenderer.d.ts.map +1 -1
  49. package/dist/engine/render/chartRenderer.js +143 -72
  50. package/dist/engine/render/chartRenderer.js.map +1 -1
  51. package/dist/engine/renderers/Indicator/atr.js +3 -13
  52. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  53. package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
  54. package/dist/engine/renderers/Indicator/boll.js +12 -24
  55. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  56. package/dist/engine/renderers/Indicator/cci.js +6 -13
  57. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  58. package/dist/engine/renderers/Indicator/chaikinVol.js +3 -11
  59. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  60. package/dist/engine/renderers/Indicator/cmf.js +3 -11
  61. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  62. package/dist/engine/renderers/Indicator/dema.js +3 -11
  63. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  64. package/dist/engine/renderers/Indicator/donchian.js +3 -11
  65. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  66. package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
  67. package/dist/engine/renderers/Indicator/ene.js +12 -24
  68. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  69. package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
  70. package/dist/engine/renderers/Indicator/expma.js +5 -11
  71. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  72. package/dist/engine/renderers/Indicator/fastk.js +6 -13
  73. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  74. package/dist/engine/renderers/Indicator/fib.js +3 -11
  75. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  76. package/dist/engine/renderers/Indicator/hma.js +3 -11
  77. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  78. package/dist/engine/renderers/Indicator/hv.js +3 -11
  79. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  80. package/dist/engine/renderers/Indicator/ichimoku.js +24 -18
  81. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  82. package/dist/engine/renderers/Indicator/kama.js +3 -11
  83. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  84. package/dist/engine/renderers/Indicator/keltner.js +3 -11
  85. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  86. package/dist/engine/renderers/Indicator/kst.js +9 -17
  87. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  88. package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
  89. package/dist/engine/renderers/Indicator/ma.js +10 -21
  90. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  91. package/dist/engine/renderers/Indicator/macd.js +14 -44
  92. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  93. package/dist/engine/renderers/Indicator/mfi.js +3 -11
  94. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  95. package/dist/engine/renderers/Indicator/mom.js +6 -13
  96. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  97. package/dist/engine/renderers/Indicator/obv.js +3 -11
  98. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  99. package/dist/engine/renderers/Indicator/parkinson.js +3 -11
  100. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  101. package/dist/engine/renderers/Indicator/pvt.js +3 -11
  102. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  103. package/dist/engine/renderers/Indicator/roc.js +3 -11
  104. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  105. package/dist/engine/renderers/Indicator/rsi.js +12 -20
  106. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  107. package/dist/engine/renderers/Indicator/shared/webglBand.d.ts +0 -2
  108. package/dist/engine/renderers/Indicator/shared/webglBand.d.ts.map +1 -1
  109. package/dist/engine/renderers/Indicator/shared/webglBand.js +0 -6
  110. package/dist/engine/renderers/Indicator/shared/webglBand.js.map +1 -1
  111. package/dist/engine/renderers/Indicator/stoch.js +9 -17
  112. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  113. package/dist/engine/renderers/Indicator/tema.js +3 -11
  114. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  115. package/dist/engine/renderers/Indicator/trix.js +3 -11
  116. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  117. package/dist/engine/renderers/Indicator/vma.js +3 -11
  118. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  119. package/dist/engine/renderers/Indicator/vwap.js +3 -11
  120. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  121. package/dist/engine/renderers/Indicator/wma.js +3 -11
  122. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  123. package/dist/engine/renderers/Indicator/wmsr.js +6 -13
  124. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  125. package/dist/engine/renderers/candle.d.ts.map +1 -1
  126. package/dist/engine/renderers/candle.js +21 -28
  127. package/dist/engine/renderers/candle.js.map +1 -1
  128. package/dist/engine/renderers/candleViaRenderer.d.ts +19 -0
  129. package/dist/engine/renderers/candleViaRenderer.d.ts.map +1 -0
  130. package/dist/engine/renderers/candleViaRenderer.js +15 -0
  131. package/dist/engine/renderers/candleViaRenderer.js.map +1 -0
  132. package/dist/engine/renderers/linesViaRenderer.d.ts +55 -0
  133. package/dist/engine/renderers/linesViaRenderer.d.ts.map +1 -0
  134. package/dist/engine/renderers/linesViaRenderer.js +169 -0
  135. package/dist/engine/renderers/linesViaRenderer.js.map +1 -0
  136. package/dist/engine/renderers/rectsViaRenderer.d.ts +18 -0
  137. package/dist/engine/renderers/rectsViaRenderer.d.ts.map +1 -0
  138. package/dist/engine/renderers/rectsViaRenderer.js +63 -0
  139. package/dist/engine/renderers/rectsViaRenderer.js.map +1 -0
  140. package/dist/engine/renderers/subVolume.js +7 -26
  141. package/dist/engine/renderers/subVolume.js.map +1 -1
  142. package/dist/engine/renderers/timeAxis.js +1 -1
  143. package/dist/engine/renderers/timeAxis.js.map +1 -1
  144. package/dist/engine/state/chartStateKernel.d.ts +11 -2
  145. package/dist/engine/state/chartStateKernel.d.ts.map +1 -1
  146. package/dist/engine/state/chartStateKernel.js +28 -12
  147. package/dist/engine/state/chartStateKernel.js.map +1 -1
  148. package/dist/engine/state/index.d.ts +1 -1
  149. package/dist/engine/state/index.d.ts.map +1 -1
  150. package/dist/engine/state/index.js +1 -1
  151. package/dist/engine/state/index.js.map +1 -1
  152. package/dist/engine/state/interactionState.d.ts +15 -7
  153. package/dist/engine/state/interactionState.d.ts.map +1 -1
  154. package/dist/engine/state/interactionState.js +55 -60
  155. package/dist/engine/state/interactionState.js.map +1 -1
  156. package/dist/engine/state/rendererState.d.ts +14 -0
  157. package/dist/engine/state/rendererState.d.ts.map +1 -0
  158. package/dist/engine/state/rendererState.js +25 -0
  159. package/dist/engine/state/rendererState.js.map +1 -0
  160. package/dist/engine/state/themeState.d.ts +11 -4
  161. package/dist/engine/state/themeState.d.ts.map +1 -1
  162. package/dist/engine/state/themeState.js +13 -5
  163. package/dist/engine/state/themeState.js.map +1 -1
  164. package/dist/engine/state/viewportState.d.ts.map +1 -1
  165. package/dist/engine/state/viewportState.js +7 -3
  166. package/dist/engine/state/viewportState.js.map +1 -1
  167. package/dist/engine/subPaneManager.d.ts.map +1 -1
  168. package/dist/engine/subPaneManager.js +2 -10
  169. package/dist/engine/subPaneManager.js.map +1 -1
  170. package/dist/foundation/config/chartSettings.d.ts +16 -4
  171. package/dist/foundation/config/chartSettings.d.ts.map +1 -1
  172. package/dist/foundation/config/chartSettings.js +21 -6
  173. package/dist/foundation/config/chartSettings.js.map +1 -1
  174. package/dist/foundation/plugin/index.d.ts +0 -1
  175. package/dist/foundation/plugin/index.d.ts.map +1 -1
  176. package/dist/foundation/plugin/rendererPluginManager.d.ts +1 -22
  177. package/dist/foundation/plugin/rendererPluginManager.d.ts.map +1 -1
  178. package/dist/foundation/plugin/rendererPluginManager.js +0 -84
  179. package/dist/foundation/plugin/rendererPluginManager.js.map +1 -1
  180. package/dist/foundation/plugin/types.d.ts +11 -17
  181. package/dist/foundation/plugin/types.d.ts.map +1 -1
  182. package/dist/foundation/plugin/types.js.map +1 -1
  183. package/dist/foundation/reactivity/frameTransaction.d.ts +71 -0
  184. package/dist/foundation/reactivity/frameTransaction.d.ts.map +1 -0
  185. package/dist/foundation/reactivity/frameTransaction.js +170 -0
  186. package/dist/foundation/reactivity/frameTransaction.js.map +1 -0
  187. package/dist/foundation/reactivity/index.d.ts +4 -2
  188. package/dist/foundation/reactivity/index.d.ts.map +1 -1
  189. package/dist/foundation/reactivity/index.js +2 -1
  190. package/dist/foundation/reactivity/index.js.map +1 -1
  191. package/dist/foundation/reactivity/signal.d.ts +20 -0
  192. package/dist/foundation/reactivity/signal.d.ts.map +1 -1
  193. package/dist/foundation/reactivity/signal.js +27 -0
  194. package/dist/foundation/reactivity/signal.js.map +1 -1
  195. package/dist/foundation/tokens/theme-dark.d.ts.map +1 -1
  196. package/dist/foundation/tokens/theme-dark.js +2 -1
  197. package/dist/foundation/tokens/theme-dark.js.map +1 -1
  198. package/dist/foundation/tokens/theme-light.d.ts.map +1 -1
  199. package/dist/foundation/tokens/theme-light.js +2 -1
  200. package/dist/foundation/tokens/theme-light.js.map +1 -1
  201. package/dist/rendering/render/Renderer.d.ts +29 -14
  202. package/dist/rendering/render/Renderer.d.ts.map +1 -1
  203. package/dist/rendering/render/Renderer.js +3 -10
  204. package/dist/rendering/render/Renderer.js.map +1 -1
  205. package/dist/rendering/render/SurfaceBackend.d.ts +5 -7
  206. package/dist/rendering/render/SurfaceBackend.d.ts.map +1 -1
  207. package/dist/rendering/render/SurfaceBackend.js +5 -7
  208. package/dist/rendering/render/SurfaceBackend.js.map +1 -1
  209. package/dist/rendering/render/createCanvas2DRenderer.d.ts +3 -0
  210. package/dist/rendering/render/createCanvas2DRenderer.d.ts.map +1 -0
  211. package/dist/rendering/render/createCanvas2DRenderer.js +74 -0
  212. package/dist/rendering/render/createCanvas2DRenderer.js.map +1 -0
  213. package/dist/rendering/render/createDefaultRendererHost.d.ts +4 -0
  214. package/dist/rendering/render/createDefaultRendererHost.d.ts.map +1 -0
  215. package/dist/rendering/render/createDefaultRendererHost.js +54 -0
  216. package/dist/rendering/render/createDefaultRendererHost.js.map +1 -0
  217. package/dist/rendering/render/createWebGLRenderer.d.ts.map +1 -1
  218. package/dist/rendering/render/createWebGLRenderer.js +42 -80
  219. package/dist/rendering/render/createWebGLRenderer.js.map +1 -1
  220. package/dist/rendering/render/createWebGPURenderer.d.ts +11 -0
  221. package/dist/rendering/render/createWebGPURenderer.d.ts.map +1 -0
  222. package/dist/rendering/render/createWebGPURenderer.js +619 -0
  223. package/dist/rendering/render/createWebGPURenderer.js.map +1 -0
  224. package/dist/rendering/render/createWebGPUSurfaceBackend.d.ts +15 -0
  225. package/dist/rendering/render/createWebGPUSurfaceBackend.d.ts.map +1 -0
  226. package/dist/rendering/render/createWebGPUSurfaceBackend.js +92 -0
  227. package/dist/rendering/render/createWebGPUSurfaceBackend.js.map +1 -0
  228. package/dist/rendering/render/frameMetrics.d.ts +19 -0
  229. package/dist/rendering/render/frameMetrics.d.ts.map +1 -0
  230. package/dist/rendering/render/frameMetrics.js +43 -0
  231. package/dist/rendering/render/frameMetrics.js.map +1 -0
  232. package/dist/rendering/render/index.d.ts +10 -0
  233. package/dist/rendering/render/index.d.ts.map +1 -1
  234. package/dist/rendering/render/index.js +6 -0
  235. package/dist/rendering/render/index.js.map +1 -1
  236. package/dist/rendering/render/rendererHost.d.ts +34 -0
  237. package/dist/rendering/render/rendererHost.d.ts.map +1 -0
  238. package/dist/rendering/render/rendererHost.js +144 -0
  239. package/dist/rendering/render/rendererHost.js.map +1 -0
  240. package/dist/rendering/render/webgpuResourceTable.d.ts +25 -0
  241. package/dist/rendering/render/webgpuResourceTable.d.ts.map +1 -0
  242. package/dist/rendering/render/webgpuResourceTable.js +54 -0
  243. package/dist/rendering/render/webgpuResourceTable.js.map +1 -0
  244. package/dist/rendering/scene/createLayerFromPlugin.d.ts.map +1 -1
  245. package/dist/rendering/scene/createLayerFromPlugin.js +10 -2
  246. package/dist/rendering/scene/createLayerFromPlugin.js.map +1 -1
  247. package/dist/rendering/scene/layerRegistry.d.ts +3 -5
  248. package/dist/rendering/scene/layerRegistry.d.ts.map +1 -1
  249. package/dist/rendering/scene/layerRegistry.js +1 -1
  250. package/dist/rendering/scene/layerRegistry.js.map +1 -1
  251. package/dist/rendering/scene/retainedScene.d.ts +60 -0
  252. package/dist/rendering/scene/retainedScene.d.ts.map +1 -0
  253. package/dist/rendering/scene/retainedScene.js +42 -0
  254. package/dist/rendering/scene/retainedScene.js.map +1 -0
  255. package/dist/version.d.ts +1 -1
  256. package/dist/version.js +1 -1
  257. package/package.json +2 -1
  258. package/src/__tests__/signal.test.ts +47 -1
  259. package/src/controllers/__tests__/createChartController.theme.test.ts +102 -0
  260. package/src/controllers/createChartController.ts +36 -12
  261. package/src/controllers/index.ts +5 -0
  262. package/src/controllers/types.ts +14 -0
  263. package/src/engine/__tests__/chart.dpr.test.ts +64 -0
  264. package/src/engine/__tests__/paneRenderer.resize.test.ts +0 -7
  265. package/src/engine/__tests__/renderSinglePath.test.ts +121 -0
  266. package/src/engine/chart.ts +172 -25
  267. package/src/engine/controller/__tests__/interaction.dpr.test.ts +45 -41
  268. package/src/engine/controller/interaction.ts +81 -30
  269. package/src/engine/data/__tests__/chartDataManager.incrementalLoad.test.ts +1 -0
  270. package/src/engine/data/incrementalLoadHint.ts +6 -1
  271. package/src/engine/drawing/DrawingState.ts +107 -89
  272. package/src/engine/drawing/__tests__/drawingState.workCopy.test.ts +95 -36
  273. package/src/engine/drawing/__tests__/drawingStore.projection.test.ts +22 -0
  274. package/src/engine/drawing/index.ts +12 -4
  275. package/src/engine/drawing/interaction.ts +25 -40
  276. package/src/engine/indicators/chartIndicatorManager.ts +6 -16
  277. package/src/engine/layout/chartPaneLayout.ts +6 -11
  278. package/src/engine/layout/pane.ts +0 -44
  279. package/src/engine/paneRenderer.ts +3 -34
  280. package/src/engine/render/chartRenderer.ts +181 -81
  281. package/src/engine/renderers/Indicator/atr.ts +5 -17
  282. package/src/engine/renderers/Indicator/boll.ts +15 -26
  283. package/src/engine/renderers/Indicator/cci.ts +7 -17
  284. package/src/engine/renderers/Indicator/chaikinVol.ts +3 -15
  285. package/src/engine/renderers/Indicator/cmf.ts +3 -15
  286. package/src/engine/renderers/Indicator/dema.ts +3 -15
  287. package/src/engine/renderers/Indicator/donchian.ts +3 -12
  288. package/src/engine/renderers/Indicator/ene.ts +15 -25
  289. package/src/engine/renderers/Indicator/expma.ts +4 -13
  290. package/src/engine/renderers/Indicator/fastk.ts +7 -17
  291. package/src/engine/renderers/Indicator/fib.ts +3 -12
  292. package/src/engine/renderers/Indicator/hma.ts +3 -15
  293. package/src/engine/renderers/Indicator/hv.ts +3 -15
  294. package/src/engine/renderers/Indicator/ichimoku.ts +21 -24
  295. package/src/engine/renderers/Indicator/kama.ts +3 -15
  296. package/src/engine/renderers/Indicator/keltner.ts +3 -12
  297. package/src/engine/renderers/Indicator/kst.ts +9 -20
  298. package/src/engine/renderers/Indicator/ma.ts +9 -21
  299. package/src/engine/renderers/Indicator/macd.ts +27 -102
  300. package/src/engine/renderers/Indicator/mfi.ts +3 -15
  301. package/src/engine/renderers/Indicator/mom.ts +7 -17
  302. package/src/engine/renderers/Indicator/obv.ts +3 -15
  303. package/src/engine/renderers/Indicator/parkinson.ts +3 -15
  304. package/src/engine/renderers/Indicator/pvt.ts +3 -15
  305. package/src/engine/renderers/Indicator/roc.ts +3 -15
  306. package/src/engine/renderers/Indicator/rsi.ts +12 -23
  307. package/src/engine/renderers/Indicator/shared/webglBand.ts +0 -13
  308. package/src/engine/renderers/Indicator/stoch.ts +9 -20
  309. package/src/engine/renderers/Indicator/tema.ts +3 -15
  310. package/src/engine/renderers/Indicator/trix.ts +3 -12
  311. package/src/engine/renderers/Indicator/vma.ts +3 -15
  312. package/src/engine/renderers/Indicator/vwap.ts +3 -15
  313. package/src/engine/renderers/Indicator/wma.ts +3 -15
  314. package/src/engine/renderers/Indicator/wmsr.ts +7 -17
  315. package/src/engine/renderers/__tests__/candle.sceneRenderer.test.ts +208 -0
  316. package/src/engine/renderers/__tests__/candleViaRenderer.test.ts +100 -0
  317. package/src/engine/renderers/__tests__/linesViaRenderer.test.ts +263 -0
  318. package/src/engine/renderers/__tests__/rectsViaRenderer.test.ts +87 -0
  319. package/src/engine/renderers/candle.ts +26 -69
  320. package/src/engine/renderers/candleViaRenderer.ts +38 -0
  321. package/src/engine/renderers/linesViaRenderer.ts +226 -0
  322. package/src/engine/renderers/rectsViaRenderer.ts +83 -0
  323. package/src/engine/renderers/subVolume.ts +9 -61
  324. package/src/engine/renderers/timeAxis.ts +1 -1
  325. package/src/engine/state/__tests__/effectiveTheme.test.ts +49 -0
  326. package/src/engine/state/__tests__/rendererState.test.ts +36 -0
  327. package/src/engine/state/__tests__/settingsState.test.ts +1 -1
  328. package/src/engine/state/chartStateKernel.ts +38 -17
  329. package/src/engine/state/index.ts +6 -1
  330. package/src/engine/state/interactionState.ts +73 -102
  331. package/src/engine/state/rendererState.ts +32 -0
  332. package/src/engine/state/themeState.ts +15 -8
  333. package/src/engine/state/viewportState.ts +6 -3
  334. package/src/engine/subPaneManager.ts +2 -16
  335. package/src/foundation/config/__tests__/chartSettings.test.ts +25 -0
  336. package/src/foundation/config/chartSettings.ts +24 -7
  337. package/src/foundation/plugin/index.ts +0 -1
  338. package/src/foundation/plugin/rendererPluginManager.ts +0 -99
  339. package/src/foundation/plugin/types.ts +11 -18
  340. package/src/foundation/reactivity/__tests__/frameTransaction.test.ts +306 -0
  341. package/src/foundation/reactivity/frameTransaction.ts +239 -0
  342. package/src/foundation/reactivity/index.ts +8 -0
  343. package/src/foundation/reactivity/signal.ts +39 -0
  344. package/src/foundation/tokens/__tests__/__snapshots__/baseline.test.ts.snap +2 -2
  345. package/src/foundation/tokens/theme-dark.ts +2 -1
  346. package/src/foundation/tokens/theme-light.ts +2 -1
  347. package/src/rendering/render/Renderer.ts +27 -14
  348. package/src/rendering/render/SurfaceBackend.ts +5 -7
  349. package/src/rendering/render/__tests__/canvas2DRenderer.test.ts +34 -0
  350. package/src/rendering/render/__tests__/contract.test.ts +2 -2
  351. package/src/rendering/render/__tests__/frameMetrics.test.ts +24 -0
  352. package/src/rendering/render/__tests__/rendererHost.test.ts +157 -0
  353. package/src/rendering/render/__tests__/webglRenderer.fallback.test.ts +14 -74
  354. package/src/rendering/render/__tests__/webglRenderer.test.ts +64 -6
  355. package/src/rendering/render/__tests__/webgpuRenderer.test.ts +370 -0
  356. package/src/rendering/render/__tests__/webgpuResourceTable.test.ts +62 -0
  357. package/src/rendering/render/__tests__/webgpuSurfaceBackend.test.ts +120 -0
  358. package/src/rendering/render/createCanvas2DRenderer.ts +83 -0
  359. package/src/rendering/render/createDefaultRendererHost.ts +74 -0
  360. package/src/rendering/render/createWebGLRenderer.ts +41 -87
  361. package/src/rendering/render/createWebGPURenderer.ts +677 -0
  362. package/src/rendering/render/createWebGPUSurfaceBackend.ts +106 -0
  363. package/src/rendering/render/frameMetrics.ts +54 -0
  364. package/src/rendering/render/index.ts +30 -0
  365. package/src/rendering/render/rendererHost.ts +210 -0
  366. package/src/rendering/render/webgpuResourceTable.ts +87 -0
  367. package/src/rendering/scene/__tests__/layerFromPlugin.test.ts +29 -2
  368. package/src/rendering/scene/__tests__/retainedScene.test.ts +59 -0
  369. package/src/rendering/scene/createLayerFromPlugin.ts +9 -2
  370. package/src/rendering/scene/layerRegistry.ts +4 -6
  371. package/src/rendering/scene/retainedScene.ts +101 -0
  372. package/src/version.ts +1 -1
@@ -0,0 +1,263 @@
1
+ import { describe, it, expect, vi } from 'vitest'
2
+
3
+ import type { Renderer } from '../../../rendering/render/Renderer'
4
+ import {
5
+ compositeSceneRenderer,
6
+ drawFilledBandViaRenderer,
7
+ drawLinesViaRenderer,
8
+ shouldCompositeSceneRenderer,
9
+ tryDrawFilledBandGpu,
10
+ } from '../linesViaRenderer'
11
+
12
+ function mockRenderer(): Renderer & {
13
+ drawLines: ReturnType<typeof vi.fn>
14
+ createPipeline: ReturnType<typeof vi.fn>
15
+ destroyPipeline: ReturnType<typeof vi.fn>
16
+ } {
17
+ return {
18
+ surface: {
19
+ isAvailable: () => true,
20
+ resize: () => {},
21
+ bindRegion: () => true,
22
+ clearRegion: () => {},
23
+ compositeTo: vi.fn(),
24
+ dispose: () => {},
25
+ },
26
+ caps: { compute: false, storageBuffer: false, maxInstances: 1e6, name: 'webgl2' },
27
+ createBuffer: vi.fn(() => ({}) as never),
28
+ writeBuffer: vi.fn(),
29
+ destroyBuffer: vi.fn(),
30
+ createPipeline: vi.fn(() => ({}) as never),
31
+ destroyPipeline: vi.fn(),
32
+ createComputePipeline: () => {
33
+ throw new Error('no')
34
+ },
35
+ destroyComputePipeline: () => {},
36
+ beginFrame: vi.fn(),
37
+ drawInstances: vi.fn(() => true),
38
+ drawLines: vi.fn(() => true),
39
+ dispatchCompute: () => {},
40
+ endFrame: vi.fn(),
41
+ dispose: vi.fn(),
42
+ } as never
43
+ }
44
+
45
+ describe('drawLinesViaRenderer', () => {
46
+ it('issues one batched drawLines with all strips (not N calls)', () => {
47
+ const r = mockRenderer()
48
+ const ok = drawLinesViaRenderer(
49
+ r,
50
+ [
51
+ {
52
+ points: [
53
+ { x: 0, y: 1 },
54
+ { x: 2, y: 3 },
55
+ ],
56
+ color: '#f00',
57
+ width: 1,
58
+ },
59
+ {
60
+ points: [
61
+ { x: 0, y: 0 },
62
+ { x: 1, y: 1 },
63
+ { x: 2, y: 0 },
64
+ ],
65
+ color: '#0f0',
66
+ },
67
+ ],
68
+ 10,
69
+ )
70
+ expect(ok).toBe(true)
71
+ expect(r.drawLines).toHaveBeenCalledTimes(1)
72
+ const args = r.drawLines.mock.calls[0]![0]
73
+ expect(args.strips).toHaveLength(2)
74
+ expect(args.strips[0].color).toBe('#f00')
75
+ expect(args.strips[1].color).toBe('#0f0')
76
+ expect(args.uniforms.scrollLeft).toBe(10)
77
+ })
78
+
79
+ it('returns true without draw when no drawable strips', () => {
80
+ const r = mockRenderer()
81
+ expect(drawLinesViaRenderer(r, [{ points: [{ x: 0, y: 0 }], color: '#f00' }], 0)).toBe(true)
82
+ expect(r.drawLines).not.toHaveBeenCalled()
83
+ })
84
+
85
+ it('returns false when drawLines silent-fails', () => {
86
+ const r = mockRenderer()
87
+ r.drawLines.mockReturnValue(false)
88
+ expect(
89
+ drawLinesViaRenderer(
90
+ r,
91
+ [
92
+ {
93
+ points: [
94
+ { x: 0, y: 0 },
95
+ { x: 1, y: 1 },
96
+ ],
97
+ color: '#f00',
98
+ },
99
+ ],
100
+ 0,
101
+ ),
102
+ ).toBe(false)
103
+ })
104
+
105
+ it('returns false when surface unavailable', () => {
106
+ const r = mockRenderer()
107
+ r.surface.isAvailable = () => false
108
+ expect(
109
+ drawLinesViaRenderer(
110
+ r,
111
+ [
112
+ {
113
+ points: [
114
+ { x: 0, y: 0 },
115
+ { x: 1, y: 1 },
116
+ ],
117
+ color: '#f00',
118
+ },
119
+ ],
120
+ 0,
121
+ ),
122
+ ).toBe(false)
123
+ })
124
+ })
125
+
126
+ describe('drawFilledBandViaRenderer', () => {
127
+ it('uses fill pipeline and packs upper/lower points', () => {
128
+ const r = mockRenderer()
129
+ r.drawLines.mockReturnValue(true)
130
+ const ok = drawFilledBandViaRenderer(
131
+ r,
132
+ [
133
+ { x: 0, y: 10 },
134
+ { x: 1, y: 12 },
135
+ ],
136
+ [
137
+ { x: 0, y: 20 },
138
+ { x: 1, y: 22 },
139
+ ],
140
+ 'rgba(0,0,255,0.2)',
141
+ 5,
142
+ )
143
+ expect(ok).toBe(true)
144
+ expect(r.createPipeline).toHaveBeenCalledWith({ type: 'fill' })
145
+ expect(r.drawLines).toHaveBeenCalledTimes(1)
146
+ const args = r.drawLines.mock.calls[0]![0]
147
+ expect(args.vertexCount).toBe(4)
148
+ expect(args.uniforms.color).toBe('rgba(0,0,255,0.2)')
149
+ expect(args.uniforms.scrollLeft).toBe(5)
150
+ })
151
+
152
+ it('returns false when fewer than 2 points', () => {
153
+ const r = mockRenderer()
154
+ expect(drawFilledBandViaRenderer(r, [{ x: 0, y: 1 }], [{ x: 0, y: 2 }], '#00f', 0)).toBe(false)
155
+ expect(r.drawLines).not.toHaveBeenCalled()
156
+ })
157
+
158
+ it('reuses fill pipeline and vertex buffer across frames', () => {
159
+ const r = mockRenderer()
160
+ r.drawLines.mockReturnValue(true)
161
+ const upper = [
162
+ { x: 0, y: 10 },
163
+ { x: 1, y: 12 },
164
+ ]
165
+ const lower = [
166
+ { x: 0, y: 20 },
167
+ { x: 1, y: 22 },
168
+ ]
169
+ expect(drawFilledBandViaRenderer(r, upper, lower, '#00f', 0)).toBe(true)
170
+ expect(drawFilledBandViaRenderer(r, upper, lower, '#00f', 5)).toBe(true)
171
+ expect(r.createPipeline).toHaveBeenCalledTimes(1)
172
+ expect(r.createBuffer).toHaveBeenCalledTimes(1)
173
+ expect(r.destroyBuffer).not.toHaveBeenCalled()
174
+ })
175
+ })
176
+
177
+ describe('compositeSceneRenderer hybrid DOM', () => {
178
+ it('composites on webgl and skips on webgpu', () => {
179
+ const webgl = mockRenderer()
180
+ const webgpu = mockRenderer()
181
+ ;(webgpu.caps as { name: string }).name = 'webgpu'
182
+ expect(shouldCompositeSceneRenderer(webgl)).toBe(true)
183
+ expect(shouldCompositeSceneRenderer(webgpu)).toBe(false)
184
+
185
+ compositeSceneRenderer({
186
+ ctx: {} as CanvasRenderingContext2D,
187
+ pane: { top: 0, height: 100 },
188
+ paneWidth: 200,
189
+ dpr: 1,
190
+ sceneRenderer: webgpu,
191
+ })
192
+ expect(webgpu.surface.compositeTo).not.toHaveBeenCalled()
193
+
194
+ compositeSceneRenderer({
195
+ ctx: {} as CanvasRenderingContext2D,
196
+ pane: { top: 0, height: 100 },
197
+ paneWidth: 200,
198
+ dpr: 1,
199
+ sceneRenderer: webgl,
200
+ })
201
+ expect(webgl.surface.compositeTo).toHaveBeenCalledOnce()
202
+ })
203
+ })
204
+
205
+ describe('tryDrawFilledBandGpu alpha on hybrid DOM', () => {
206
+ const upper = [
207
+ { x: 0, y: 10 },
208
+ { x: 1, y: 12 },
209
+ ]
210
+ const lower = [
211
+ { x: 0, y: 20 },
212
+ { x: 1, y: 22 },
213
+ ]
214
+
215
+ it('webgl keeps opaque color and applies alpha via compositeTo', () => {
216
+ const r = mockRenderer()
217
+ r.drawLines.mockReturnValue(true)
218
+ const ok = tryDrawFilledBandGpu(
219
+ {
220
+ ctx: {} as CanvasRenderingContext2D,
221
+ pane: { top: 0, height: 100 },
222
+ paneWidth: 200,
223
+ dpr: 1,
224
+ sceneRenderer: r,
225
+ } as never,
226
+ upper,
227
+ lower,
228
+ 'rgba(0, 128, 255, 1)',
229
+ 0,
230
+ 0.2,
231
+ )
232
+ expect(ok).toBe(true)
233
+ expect(r.drawLines.mock.calls[0]![0].uniforms.color).toBe('rgba(0, 128, 255, 1)')
234
+ expect(r.surface.compositeTo).toHaveBeenCalledWith(
235
+ expect.anything(),
236
+ expect.anything(),
237
+ expect.objectContaining({ alpha: 0.2 }),
238
+ )
239
+ })
240
+
241
+ it('webgpu bakes alpha into fill color and skips compositeTo', () => {
242
+ const r = mockRenderer()
243
+ ;(r.caps as { name: string }).name = 'webgpu'
244
+ r.drawLines.mockReturnValue(true)
245
+ const ok = tryDrawFilledBandGpu(
246
+ {
247
+ ctx: {} as CanvasRenderingContext2D,
248
+ pane: { top: 0, height: 100 },
249
+ paneWidth: 200,
250
+ dpr: 1,
251
+ sceneRenderer: r,
252
+ } as never,
253
+ upper,
254
+ lower,
255
+ 'rgba(0, 128, 255, 1)',
256
+ 0,
257
+ 0.2,
258
+ )
259
+ expect(ok).toBe(true)
260
+ expect(r.drawLines.mock.calls[0]![0].uniforms.color).toBe('rgba(0, 128, 255, 0.2)')
261
+ expect(r.surface.compositeTo).not.toHaveBeenCalled()
262
+ })
263
+ })
@@ -0,0 +1,87 @@
1
+ import { describe, it, expect, vi } from 'vitest'
2
+
3
+ import type { Renderer } from '../../../rendering/render/Renderer'
4
+ import { drawRectBatchesViaRenderer } from '../rectsViaRenderer'
5
+
6
+ function mockRenderer(): Renderer & {
7
+ drawInstances: ReturnType<typeof vi.fn>
8
+ writeBuffer: ReturnType<typeof vi.fn>
9
+ } {
10
+ return {
11
+ surface: {
12
+ isAvailable: () => true,
13
+ resize: () => {},
14
+ bindRegion: () => true,
15
+ clearRegion: () => {},
16
+ compositeTo: vi.fn(),
17
+ dispose: () => {},
18
+ },
19
+ caps: { compute: false, storageBuffer: false, maxInstances: 1e6, name: 'webgl2' },
20
+ createBuffer: vi.fn(() => ({}) as never),
21
+ writeBuffer: vi.fn(),
22
+ destroyBuffer: vi.fn(),
23
+ createPipeline: vi.fn(() => ({}) as never),
24
+ destroyPipeline: vi.fn(),
25
+ createComputePipeline: () => {
26
+ throw new Error('no')
27
+ },
28
+ destroyComputePipeline: () => {},
29
+ beginFrame: vi.fn(),
30
+ drawInstances: vi.fn(() => true),
31
+ drawLines: vi.fn(() => true),
32
+ dispatchCompute: () => {},
33
+ endFrame: vi.fn(),
34
+ dispose: vi.fn(),
35
+ } as never
36
+ }
37
+
38
+ describe('drawRectBatchesViaRenderer', () => {
39
+ it('draws each non-empty batch via drawInstances', () => {
40
+ const r = mockRenderer()
41
+ const ok = drawRectBatchesViaRenderer(
42
+ r,
43
+ [
44
+ { buf: new Float32Array([0, 0, 10, 20]), count: 1, color: '#0f0' },
45
+ { buf: new Float32Array(0), count: 0, color: '#f00' },
46
+ { buf: new Float32Array([1, 2, 3, 4, 5, 6, 7, 8]), count: 2, color: '#00f' },
47
+ ],
48
+ 3,
49
+ )
50
+ expect(ok).toBe(true)
51
+ expect(r.drawInstances).toHaveBeenCalledTimes(2)
52
+ })
53
+
54
+ it('returns false when any batch fails', () => {
55
+ const r = mockRenderer()
56
+ r.drawInstances.mockReturnValueOnce(true).mockReturnValueOnce(false)
57
+ expect(
58
+ drawRectBatchesViaRenderer(
59
+ r,
60
+ [
61
+ { buf: new Float32Array([0, 0, 1, 1]), count: 1, color: '#0f0' },
62
+ { buf: new Float32Array([0, 0, 1, 1]), count: 1, color: '#f00' },
63
+ ],
64
+ 0,
65
+ ),
66
+ ).toBe(false)
67
+ })
68
+
69
+ it('returns true when all counts are zero', () => {
70
+ const r = mockRenderer()
71
+ expect(
72
+ drawRectBatchesViaRenderer(r, [{ buf: new Float32Array(0), count: 0, color: '#0f0' }], 0),
73
+ ).toBe(true)
74
+ expect(r.drawInstances).not.toHaveBeenCalled()
75
+ })
76
+
77
+ it('caches pipeline and unit vertex buffer; creates + destroys instance buffer per batch', () => {
78
+ const r = mockRenderer()
79
+ const batches = [{ buf: new Float32Array([0, 0, 10, 20]), count: 1, color: '#0f0' }]
80
+ expect(drawRectBatchesViaRenderer(r, batches, 0)).toBe(true)
81
+ expect(drawRectBatchesViaRenderer(r, batches, 3)).toBe(true)
82
+ expect(r.createPipeline).toHaveBeenCalledTimes(1)
83
+ // unit buffer created once; each batch creates its own instance buffer
84
+ expect(r.createBuffer).toHaveBeenCalledTimes(3)
85
+ expect(r.destroyBuffer).toHaveBeenCalledTimes(2)
86
+ })
87
+ })
@@ -10,6 +10,7 @@ import {
10
10
  } from '../../foundation/utils/volumePrice'
11
11
  import type { MarkerManager } from '../marker/registry'
12
12
  import { getPhysicalKLineConfig } from '../utils/klineConfig'
13
+ import { drawCandlesViaRenderer } from './candleViaRenderer'
13
14
 
14
15
  // --- Float32Array buffer pool (reduces per-frame GC pressure) ---
15
16
  let poolUpBody: Float32Array | null = null
@@ -108,22 +109,33 @@ export function createCandleRenderer(): RendererPlugin {
108
109
  settings,
109
110
  })
110
111
 
111
- const usedWebGL = drawCandlesWithWebGL(
112
- context,
113
- prepared,
114
- colors.candleUpBody,
115
- colors.candleDownBody,
116
- )
117
- if (!usedWebGL) {
118
- drawCandlesWithCanvas2D(
119
- ctx,
120
- scrollLeft,
112
+ const upColor = colors.candleUpBody
113
+ const downColor = colors.candleDownBody
114
+ // sceneRenderer → fail-closed 2D
115
+ let usedGpu = false
116
+ if (context.sceneRenderer) {
117
+ usedGpu = drawCandlesViaRenderer(
118
+ context.sceneRenderer,
121
119
  prepared,
122
- colors.candleUpBody,
123
- colors.candleDownBody,
120
+ upColor,
121
+ downColor,
122
+ scrollLeft,
124
123
  )
125
- } else {
126
- compositeWebGLToMainCanvas(ctx, context)
124
+ if (usedGpu && context.sceneRenderer.caps.name !== 'webgpu') {
125
+ const region = {
126
+ x: 0,
127
+ y: pane.top,
128
+ width: context.viewport?.plotWidth ?? context.paneWidth,
129
+ height: pane.height,
130
+ dpr,
131
+ }
132
+ context.sceneRenderer.surface.compositeTo(ctx, region, {
133
+ imageSmoothingEnabled: false,
134
+ })
135
+ }
136
+ }
137
+ if (!usedGpu) {
138
+ drawCandlesWithCanvas2D(ctx, scrollLeft, prepared, upColor, downColor)
127
139
  }
128
140
 
129
141
  drawVolumePriceMarkers(context, prepared, markerManager as MarkerManager | undefined)
@@ -369,61 +381,6 @@ function drawCandlesWithCanvas2D(
369
381
  ctx.restore()
370
382
  }
371
383
 
372
- function drawCandlesWithWebGL(
373
- context: RenderContext,
374
- prepared: PreparedCandles,
375
- upColor: string,
376
- downColor: string,
377
- ): boolean {
378
- if (context.settings?.enableWebGLRendering === false) return false
379
- const surface = context.candleWebGLSurface
380
- if (!surface || !surface.isAvailable()) return false
381
-
382
- surface.clear()
383
-
384
- const bodyUpOk =
385
- prepared.upBodyCount === 0 ||
386
- surface.drawRectBuffer(
387
- prepared.upBodyBuf.subarray(0, prepared.upBodyCount * 4),
388
- prepared.upBodyCount,
389
- upColor,
390
- context.scrollLeft,
391
- )
392
- const bodyDownOk =
393
- prepared.downBodyCount === 0 ||
394
- surface.drawRectBuffer(
395
- prepared.downBodyBuf.subarray(0, prepared.downBodyCount * 4),
396
- prepared.downBodyCount,
397
- downColor,
398
- context.scrollLeft,
399
- )
400
- const wickUpOk =
401
- prepared.upWickCount === 0 ||
402
- surface.drawRectBuffer(
403
- prepared.upWickBuf.subarray(0, prepared.upWickCount * 4),
404
- prepared.upWickCount,
405
- upColor,
406
- context.scrollLeft,
407
- )
408
- const wickDownOk =
409
- prepared.downWickCount === 0 ||
410
- surface.drawRectBuffer(
411
- prepared.downWickBuf.subarray(0, prepared.downWickCount * 4),
412
- prepared.downWickCount,
413
- downColor,
414
- context.scrollLeft,
415
- )
416
-
417
- return bodyUpOk && bodyDownOk && wickUpOk && wickDownOk
418
- }
419
-
420
- function compositeWebGLToMainCanvas(ctx: CanvasRenderingContext2D, context: RenderContext): void {
421
- const surface = context.candleWebGLSurface
422
- if (!surface) return
423
-
424
- surface.compositeTo(ctx)
425
- }
426
-
427
384
  function drawVolumePriceMarkers(
428
385
  context: RenderContext,
429
386
  prepared: PreparedCandles,
@@ -0,0 +1,38 @@
1
+ import type { Renderer } from '../../rendering/render/Renderer'
2
+ import { drawRectBatchesViaRenderer } from './rectsViaRenderer'
3
+
4
+ /** 与 prepareCandles 输出对齐的矩形 batch(仅 GPU 路径所需字段) */
5
+ export type CandleRectBatch = {
6
+ upBodyCount: number
7
+ downBodyCount: number
8
+ upWickCount: number
9
+ downWickCount: number
10
+ upBodyBuf: Float32Array
11
+ downBodyBuf: Float32Array
12
+ upWickBuf: Float32Array
13
+ downWickBuf: Float32Array
14
+ }
15
+
16
+ /**
17
+ * 经 Renderer.drawInstances 画 body/wick。
18
+ * 任一非空 batch 绘制失败 → false(调用方应走 2D)。
19
+ * 不负责 composite。
20
+ */
21
+ export function drawCandlesViaRenderer(
22
+ renderer: Renderer,
23
+ prepared: CandleRectBatch,
24
+ upColor: string,
25
+ downColor: string,
26
+ scrollLeft: number,
27
+ ): boolean {
28
+ return drawRectBatchesViaRenderer(
29
+ renderer,
30
+ [
31
+ { buf: prepared.upBodyBuf, count: prepared.upBodyCount, color: upColor },
32
+ { buf: prepared.downBodyBuf, count: prepared.downBodyCount, color: downColor },
33
+ { buf: prepared.upWickBuf, count: prepared.upWickCount, color: upColor },
34
+ { buf: prepared.downWickBuf, count: prepared.downWickCount, color: downColor },
35
+ ],
36
+ scrollLeft,
37
+ )
38
+ }