@fairyhunter13/opentui-core 0.1.113 → 0.1.114

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 (591) hide show
  1. package/dev/keypress-debug-renderer.ts +148 -0
  2. package/dev/keypress-debug.ts +43 -0
  3. package/dev/print-env-vars.ts +32 -0
  4. package/dev/test-tmux-graphics-334.sh +68 -0
  5. package/dev/thai-debug-test.ts +68 -0
  6. package/docs/development.md +144 -0
  7. package/package.json +62 -53
  8. package/scripts/build.ts +400 -0
  9. package/scripts/publish.ts +60 -0
  10. package/src/3d/SpriteResourceManager.ts +286 -0
  11. package/src/3d/SpriteUtils.ts +70 -0
  12. package/src/3d/TextureUtils.ts +196 -0
  13. package/src/3d/ThreeRenderable.ts +197 -0
  14. package/src/3d/WGPURenderer.ts +294 -0
  15. package/src/3d/animation/ExplodingSpriteEffect.ts +513 -0
  16. package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +429 -0
  17. package/src/3d/animation/SpriteAnimator.ts +633 -0
  18. package/src/3d/animation/SpriteParticleGenerator.ts +435 -0
  19. package/src/3d/canvas.ts +464 -0
  20. package/src/3d/index.ts +12 -0
  21. package/src/3d/physics/PlanckPhysicsAdapter.ts +72 -0
  22. package/src/3d/physics/RapierPhysicsAdapter.ts +66 -0
  23. package/src/3d/physics/physics-interface.ts +31 -0
  24. package/src/3d/shaders/supersampling.wgsl +201 -0
  25. package/src/3d.ts +3 -0
  26. package/src/NativeSpanFeed.ts +300 -0
  27. package/src/Renderable.ts +1704 -0
  28. package/src/__snapshots__/buffer.test.ts.snap +28 -0
  29. package/src/animation/Timeline.test.ts +2709 -0
  30. package/src/animation/Timeline.ts +598 -0
  31. package/src/ansi.ts +18 -0
  32. package/src/benchmark/attenuation-benchmark.ts +81 -0
  33. package/src/benchmark/colormatrix-benchmark.ts +128 -0
  34. package/src/benchmark/gain-benchmark.ts +80 -0
  35. package/src/benchmark/latest-all-bench-run.json +707 -0
  36. package/src/benchmark/latest-async-bench-run.json +336 -0
  37. package/src/benchmark/latest-default-bench-run.json +657 -0
  38. package/src/benchmark/latest-large-bench-run.json +707 -0
  39. package/src/benchmark/latest-quick-bench-run.json +207 -0
  40. package/src/benchmark/markdown-benchmark.ts +1796 -0
  41. package/src/benchmark/native-span-feed-async-benchmark.ts +355 -0
  42. package/src/benchmark/native-span-feed-benchmark.md +56 -0
  43. package/src/benchmark/native-span-feed-benchmark.ts +596 -0
  44. package/src/benchmark/native-span-feed-compare.ts +280 -0
  45. package/src/benchmark/renderer-benchmark.ts +754 -0
  46. package/src/benchmark/text-table-benchmark.ts +948 -0
  47. package/src/buffer.test.ts +291 -0
  48. package/src/buffer.ts +554 -0
  49. package/src/console.test.ts +612 -0
  50. package/src/console.ts +1254 -0
  51. package/src/edit-buffer.test.ts +1769 -0
  52. package/src/edit-buffer.ts +411 -0
  53. package/src/editor-view.test.ts +1032 -0
  54. package/src/editor-view.ts +284 -0
  55. package/src/examples/ascii-font-selection-demo.ts +245 -0
  56. package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
  57. package/src/examples/assets/concrete.png +0 -0
  58. package/src/examples/assets/crate.png +0 -0
  59. package/src/examples/assets/crate_emissive.png +0 -0
  60. package/src/examples/assets/forrest_background.png +0 -0
  61. package/src/examples/assets/hast-example.json +1018 -0
  62. package/src/examples/assets/heart.png +0 -0
  63. package/src/examples/assets/main_char_heavy_attack.png +0 -0
  64. package/src/examples/assets/main_char_idle.png +0 -0
  65. package/src/examples/assets/main_char_jump_end.png +0 -0
  66. package/src/examples/assets/main_char_jump_landing.png +0 -0
  67. package/src/examples/assets/main_char_jump_start.png +0 -0
  68. package/src/examples/assets/main_char_run_loop.png +0 -0
  69. package/src/examples/assets/roughness_map.jpg +0 -0
  70. package/src/examples/build.ts +115 -0
  71. package/src/examples/code-demo.ts +924 -0
  72. package/src/examples/console-demo.ts +358 -0
  73. package/src/examples/core-plugin-slots-demo.ts +759 -0
  74. package/src/examples/diff-demo.ts +701 -0
  75. package/src/examples/draggable-three-demo.ts +259 -0
  76. package/src/examples/editor-demo.ts +322 -0
  77. package/src/examples/extmarks-demo.ts +196 -0
  78. package/src/examples/focus-restore-demo.ts +310 -0
  79. package/src/examples/fonts.ts +245 -0
  80. package/src/examples/fractal-shader-demo.ts +268 -0
  81. package/src/examples/framebuffer-demo.ts +674 -0
  82. package/src/examples/full-unicode-demo.ts +241 -0
  83. package/src/examples/golden-star-demo.ts +933 -0
  84. package/src/examples/grayscale-buffer-demo.ts +249 -0
  85. package/src/examples/hast-syntax-highlighting-demo.ts +129 -0
  86. package/src/examples/index.ts +926 -0
  87. package/src/examples/input-demo.ts +377 -0
  88. package/src/examples/input-select-layout-demo.ts +425 -0
  89. package/src/examples/install.sh +143 -0
  90. package/src/examples/keypress-debug-demo.ts +452 -0
  91. package/src/examples/lib/HexList.ts +122 -0
  92. package/src/examples/lib/PaletteGrid.ts +125 -0
  93. package/src/examples/lib/standalone-keys.ts +25 -0
  94. package/src/examples/lib/tab-controller.ts +243 -0
  95. package/src/examples/lights-phong-demo.ts +290 -0
  96. package/src/examples/link-demo.ts +220 -0
  97. package/src/examples/live-state-demo.ts +480 -0
  98. package/src/examples/markdown-demo.ts +725 -0
  99. package/src/examples/mouse-interaction-demo.ts +428 -0
  100. package/src/examples/nested-zindex-demo.ts +357 -0
  101. package/src/examples/opacity-example.ts +235 -0
  102. package/src/examples/opentui-demo.ts +1057 -0
  103. package/src/examples/physx-planck-2d-demo.ts +623 -0
  104. package/src/examples/physx-rapier-2d-demo.ts +655 -0
  105. package/src/examples/relative-positioning-demo.ts +323 -0
  106. package/src/examples/scroll-example.ts +214 -0
  107. package/src/examples/scrollbox-mouse-test.ts +112 -0
  108. package/src/examples/scrollbox-overlay-hit-test.ts +206 -0
  109. package/src/examples/select-demo.ts +237 -0
  110. package/src/examples/shader-cube-demo.ts +1015 -0
  111. package/src/examples/simple-layout-example.ts +591 -0
  112. package/src/examples/slider-demo.ts +617 -0
  113. package/src/examples/split-mode-demo.ts +453 -0
  114. package/src/examples/sprite-animation-demo.ts +443 -0
  115. package/src/examples/sprite-particle-generator-demo.ts +486 -0
  116. package/src/examples/static-sprite-demo.ts +193 -0
  117. package/src/examples/sticky-scroll-example.ts +308 -0
  118. package/src/examples/styled-text-demo.ts +282 -0
  119. package/src/examples/tab-select-demo.ts +219 -0
  120. package/src/examples/terminal-title.ts +29 -0
  121. package/src/examples/terminal.ts +305 -0
  122. package/src/examples/text-node-demo.ts +416 -0
  123. package/src/examples/text-selection-demo.ts +377 -0
  124. package/src/examples/text-table-demo.ts +503 -0
  125. package/src/examples/text-truncation-demo.ts +481 -0
  126. package/src/examples/text-wrap.ts +757 -0
  127. package/src/examples/texture-loading-demo.ts +259 -0
  128. package/src/examples/timeline-example.ts +670 -0
  129. package/src/examples/transparency-demo.ts +400 -0
  130. package/src/examples/vnode-composition-demo.ts +404 -0
  131. package/src/examples/wide-grapheme-overlay-demo.ts +280 -0
  132. package/src/index.ts +24 -0
  133. package/src/lib/KeyHandler.integration.test.ts +292 -0
  134. package/src/lib/KeyHandler.stopPropagation.test.ts +289 -0
  135. package/src/lib/KeyHandler.test.ts +662 -0
  136. package/src/lib/KeyHandler.ts +222 -0
  137. package/src/lib/RGBA.test.ts +984 -0
  138. package/src/lib/RGBA.ts +204 -0
  139. package/src/lib/ascii.font.ts +330 -0
  140. package/src/lib/border.test.ts +83 -0
  141. package/src/lib/border.ts +170 -0
  142. package/src/lib/bunfs.test.ts +27 -0
  143. package/src/lib/bunfs.ts +18 -0
  144. package/src/lib/clipboard.test.ts +41 -0
  145. package/src/lib/clipboard.ts +47 -0
  146. package/src/lib/clock.ts +35 -0
  147. package/src/lib/data-paths.test.ts +133 -0
  148. package/src/lib/data-paths.ts +109 -0
  149. package/src/lib/debounce.ts +106 -0
  150. package/src/lib/detect-links.test.ts +98 -0
  151. package/src/lib/detect-links.ts +56 -0
  152. package/src/lib/env.test.ts +228 -0
  153. package/src/lib/env.ts +209 -0
  154. package/src/lib/extmarks-history.ts +51 -0
  155. package/src/lib/extmarks-multiwidth.test.ts +322 -0
  156. package/src/lib/extmarks.test.ts +3457 -0
  157. package/src/lib/extmarks.ts +843 -0
  158. package/src/lib/fonts/block.json +405 -0
  159. package/src/lib/fonts/grid.json +265 -0
  160. package/src/lib/fonts/huge.json +741 -0
  161. package/src/lib/fonts/pallet.json +314 -0
  162. package/src/lib/fonts/shade.json +591 -0
  163. package/src/lib/fonts/slick.json +321 -0
  164. package/src/lib/fonts/tiny.json +69 -0
  165. package/src/lib/hast-styled-text.ts +59 -0
  166. package/src/lib/index.ts +21 -0
  167. package/src/lib/keymapping.test.ts +317 -0
  168. package/src/lib/keymapping.ts +115 -0
  169. package/src/lib/objects-in-viewport.test.ts +787 -0
  170. package/src/lib/objects-in-viewport.ts +153 -0
  171. package/src/lib/output.capture.ts +58 -0
  172. package/src/lib/parse.keypress-kitty.protocol.test.ts +340 -0
  173. package/src/lib/parse.keypress-kitty.test.ts +663 -0
  174. package/src/lib/parse.keypress-kitty.ts +439 -0
  175. package/src/lib/parse.keypress.test.ts +1849 -0
  176. package/src/lib/parse.keypress.ts +397 -0
  177. package/src/lib/parse.mouse.test.ts +552 -0
  178. package/src/lib/parse.mouse.ts +232 -0
  179. package/src/lib/paste.ts +16 -0
  180. package/src/lib/queue.ts +65 -0
  181. package/src/lib/renderable.validations.test.ts +87 -0
  182. package/src/lib/renderable.validations.ts +83 -0
  183. package/src/lib/scroll-acceleration.ts +98 -0
  184. package/src/lib/selection.ts +240 -0
  185. package/src/lib/singleton.ts +28 -0
  186. package/src/lib/stdin-parser.test.ts +2290 -0
  187. package/src/lib/stdin-parser.ts +1810 -0
  188. package/src/lib/styled-text.ts +178 -0
  189. package/src/lib/terminal-capability-detection.test.ts +202 -0
  190. package/src/lib/terminal-capability-detection.ts +79 -0
  191. package/src/lib/terminal-palette.test.ts +878 -0
  192. package/src/lib/terminal-palette.ts +383 -0
  193. package/src/lib/tree-sitter/assets/README.md +118 -0
  194. package/src/lib/tree-sitter/assets/update.ts +334 -0
  195. package/src/lib/tree-sitter/assets.d.ts +9 -0
  196. package/src/lib/tree-sitter/cache.test.ts +273 -0
  197. package/src/lib/tree-sitter/client.test.ts +1165 -0
  198. package/src/lib/tree-sitter/client.ts +607 -0
  199. package/src/lib/tree-sitter/default-parsers.ts +86 -0
  200. package/src/lib/tree-sitter/download-utils.ts +148 -0
  201. package/src/lib/tree-sitter/index.ts +28 -0
  202. package/src/lib/tree-sitter/parser.worker.ts +1042 -0
  203. package/src/lib/tree-sitter/parsers-config.ts +81 -0
  204. package/src/lib/tree-sitter/resolve-ft.test.ts +55 -0
  205. package/src/lib/tree-sitter/resolve-ft.ts +189 -0
  206. package/src/lib/tree-sitter/types.ts +82 -0
  207. package/src/lib/tree-sitter-styled-text.test.ts +1253 -0
  208. package/src/lib/tree-sitter-styled-text.ts +306 -0
  209. package/src/lib/validate-dir-name.ts +55 -0
  210. package/src/lib/yoga.options.test.ts +628 -0
  211. package/src/lib/yoga.options.ts +346 -0
  212. package/src/plugins/core-slot.ts +579 -0
  213. package/src/plugins/registry.ts +402 -0
  214. package/src/plugins/types.ts +46 -0
  215. package/src/post/effects.ts +930 -0
  216. package/src/post/filters.ts +489 -0
  217. package/src/post/matrices.ts +288 -0
  218. package/src/renderables/ASCIIFont.ts +219 -0
  219. package/src/renderables/Box.test.ts +205 -0
  220. package/src/renderables/Box.ts +326 -0
  221. package/src/renderables/Code.test.ts +2062 -0
  222. package/src/renderables/Code.ts +357 -0
  223. package/src/renderables/Diff.regression.test.ts +226 -0
  224. package/src/renderables/Diff.test.ts +3101 -0
  225. package/src/renderables/Diff.ts +1211 -0
  226. package/src/renderables/EditBufferRenderable.test.ts +288 -0
  227. package/src/renderables/EditBufferRenderable.ts +1166 -0
  228. package/src/renderables/FrameBuffer.ts +47 -0
  229. package/src/renderables/Input.test.ts +1228 -0
  230. package/src/renderables/Input.ts +247 -0
  231. package/src/renderables/LineNumberRenderable.ts +724 -0
  232. package/src/renderables/Markdown.ts +1393 -0
  233. package/src/renderables/ScrollBar.ts +422 -0
  234. package/src/renderables/ScrollBox.ts +883 -0
  235. package/src/renderables/Select.test.ts +1033 -0
  236. package/src/renderables/Select.ts +524 -0
  237. package/src/renderables/Slider.test.ts +456 -0
  238. package/src/renderables/Slider.ts +342 -0
  239. package/src/renderables/TabSelect.test.ts +197 -0
  240. package/src/renderables/TabSelect.ts +455 -0
  241. package/src/renderables/Text.selection-buffer.test.ts +123 -0
  242. package/src/renderables/Text.test.ts +2660 -0
  243. package/src/renderables/Text.ts +147 -0
  244. package/src/renderables/TextBufferRenderable.ts +518 -0
  245. package/src/renderables/TextNode.test.ts +1058 -0
  246. package/src/renderables/TextNode.ts +325 -0
  247. package/src/renderables/TextTable.test.ts +1421 -0
  248. package/src/renderables/TextTable.ts +1344 -0
  249. package/src/renderables/Textarea.ts +430 -0
  250. package/src/renderables/TimeToFirstDraw.ts +89 -0
  251. package/src/renderables/__snapshots__/Code.test.ts.snap +13 -0
  252. package/src/renderables/__snapshots__/Diff.test.ts.snap +785 -0
  253. package/src/renderables/__snapshots__/Text.test.ts.snap +421 -0
  254. package/src/renderables/__snapshots__/TextTable.test.ts.snap +215 -0
  255. package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +144 -0
  256. package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +816 -0
  257. package/src/renderables/__tests__/LineNumberRenderable.test.ts +1865 -0
  258. package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +85 -0
  259. package/src/renderables/__tests__/Markdown.code-colors.test.ts +242 -0
  260. package/src/renderables/__tests__/Markdown.test.ts +2518 -0
  261. package/src/renderables/__tests__/MultiRenderable.selection.test.ts +87 -0
  262. package/src/renderables/__tests__/Textarea.buffer.test.ts +682 -0
  263. package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +675 -0
  264. package/src/renderables/__tests__/Textarea.editing.test.ts +2041 -0
  265. package/src/renderables/__tests__/Textarea.error-handling.test.ts +35 -0
  266. package/src/renderables/__tests__/Textarea.events.test.ts +738 -0
  267. package/src/renderables/__tests__/Textarea.highlights.test.ts +590 -0
  268. package/src/renderables/__tests__/Textarea.keybinding.test.ts +3149 -0
  269. package/src/renderables/__tests__/Textarea.paste.test.ts +357 -0
  270. package/src/renderables/__tests__/Textarea.rendering.test.ts +1866 -0
  271. package/src/renderables/__tests__/Textarea.scroll.test.ts +733 -0
  272. package/src/renderables/__tests__/Textarea.selection.test.ts +1590 -0
  273. package/src/renderables/__tests__/Textarea.stress.test.ts +670 -0
  274. package/src/renderables/__tests__/Textarea.undo-redo.test.ts +383 -0
  275. package/src/renderables/__tests__/Textarea.visual-lines.test.ts +310 -0
  276. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +221 -0
  277. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +89 -0
  278. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +457 -0
  279. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +158 -0
  280. package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +387 -0
  281. package/src/renderables/__tests__/markdown-parser.test.ts +217 -0
  282. package/src/renderables/__tests__/renderable-test-utils.ts +60 -0
  283. package/src/renderables/composition/README.md +8 -0
  284. package/src/renderables/composition/VRenderable.ts +32 -0
  285. package/src/renderables/composition/constructs.ts +127 -0
  286. package/src/renderables/composition/vnode.ts +289 -0
  287. package/src/renderables/index.ts +23 -0
  288. package/src/renderables/markdown-parser.ts +66 -0
  289. package/src/renderer.ts +2681 -0
  290. package/src/runtime-plugin-support.ts +39 -0
  291. package/src/runtime-plugin.ts +615 -0
  292. package/src/syntax-style.test.ts +841 -0
  293. package/src/syntax-style.ts +257 -0
  294. package/src/testing/README.md +210 -0
  295. package/src/testing/capture-spans.test.ts +194 -0
  296. package/src/testing/integration.test.ts +276 -0
  297. package/src/testing/manual-clock.ts +117 -0
  298. package/src/testing/mock-keys.test.ts +1378 -0
  299. package/src/testing/mock-keys.ts +457 -0
  300. package/src/testing/mock-mouse.test.ts +218 -0
  301. package/src/testing/mock-mouse.ts +247 -0
  302. package/src/testing/mock-tree-sitter-client.ts +73 -0
  303. package/src/testing/spy.ts +13 -0
  304. package/src/testing/test-recorder.test.ts +415 -0
  305. package/src/testing/test-recorder.ts +145 -0
  306. package/src/testing/test-renderer.ts +132 -0
  307. package/src/testing.ts +7 -0
  308. package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +481 -0
  309. package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +19 -0
  310. package/src/tests/__snapshots__/scrollbox.test.ts.snap +29 -0
  311. package/src/tests/absolute-positioning.snapshot.test.ts +638 -0
  312. package/src/tests/allocator-stats.test.ts +38 -0
  313. package/src/tests/destroy-during-render.test.ts +200 -0
  314. package/src/tests/destroy-on-exit.fixture.ts +36 -0
  315. package/src/tests/destroy-on-exit.test.ts +41 -0
  316. package/src/tests/hover-cursor.test.ts +98 -0
  317. package/src/tests/native-span-feed-async.test.ts +173 -0
  318. package/src/tests/native-span-feed-close.test.ts +120 -0
  319. package/src/tests/native-span-feed-coverage.test.ts +227 -0
  320. package/src/tests/native-span-feed-edge-cases.test.ts +352 -0
  321. package/src/tests/native-span-feed-use-after-free.test.ts +45 -0
  322. package/src/tests/opacity.test.ts +123 -0
  323. package/src/tests/renderable.snapshot.test.ts +524 -0
  324. package/src/tests/renderable.test.ts +1281 -0
  325. package/src/tests/renderer.clock.test.ts +158 -0
  326. package/src/tests/renderer.console-startup.test.ts +185 -0
  327. package/src/tests/renderer.control.test.ts +425 -0
  328. package/src/tests/renderer.core-slot-binding.test.ts +952 -0
  329. package/src/tests/renderer.cursor.test.ts +26 -0
  330. package/src/tests/renderer.destroy-during-render.test.ts +147 -0
  331. package/src/tests/renderer.focus-restore.test.ts +257 -0
  332. package/src/tests/renderer.focus.test.ts +294 -0
  333. package/src/tests/renderer.idle.test.ts +219 -0
  334. package/src/tests/renderer.input.test.ts +2237 -0
  335. package/src/tests/renderer.kitty-flags.test.ts +195 -0
  336. package/src/tests/renderer.mouse.test.ts +1274 -0
  337. package/src/tests/renderer.palette.test.ts +629 -0
  338. package/src/tests/renderer.selection.test.ts +49 -0
  339. package/src/tests/renderer.slot-registry.test.ts +684 -0
  340. package/src/tests/renderer.useMouse.test.ts +47 -0
  341. package/src/tests/runtime-plugin-node-modules-cycle.fixture.ts +76 -0
  342. package/src/tests/runtime-plugin-node-modules-mjs.fixture.ts +43 -0
  343. package/src/tests/runtime-plugin-node-modules-no-bare-rewrite.fixture.ts +67 -0
  344. package/src/tests/runtime-plugin-node-modules-package-type-cache.fixture.ts +72 -0
  345. package/src/tests/runtime-plugin-node-modules-runtime-specifier.fixture.ts +44 -0
  346. package/src/tests/runtime-plugin-node-modules-scoped-package-bare-rewrite.fixture.ts +85 -0
  347. package/src/tests/runtime-plugin-path-alias.fixture.ts +43 -0
  348. package/src/tests/runtime-plugin-resolve-roots.fixture.ts +65 -0
  349. package/src/tests/runtime-plugin-support.fixture.ts +11 -0
  350. package/src/tests/runtime-plugin-support.test.ts +19 -0
  351. package/src/tests/runtime-plugin-windows-file-url.fixture.ts +30 -0
  352. package/src/tests/runtime-plugin.fixture.ts +40 -0
  353. package/src/tests/runtime-plugin.test.ts +354 -0
  354. package/src/tests/scrollbox-culling-bug.test.ts +114 -0
  355. package/src/tests/scrollbox-hitgrid-resize.test.ts +136 -0
  356. package/src/tests/scrollbox-hitgrid.test.ts +909 -0
  357. package/src/tests/scrollbox.test.ts +1530 -0
  358. package/src/tests/wrap-resize-perf.test.ts +276 -0
  359. package/src/tests/yoga-setters.test.ts +921 -0
  360. package/src/text-buffer-view.test.ts +705 -0
  361. package/src/text-buffer-view.ts +189 -0
  362. package/src/text-buffer.test.ts +347 -0
  363. package/src/text-buffer.ts +250 -0
  364. package/src/types.ts +161 -0
  365. package/src/utils.ts +88 -0
  366. package/src/zig/ansi.zig +268 -0
  367. package/src/zig/bench/README.md +50 -0
  368. package/src/zig/bench/buffer-draw-text-buffer_bench.zig +887 -0
  369. package/src/zig/bench/edit-buffer_bench.zig +476 -0
  370. package/src/zig/bench/native-span-feed_bench.zig +100 -0
  371. package/src/zig/bench/rope-markers_bench.zig +713 -0
  372. package/src/zig/bench/rope_bench.zig +514 -0
  373. package/src/zig/bench/styled-text_bench.zig +470 -0
  374. package/src/zig/bench/text-buffer-coords_bench.zig +362 -0
  375. package/src/zig/bench/text-buffer-view_bench.zig +459 -0
  376. package/src/zig/bench/text-chunk-graphemes_bench.zig +273 -0
  377. package/src/zig/bench/utf8_bench.zig +799 -0
  378. package/src/zig/bench-utils.zig +431 -0
  379. package/src/zig/bench.zig +217 -0
  380. package/src/zig/buffer-methods.zig +211 -0
  381. package/src/zig/buffer.zig +2281 -0
  382. package/src/zig/build.zig +289 -0
  383. package/src/zig/build.zig.zon +16 -0
  384. package/src/zig/edit-buffer.zig +825 -0
  385. package/src/zig/editor-view.zig +802 -0
  386. package/src/zig/event-bus.zig +13 -0
  387. package/src/zig/event-emitter.zig +65 -0
  388. package/src/zig/file-logger.zig +92 -0
  389. package/src/zig/grapheme.zig +599 -0
  390. package/src/zig/lib.zig +1854 -0
  391. package/src/zig/link.zig +333 -0
  392. package/src/zig/logger.zig +43 -0
  393. package/src/zig/mem-registry.zig +125 -0
  394. package/src/zig/native-span-feed-bench-lib.zig +7 -0
  395. package/src/zig/native-span-feed.zig +708 -0
  396. package/src/zig/renderer.zig +1393 -0
  397. package/src/zig/rope.zig +1220 -0
  398. package/src/zig/syntax-style.zig +161 -0
  399. package/src/zig/terminal.zig +987 -0
  400. package/src/zig/test.zig +72 -0
  401. package/src/zig/tests/README.md +18 -0
  402. package/src/zig/tests/buffer-methods_test.zig +1109 -0
  403. package/src/zig/tests/buffer_test.zig +2557 -0
  404. package/src/zig/tests/edit-buffer-history_test.zig +271 -0
  405. package/src/zig/tests/edit-buffer_test.zig +1689 -0
  406. package/src/zig/tests/editor-view_test.zig +3299 -0
  407. package/src/zig/tests/event-emitter_test.zig +249 -0
  408. package/src/zig/tests/grapheme_test.zig +1304 -0
  409. package/src/zig/tests/link_test.zig +190 -0
  410. package/src/zig/tests/mem-registry_test.zig +473 -0
  411. package/src/zig/tests/memory_leak_regression_test.zig +159 -0
  412. package/src/zig/tests/native-span-feed_test.zig +1264 -0
  413. package/src/zig/tests/renderer_test.zig +1017 -0
  414. package/src/zig/tests/rope-nested_test.zig +712 -0
  415. package/src/zig/tests/rope_fuzz_test.zig +238 -0
  416. package/src/zig/tests/rope_test.zig +2362 -0
  417. package/src/zig/tests/segment-merge.test.zig +148 -0
  418. package/src/zig/tests/syntax-style_test.zig +557 -0
  419. package/src/zig/tests/terminal_test.zig +754 -0
  420. package/src/zig/tests/text-buffer-drawing_test.zig +3237 -0
  421. package/src/zig/tests/text-buffer-highlights_test.zig +666 -0
  422. package/src/zig/tests/text-buffer-iterators_test.zig +776 -0
  423. package/src/zig/tests/text-buffer-segment_test.zig +320 -0
  424. package/src/zig/tests/text-buffer-selection_test.zig +1035 -0
  425. package/src/zig/tests/text-buffer-selection_viewport_test.zig +358 -0
  426. package/src/zig/tests/text-buffer-view_test.zig +3649 -0
  427. package/src/zig/tests/text-buffer_test.zig +2191 -0
  428. package/src/zig/tests/unicode-width-map.zon +3909 -0
  429. package/src/zig/tests/utf8_no_zwj_test.zig +260 -0
  430. package/src/zig/tests/utf8_test.zig +4057 -0
  431. package/src/zig/tests/utf8_wcwidth_cursor_test.zig +267 -0
  432. package/src/zig/tests/utf8_wcwidth_test.zig +357 -0
  433. package/src/zig/tests/word-wrap-editing_test.zig +498 -0
  434. package/src/zig/tests/wrap-cache-perf_test.zig +113 -0
  435. package/src/zig/text-buffer-iterators.zig +499 -0
  436. package/src/zig/text-buffer-segment.zig +404 -0
  437. package/src/zig/text-buffer-view.zig +1371 -0
  438. package/src/zig/text-buffer.zig +1180 -0
  439. package/src/zig/utf8.zig +1948 -0
  440. package/src/zig/utils.zig +9 -0
  441. package/src/zig-structs.ts +261 -0
  442. package/src/zig.ts +3884 -0
  443. package/tsconfig.build.json +24 -0
  444. package/tsconfig.json +27 -0
  445. package/3d/SpriteResourceManager.d.ts +0 -74
  446. package/3d/SpriteUtils.d.ts +0 -13
  447. package/3d/TextureUtils.d.ts +0 -24
  448. package/3d/ThreeRenderable.d.ts +0 -40
  449. package/3d/WGPURenderer.d.ts +0 -61
  450. package/3d/animation/ExplodingSpriteEffect.d.ts +0 -71
  451. package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +0 -76
  452. package/3d/animation/SpriteAnimator.d.ts +0 -124
  453. package/3d/animation/SpriteParticleGenerator.d.ts +0 -62
  454. package/3d/canvas.d.ts +0 -44
  455. package/3d/index.d.ts +0 -12
  456. package/3d/physics/PlanckPhysicsAdapter.d.ts +0 -19
  457. package/3d/physics/RapierPhysicsAdapter.d.ts +0 -19
  458. package/3d/physics/physics-interface.d.ts +0 -27
  459. package/3d.d.ts +0 -2
  460. package/3d.js +0 -34041
  461. package/3d.js.map +0 -155
  462. package/LICENSE +0 -21
  463. package/NativeSpanFeed.d.ts +0 -41
  464. package/Renderable.d.ts +0 -334
  465. package/animation/Timeline.d.ts +0 -126
  466. package/ansi.d.ts +0 -13
  467. package/buffer.d.ts +0 -111
  468. package/console.d.ts +0 -144
  469. package/edit-buffer.d.ts +0 -98
  470. package/editor-view.d.ts +0 -73
  471. package/index-9vwc3fg6.js +0 -12260
  472. package/index-9vwc3fg6.js.map +0 -42
  473. package/index-dcj62y8t.js +0 -20614
  474. package/index-dcj62y8t.js.map +0 -67
  475. package/index-f7n39gpy.js +0 -411
  476. package/index-f7n39gpy.js.map +0 -10
  477. package/index.d.ts +0 -23
  478. package/index.js +0 -478
  479. package/index.js.map +0 -9
  480. package/lib/KeyHandler.d.ts +0 -61
  481. package/lib/RGBA.d.ts +0 -25
  482. package/lib/ascii.font.d.ts +0 -508
  483. package/lib/border.d.ts +0 -51
  484. package/lib/bunfs.d.ts +0 -7
  485. package/lib/clipboard.d.ts +0 -17
  486. package/lib/clock.d.ts +0 -15
  487. package/lib/data-paths.d.ts +0 -26
  488. package/lib/debounce.d.ts +0 -42
  489. package/lib/detect-links.d.ts +0 -6
  490. package/lib/env.d.ts +0 -42
  491. package/lib/extmarks-history.d.ts +0 -17
  492. package/lib/extmarks.d.ts +0 -89
  493. package/lib/hast-styled-text.d.ts +0 -17
  494. package/lib/index.d.ts +0 -21
  495. package/lib/keymapping.d.ts +0 -25
  496. package/lib/objects-in-viewport.d.ts +0 -24
  497. package/lib/output.capture.d.ts +0 -24
  498. package/lib/parse.keypress-kitty.d.ts +0 -2
  499. package/lib/parse.keypress.d.ts +0 -26
  500. package/lib/parse.mouse.d.ts +0 -30
  501. package/lib/paste.d.ts +0 -7
  502. package/lib/queue.d.ts +0 -15
  503. package/lib/renderable.validations.d.ts +0 -12
  504. package/lib/scroll-acceleration.d.ts +0 -43
  505. package/lib/selection.d.ts +0 -63
  506. package/lib/singleton.d.ts +0 -7
  507. package/lib/stdin-parser.d.ts +0 -87
  508. package/lib/styled-text.d.ts +0 -63
  509. package/lib/terminal-capability-detection.d.ts +0 -30
  510. package/lib/terminal-palette.d.ts +0 -50
  511. package/lib/tree-sitter/assets/update.d.ts +0 -11
  512. package/lib/tree-sitter/client.d.ts +0 -47
  513. package/lib/tree-sitter/default-parsers.d.ts +0 -2
  514. package/lib/tree-sitter/download-utils.d.ts +0 -21
  515. package/lib/tree-sitter/index.d.ts +0 -8
  516. package/lib/tree-sitter/parser.worker.d.ts +0 -1
  517. package/lib/tree-sitter/parsers-config.d.ts +0 -53
  518. package/lib/tree-sitter/resolve-ft.d.ts +0 -5
  519. package/lib/tree-sitter/types.d.ts +0 -82
  520. package/lib/tree-sitter-styled-text.d.ts +0 -14
  521. package/lib/validate-dir-name.d.ts +0 -1
  522. package/lib/yoga.options.d.ts +0 -32
  523. package/parser.worker.js +0 -899
  524. package/parser.worker.js.map +0 -12
  525. package/plugins/core-slot.d.ts +0 -72
  526. package/plugins/registry.d.ts +0 -42
  527. package/plugins/types.d.ts +0 -34
  528. package/post/effects.d.ts +0 -147
  529. package/post/filters.d.ts +0 -65
  530. package/post/matrices.d.ts +0 -20
  531. package/renderables/ASCIIFont.d.ts +0 -52
  532. package/renderables/Box.d.ts +0 -81
  533. package/renderables/Code.d.ts +0 -78
  534. package/renderables/Diff.d.ts +0 -142
  535. package/renderables/EditBufferRenderable.d.ts +0 -237
  536. package/renderables/FrameBuffer.d.ts +0 -16
  537. package/renderables/Input.d.ts +0 -67
  538. package/renderables/LineNumberRenderable.d.ts +0 -78
  539. package/renderables/Markdown.d.ts +0 -185
  540. package/renderables/ScrollBar.d.ts +0 -77
  541. package/renderables/ScrollBox.d.ts +0 -124
  542. package/renderables/Select.d.ts +0 -115
  543. package/renderables/Slider.d.ts +0 -47
  544. package/renderables/TabSelect.d.ts +0 -96
  545. package/renderables/Text.d.ts +0 -36
  546. package/renderables/TextBufferRenderable.d.ts +0 -105
  547. package/renderables/TextNode.d.ts +0 -91
  548. package/renderables/TextTable.d.ts +0 -140
  549. package/renderables/Textarea.d.ts +0 -63
  550. package/renderables/TimeToFirstDraw.d.ts +0 -24
  551. package/renderables/__tests__/renderable-test-utils.d.ts +0 -12
  552. package/renderables/composition/VRenderable.d.ts +0 -16
  553. package/renderables/composition/constructs.d.ts +0 -35
  554. package/renderables/composition/vnode.d.ts +0 -46
  555. package/renderables/index.d.ts +0 -23
  556. package/renderables/markdown-parser.d.ts +0 -10
  557. package/renderer.d.ts +0 -419
  558. package/runtime-plugin-support.d.ts +0 -3
  559. package/runtime-plugin-support.js +0 -29
  560. package/runtime-plugin-support.js.map +0 -10
  561. package/runtime-plugin.d.ts +0 -16
  562. package/runtime-plugin.js +0 -16
  563. package/runtime-plugin.js.map +0 -9
  564. package/syntax-style.d.ts +0 -54
  565. package/testing/manual-clock.d.ts +0 -17
  566. package/testing/mock-keys.d.ts +0 -81
  567. package/testing/mock-mouse.d.ts +0 -38
  568. package/testing/mock-tree-sitter-client.d.ts +0 -23
  569. package/testing/spy.d.ts +0 -7
  570. package/testing/test-recorder.d.ts +0 -61
  571. package/testing/test-renderer.d.ts +0 -23
  572. package/testing.d.ts +0 -6
  573. package/testing.js +0 -697
  574. package/testing.js.map +0 -15
  575. package/text-buffer-view.d.ts +0 -42
  576. package/text-buffer.d.ts +0 -67
  577. package/types.d.ts +0 -139
  578. package/utils.d.ts +0 -14
  579. package/zig-structs.d.ts +0 -155
  580. package/zig.d.ts +0 -353
  581. /package/{assets → src/lib/tree-sitter/assets}/javascript/highlights.scm +0 -0
  582. /package/{assets → src/lib/tree-sitter/assets}/javascript/tree-sitter-javascript.wasm +0 -0
  583. /package/{assets → src/lib/tree-sitter/assets}/markdown/highlights.scm +0 -0
  584. /package/{assets → src/lib/tree-sitter/assets}/markdown/injections.scm +0 -0
  585. /package/{assets → src/lib/tree-sitter/assets}/markdown/tree-sitter-markdown.wasm +0 -0
  586. /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/highlights.scm +0 -0
  587. /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
  588. /package/{assets → src/lib/tree-sitter/assets}/typescript/highlights.scm +0 -0
  589. /package/{assets → src/lib/tree-sitter/assets}/typescript/tree-sitter-typescript.wasm +0 -0
  590. /package/{assets → src/lib/tree-sitter/assets}/zig/highlights.scm +0 -0
  591. /package/{assets → src/lib/tree-sitter/assets}/zig/tree-sitter-zig.wasm +0 -0
@@ -0,0 +1,489 @@
1
+ import type { OptimizedBuffer } from "../buffer.js"
2
+
3
+ /**
4
+ * Applies a scanline effect by darkening every nth row using native color matrix.
5
+ * Only affects the background buffer to maintain text readability.
6
+ */
7
+ export function applyScanlines(buffer: OptimizedBuffer, strength: number = 0.8, step: number = 2): void {
8
+ if (strength === 1.0 || step < 1) return
9
+
10
+ const width = buffer.width
11
+ const height = buffer.height
12
+
13
+ // Calculate number of affected rows
14
+ const affectedRows = Math.ceil(height / step)
15
+ const cellCount = width * affectedRows
16
+ const cellMask = new Float32Array(cellCount * 3)
17
+
18
+ let maskIdx = 0
19
+ for (let y = 0; y < height; y += step) {
20
+ for (let x = 0; x < width; x++) {
21
+ cellMask[maskIdx++] = x
22
+ cellMask[maskIdx++] = y
23
+ cellMask[maskIdx++] = 1.0 // full strength
24
+ }
25
+ }
26
+
27
+ // Gain matrix to scale down background colors
28
+ const s = strength
29
+ const matrix = new Float32Array([
30
+ s,
31
+ 0,
32
+ 0,
33
+ 0, // Row 0: Red output
34
+ 0,
35
+ s,
36
+ 0,
37
+ 0, // Row 1: Green output
38
+ 0,
39
+ 0,
40
+ s,
41
+ 0, // Row 2: Blue output
42
+ 0,
43
+ 0,
44
+ 0,
45
+ 1, // Row 3: Alpha output (identity)
46
+ ])
47
+
48
+ // Apply only to background buffer (target = 2)
49
+ buffer.colorMatrix(matrix, cellMask, 1.0, 2)
50
+ }
51
+
52
+ /**
53
+ * Inverts the colors in the buffer using native color matrix.
54
+ * Uses negative matrix with alpha offset: output = 1.0 - input for each RGB channel.
55
+ */
56
+ export function applyInvert(buffer: OptimizedBuffer, strength: number = 1.0): void {
57
+ if (strength === 0.0) return
58
+
59
+ // Invert matrix: output = -1*input + 1*alpha = 1.0 - input (assuming alpha=1.0)
60
+ // Row format: [R_coeff, G_coeff, B_coeff, A_coeff]
61
+ const matrix = new Float32Array([
62
+ -1,
63
+ 0,
64
+ 0,
65
+ 1, // Row 0: Red output = -1*R + 0*G + 0*B + 1*A = 1 - R
66
+ 0,
67
+ -1,
68
+ 0,
69
+ 1, // Row 1: Green output = 1 - G
70
+ 0,
71
+ 0,
72
+ -1,
73
+ 1, // Row 2: Blue output = 1 - B
74
+ 0,
75
+ 0,
76
+ 0,
77
+ 1, // Row 3: Alpha output = A
78
+ ])
79
+
80
+ buffer.colorMatrixUniform(matrix, strength, 3)
81
+ }
82
+
83
+ /**
84
+ * Adds random noise to the buffer colors using colorMatrix with brightness matrix.
85
+ * Uses per-pixel random strength values to dim/brighten each cell.
86
+ */
87
+ export function applyNoise(buffer: OptimizedBuffer, strength: number = 0.1): void {
88
+ const width = buffer.width
89
+ const height = buffer.height
90
+ const size = width * height
91
+
92
+ // Skip if no effect
93
+ if (strength === 0) return
94
+
95
+ // Generate random cellMask with per-pixel strength values
96
+ // Each pixel gets [x, y, random_strength] where random_strength ranges from -1 to 1
97
+ const cellMask = new Float32Array(size * 3)
98
+ let cellMaskIndex = 0
99
+
100
+ for (let y = 0; y < height; y++) {
101
+ for (let x = 0; x < width; x++) {
102
+ cellMask[cellMaskIndex++] = x
103
+ cellMask[cellMaskIndex++] = y
104
+ // Random strength from -1 to 1
105
+ cellMask[cellMaskIndex++] = (Math.random() - 0.5) * 2
106
+ }
107
+ }
108
+
109
+ // Brightness matrix: scales all channels by (1 + strength)
110
+ // With cellMask strength S, result = original * (1 + (B - 1) * S)
111
+ // where B = 1 + strength
112
+ // So: S=1 → original * (1 + strength), S=-1 → original * (1 - strength)
113
+ const b = 1.0 + strength
114
+ const matrix = new Float32Array([
115
+ b,
116
+ 0,
117
+ 0,
118
+ 0, // Row 0 (Red output)
119
+ 0,
120
+ b,
121
+ 0,
122
+ 0, // Row 1 (Green output)
123
+ 0,
124
+ 0,
125
+ b,
126
+ 0, // Row 2 (Blue output)
127
+ 0,
128
+ 0,
129
+ 0,
130
+ 1, // Row 3 (Alpha output - identity)
131
+ ])
132
+
133
+ buffer.colorMatrix(matrix, cellMask, 1.0, 3)
134
+ }
135
+
136
+ /**
137
+ * Applies a simplified chromatic aberration effect.
138
+ */
139
+ export function applyChromaticAberration(buffer: OptimizedBuffer, strength: number = 1): void {
140
+ const width = buffer.width
141
+ const height = buffer.height
142
+ const srcFg = Float32Array.from(buffer.buffers.fg) // Copy original fg data
143
+ const destFg = buffer.buffers.fg
144
+ const centerX = width / 2
145
+ const centerY = height / 2
146
+
147
+ for (let y = 0; y < height; y++) {
148
+ for (let x = 0; x < width; x++) {
149
+ const dx = x - centerX
150
+ const dy = y - centerY
151
+ const offset = Math.round((Math.sqrt(dx * dx + dy * dy) / Math.max(centerX, centerY)) * strength)
152
+
153
+ const rX = Math.max(0, Math.min(width - 1, x - offset))
154
+ const bX = Math.max(0, Math.min(width - 1, x + offset))
155
+
156
+ const rIndex = (y * width + rX) * 4
157
+ const gIndex = (y * width + x) * 4 // Green from original position
158
+ const bIndex = (y * width + bX) * 4
159
+ const destIndex = (y * width + x) * 4
160
+
161
+ destFg[destIndex] = srcFg[rIndex] // Red from left offset
162
+ destFg[destIndex + 1] = srcFg[gIndex + 1] // Green from center
163
+ destFg[destIndex + 2] = srcFg[bIndex + 2] // Blue from right offset
164
+ // Keep original Alpha
165
+ }
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Converts the buffer to ASCII art based on background brightness.
171
+ * Uses native colorMatrix for efficient color corrections.
172
+ */
173
+ export function applyAsciiArt(
174
+ buffer: OptimizedBuffer,
175
+ ramp: string = ' .\'`^"",:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$',
176
+ fgColor: { r: number; g: number; b: number } = { r: 1.0, g: 1.0, b: 1.0 },
177
+ bgColor: { r: number; g: number; b: number } = { r: 0.0, g: 0.0, b: 0.0 },
178
+ ): void {
179
+ const width = buffer.width
180
+ const height = buffer.height
181
+ const chars = buffer.buffers.char
182
+ const bg = buffer.buffers.bg
183
+ const rampLength = ramp.length
184
+
185
+ // Set ASCII characters based on background luminance
186
+ for (let y = 0; y < height; y++) {
187
+ for (let x = 0; x < width; x++) {
188
+ const index = y * width + x
189
+ const colorIndex = index * 4
190
+ const bgR = bg[colorIndex]
191
+ const bgG = bg[colorIndex + 1]
192
+ const bgB = bg[colorIndex + 2]
193
+ const lum = 0.299 * bgR + 0.587 * bgG + 0.114 * bgB // Luminance
194
+ const rampIndex = Math.min(rampLength - 1, Math.floor(lum * rampLength))
195
+ chars[index] = ramp[rampIndex].charCodeAt(0)
196
+ }
197
+ }
198
+
199
+ // Create color matrix that sets all pixels to the target color
200
+ // Matrix: output = target_color * input (where input is 1.0 from alpha)
201
+ const fgMatrix = new Float32Array([
202
+ 0,
203
+ 0,
204
+ 0,
205
+ fgColor.r, // Red output
206
+ 0,
207
+ 0,
208
+ 0,
209
+ fgColor.g, // Green output
210
+ 0,
211
+ 0,
212
+ 0,
213
+ fgColor.b, // Blue output
214
+ 0,
215
+ 0,
216
+ 0,
217
+ 1, // Alpha output (identity)
218
+ ])
219
+
220
+ const bgMatrix = new Float32Array([
221
+ 0,
222
+ 0,
223
+ 0,
224
+ bgColor.r, // Red output
225
+ 0,
226
+ 0,
227
+ 0,
228
+ bgColor.g, // Green output
229
+ 0,
230
+ 0,
231
+ 0,
232
+ bgColor.b, // Blue output
233
+ 0,
234
+ 0,
235
+ 0,
236
+ 1, // Alpha output (identity)
237
+ ])
238
+
239
+ // Apply uniform color transformation to foreground (target = 1)
240
+ buffer.colorMatrixUniform(fgMatrix, 1.0, 1)
241
+ // Apply uniform color transformation to background (target = 2)
242
+ buffer.colorMatrixUniform(bgMatrix, 1.0, 2)
243
+ }
244
+
245
+ /**
246
+ * Adjusts the brightness of the buffer using color matrix transformation.
247
+ * Brightness adds the brightness value to all RGB channels (additive brightness).
248
+ * If not provided, applies uniform brightness to entire buffer.
249
+ */
250
+ export function applyBrightness(buffer: OptimizedBuffer, brightness: number = 0.0, cellMask?: Float32Array): void {
251
+ // No need to process if brightness is 0 (no change)
252
+ if (brightness === 0.0) return
253
+
254
+ const b = brightness
255
+ // Additive brightness matrix: adds brightness to all channels via alpha column
256
+ const matrix = new Float32Array([
257
+ 1,
258
+ 0,
259
+ 0,
260
+ b, // Row 0 (Red output = R + brightness*A)
261
+ 0,
262
+ 1,
263
+ 0,
264
+ b, // Row 1 (Green output = G + brightness*A)
265
+ 0,
266
+ 0,
267
+ 1,
268
+ b, // Row 2 (Blue output = B + brightness*A)
269
+ 0,
270
+ 0,
271
+ 0,
272
+ 1, // Row 3 (Alpha output = A)
273
+ ])
274
+
275
+ if (!cellMask || cellMask.length === 0) {
276
+ buffer.colorMatrixUniform(matrix, 1.0, 3)
277
+ } else {
278
+ buffer.colorMatrix(matrix, cellMask, 1.0, 3)
279
+ }
280
+ }
281
+
282
+ /**
283
+ * Adjusts the gain of the buffer using color matrix transformation.
284
+ * Gain multiplies all RGB channels by the gain factor (no clamping).
285
+ * If not provided, applies uniform gain to entire buffer.
286
+ */
287
+ export function applyGain(buffer: OptimizedBuffer, gain: number = 1.0, cellMask?: Float32Array): void {
288
+ // No need to process if gain is 1 (no change)
289
+ if (gain === 1.0) return
290
+
291
+ const g = Math.max(0, gain)
292
+ const matrix = new Float32Array([
293
+ g,
294
+ 0,
295
+ 0,
296
+ 0, // Row 0 (Red output)
297
+ 0,
298
+ g,
299
+ 0,
300
+ 0, // Row 1 (Green output)
301
+ 0,
302
+ 0,
303
+ g,
304
+ 0, // Row 2 (Blue output)
305
+ 0,
306
+ 0,
307
+ 0,
308
+ 1, // Row 3 (Alpha output - identity)
309
+ ])
310
+
311
+ if (!cellMask || cellMask.length === 0) {
312
+ buffer.colorMatrixUniform(matrix, 1.0, 3)
313
+ } else {
314
+ buffer.colorMatrix(matrix, cellMask, 1.0, 3)
315
+ }
316
+ }
317
+
318
+ /**
319
+ * Generates a saturation color matrix (4x4 RGBA with alpha identity).
320
+ */
321
+ function createSaturationMatrix(saturation: number): Float32Array {
322
+ const s = Math.max(0, saturation)
323
+ const sr = 0.299 * (1 - s)
324
+ const sg = 0.587 * (1 - s)
325
+ const sb = 0.114 * (1 - s)
326
+
327
+ // Row 0 (Red output)
328
+ const m00 = sr + s // 0.299 + 0.701*s
329
+ const m01 = sg // 0.587 * (1 - s)
330
+ const m02 = sb // 0.114 * (1 - s)
331
+
332
+ // Row 1 (Green output)
333
+ const m10 = sr // 0.299 * (1 - s)
334
+ const m11 = sg + s // 0.587 + 0.413*s
335
+ const m12 = sb // 0.114 * (1 - s)
336
+
337
+ // Row 2 (Blue output)
338
+ const m20 = sr // 0.299 * (1 - s)
339
+ const m21 = sg // 0.587 * (1 - s)
340
+ const m22 = sb + s // 0.114 + 0.886*s
341
+
342
+ // 4x4 matrix with alpha identity
343
+ return new Float32Array([
344
+ m00,
345
+ m01,
346
+ m02,
347
+ 0, // Red output row
348
+ m10,
349
+ m11,
350
+ m12,
351
+ 0, // Green output row
352
+ m20,
353
+ m21,
354
+ m22,
355
+ 0, // Blue output row
356
+ 0,
357
+ 0,
358
+ 0,
359
+ 1, // Alpha output row (identity)
360
+ ])
361
+ }
362
+
363
+ /**
364
+ * Applies a saturation adjustment to the buffer.
365
+ */
366
+ export function applySaturation(buffer: OptimizedBuffer, cellMask?: Float32Array, strength: number = 1.0): void {
367
+ // No need to process if saturation is 1 (no change) or strength is 0
368
+ if (strength === 1.0 || strength === 0) {
369
+ return
370
+ }
371
+
372
+ const matrix = createSaturationMatrix(strength)
373
+
374
+ // If no cellMask provided, use uniform saturation (much faster)
375
+ if (!cellMask || cellMask.length === 0) {
376
+ buffer.colorMatrixUniform(matrix, 1.0, 3)
377
+ } else {
378
+ buffer.colorMatrix(matrix, cellMask, 1.0, 3)
379
+ }
380
+ }
381
+
382
+ /**
383
+ * Applies a bloom effect based on bright areas (Simplified).
384
+ */
385
+ export class BloomEffect {
386
+ private _threshold: number
387
+ private _strength: number
388
+ private _radius: number
389
+
390
+ constructor(threshold: number = 0.8, strength: number = 0.2, radius: number = 2) {
391
+ this._threshold = Math.max(0, Math.min(1, threshold))
392
+ this._strength = Math.max(0, strength)
393
+ this._radius = Math.max(0, Math.round(radius))
394
+ }
395
+
396
+ public set threshold(newThreshold: number) {
397
+ this._threshold = Math.max(0, Math.min(1, newThreshold))
398
+ }
399
+ public get threshold(): number {
400
+ return this._threshold
401
+ }
402
+
403
+ public set strength(newStrength: number) {
404
+ this._strength = Math.max(0, newStrength)
405
+ }
406
+ public get strength(): number {
407
+ return this._strength
408
+ }
409
+
410
+ public set radius(newRadius: number) {
411
+ this._radius = Math.max(0, Math.round(newRadius))
412
+ }
413
+ public get radius(): number {
414
+ return this._radius
415
+ }
416
+
417
+ public apply(buffer: OptimizedBuffer): void {
418
+ const threshold = this._threshold
419
+ const strength = this._strength
420
+ const radius = this._radius
421
+
422
+ if (strength <= 0 || radius <= 0) return // No bloom if strength or radius is non-positive
423
+
424
+ const width = buffer.width
425
+ const height = buffer.height
426
+ // Operate directly on the buffer's data for bloom, but need a source copy temporarily
427
+ const srcFg = Float32Array.from(buffer.buffers.fg)
428
+ const srcBg = Float32Array.from(buffer.buffers.bg)
429
+ const destFg = buffer.buffers.fg
430
+ const destBg = buffer.buffers.bg
431
+
432
+ const brightPixels: { x: number; y: number; intensity: number }[] = []
433
+
434
+ // 1. Find bright pixels based on original data
435
+ for (let y = 0; y < height; y++) {
436
+ for (let x = 0; x < width; x++) {
437
+ const index = (y * width + x) * 4
438
+ // Consider max component brightness, or luminance? Using luminance.
439
+ const fgLum = 0.299 * srcFg[index] + 0.587 * srcFg[index + 1] + 0.114 * srcFg[index + 2]
440
+ const bgLum = 0.299 * srcBg[index] + 0.587 * srcBg[index + 1] + 0.114 * srcBg[index + 2]
441
+ const lum = Math.max(fgLum, bgLum)
442
+ if (lum > threshold) {
443
+ const intensity = (lum - threshold) / (1 - threshold + 1e-6) // Add epsilon to avoid div by zero
444
+ brightPixels.push({ x, y, intensity: Math.max(0, intensity) })
445
+ }
446
+ }
447
+ }
448
+
449
+ // If no bright pixels found, exit early
450
+ if (brightPixels.length === 0) return
451
+
452
+ // Initialize destination buffers by copying original state before applying bloom
453
+ // This prevents bloom from compounding on itself within one frame pass
454
+ destFg.set(srcFg)
455
+ destBg.set(srcBg)
456
+
457
+ // 2. Apply bloom spread from bright pixels onto the destination buffers
458
+ for (const bright of brightPixels) {
459
+ for (let ky = -radius; ky <= radius; ky++) {
460
+ for (let kx = -radius; kx <= radius; kx++) {
461
+ if (kx === 0 && ky === 0) continue // Don't bloom self
462
+
463
+ const sampleX = bright.x + kx
464
+ const sampleY = bright.y + ky
465
+
466
+ if (sampleX >= 0 && sampleX < width && sampleY >= 0 && sampleY < height) {
467
+ const distSq = kx * kx + ky * ky // Use squared distance for falloff calculation
468
+ const radiusSq = radius * radius
469
+ if (distSq <= radiusSq) {
470
+ // Simple linear falloff based on squared distance
471
+ const falloff = 1 - distSq / radiusSq
472
+ const bloomAmount = bright.intensity * strength * falloff
473
+ const destIndex = (sampleY * width + sampleX) * 4
474
+
475
+ // Add bloom to both fg and bg, clamping at 1.0
476
+ destFg[destIndex] = Math.min(1.0, destFg[destIndex] + bloomAmount)
477
+ destFg[destIndex + 1] = Math.min(1.0, destFg[destIndex + 1] + bloomAmount)
478
+ destFg[destIndex + 2] = Math.min(1.0, destFg[destIndex + 2] + bloomAmount)
479
+
480
+ destBg[destIndex] = Math.min(1.0, destBg[destIndex] + bloomAmount)
481
+ destBg[destIndex + 1] = Math.min(1.0, destBg[destIndex + 1] + bloomAmount)
482
+ destBg[destIndex + 2] = Math.min(1.0, destBg[destIndex + 2] + bloomAmount)
483
+ }
484
+ }
485
+ }
486
+ }
487
+ }
488
+ }
489
+ }