@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.
- package/dev/keypress-debug-renderer.ts +148 -0
- package/dev/keypress-debug.ts +43 -0
- package/dev/print-env-vars.ts +32 -0
- package/dev/test-tmux-graphics-334.sh +68 -0
- package/dev/thai-debug-test.ts +68 -0
- package/docs/development.md +144 -0
- package/package.json +62 -53
- package/scripts/build.ts +400 -0
- package/scripts/publish.ts +60 -0
- package/src/3d/SpriteResourceManager.ts +286 -0
- package/src/3d/SpriteUtils.ts +70 -0
- package/src/3d/TextureUtils.ts +196 -0
- package/src/3d/ThreeRenderable.ts +197 -0
- package/src/3d/WGPURenderer.ts +294 -0
- package/src/3d/animation/ExplodingSpriteEffect.ts +513 -0
- package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +429 -0
- package/src/3d/animation/SpriteAnimator.ts +633 -0
- package/src/3d/animation/SpriteParticleGenerator.ts +435 -0
- package/src/3d/canvas.ts +464 -0
- package/src/3d/index.ts +12 -0
- package/src/3d/physics/PlanckPhysicsAdapter.ts +72 -0
- package/src/3d/physics/RapierPhysicsAdapter.ts +66 -0
- package/src/3d/physics/physics-interface.ts +31 -0
- package/src/3d/shaders/supersampling.wgsl +201 -0
- package/src/3d.ts +3 -0
- package/src/NativeSpanFeed.ts +300 -0
- package/src/Renderable.ts +1704 -0
- package/src/__snapshots__/buffer.test.ts.snap +28 -0
- package/src/animation/Timeline.test.ts +2709 -0
- package/src/animation/Timeline.ts +598 -0
- package/src/ansi.ts +18 -0
- package/src/benchmark/attenuation-benchmark.ts +81 -0
- package/src/benchmark/colormatrix-benchmark.ts +128 -0
- package/src/benchmark/gain-benchmark.ts +80 -0
- package/src/benchmark/latest-all-bench-run.json +707 -0
- package/src/benchmark/latest-async-bench-run.json +336 -0
- package/src/benchmark/latest-default-bench-run.json +657 -0
- package/src/benchmark/latest-large-bench-run.json +707 -0
- package/src/benchmark/latest-quick-bench-run.json +207 -0
- package/src/benchmark/markdown-benchmark.ts +1796 -0
- package/src/benchmark/native-span-feed-async-benchmark.ts +355 -0
- package/src/benchmark/native-span-feed-benchmark.md +56 -0
- package/src/benchmark/native-span-feed-benchmark.ts +596 -0
- package/src/benchmark/native-span-feed-compare.ts +280 -0
- package/src/benchmark/renderer-benchmark.ts +754 -0
- package/src/benchmark/text-table-benchmark.ts +948 -0
- package/src/buffer.test.ts +291 -0
- package/src/buffer.ts +554 -0
- package/src/console.test.ts +612 -0
- package/src/console.ts +1254 -0
- package/src/edit-buffer.test.ts +1769 -0
- package/src/edit-buffer.ts +411 -0
- package/src/editor-view.test.ts +1032 -0
- package/src/editor-view.ts +284 -0
- package/src/examples/ascii-font-selection-demo.ts +245 -0
- package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
- package/src/examples/assets/concrete.png +0 -0
- package/src/examples/assets/crate.png +0 -0
- package/src/examples/assets/crate_emissive.png +0 -0
- package/src/examples/assets/forrest_background.png +0 -0
- package/src/examples/assets/hast-example.json +1018 -0
- package/src/examples/assets/heart.png +0 -0
- package/src/examples/assets/main_char_heavy_attack.png +0 -0
- package/src/examples/assets/main_char_idle.png +0 -0
- package/src/examples/assets/main_char_jump_end.png +0 -0
- package/src/examples/assets/main_char_jump_landing.png +0 -0
- package/src/examples/assets/main_char_jump_start.png +0 -0
- package/src/examples/assets/main_char_run_loop.png +0 -0
- package/src/examples/assets/roughness_map.jpg +0 -0
- package/src/examples/build.ts +115 -0
- package/src/examples/code-demo.ts +924 -0
- package/src/examples/console-demo.ts +358 -0
- package/src/examples/core-plugin-slots-demo.ts +759 -0
- package/src/examples/diff-demo.ts +701 -0
- package/src/examples/draggable-three-demo.ts +259 -0
- package/src/examples/editor-demo.ts +322 -0
- package/src/examples/extmarks-demo.ts +196 -0
- package/src/examples/focus-restore-demo.ts +310 -0
- package/src/examples/fonts.ts +245 -0
- package/src/examples/fractal-shader-demo.ts +268 -0
- package/src/examples/framebuffer-demo.ts +674 -0
- package/src/examples/full-unicode-demo.ts +241 -0
- package/src/examples/golden-star-demo.ts +933 -0
- package/src/examples/grayscale-buffer-demo.ts +249 -0
- package/src/examples/hast-syntax-highlighting-demo.ts +129 -0
- package/src/examples/index.ts +926 -0
- package/src/examples/input-demo.ts +377 -0
- package/src/examples/input-select-layout-demo.ts +425 -0
- package/src/examples/install.sh +143 -0
- package/src/examples/keypress-debug-demo.ts +452 -0
- package/src/examples/lib/HexList.ts +122 -0
- package/src/examples/lib/PaletteGrid.ts +125 -0
- package/src/examples/lib/standalone-keys.ts +25 -0
- package/src/examples/lib/tab-controller.ts +243 -0
- package/src/examples/lights-phong-demo.ts +290 -0
- package/src/examples/link-demo.ts +220 -0
- package/src/examples/live-state-demo.ts +480 -0
- package/src/examples/markdown-demo.ts +725 -0
- package/src/examples/mouse-interaction-demo.ts +428 -0
- package/src/examples/nested-zindex-demo.ts +357 -0
- package/src/examples/opacity-example.ts +235 -0
- package/src/examples/opentui-demo.ts +1057 -0
- package/src/examples/physx-planck-2d-demo.ts +623 -0
- package/src/examples/physx-rapier-2d-demo.ts +655 -0
- package/src/examples/relative-positioning-demo.ts +323 -0
- package/src/examples/scroll-example.ts +214 -0
- package/src/examples/scrollbox-mouse-test.ts +112 -0
- package/src/examples/scrollbox-overlay-hit-test.ts +206 -0
- package/src/examples/select-demo.ts +237 -0
- package/src/examples/shader-cube-demo.ts +1015 -0
- package/src/examples/simple-layout-example.ts +591 -0
- package/src/examples/slider-demo.ts +617 -0
- package/src/examples/split-mode-demo.ts +453 -0
- package/src/examples/sprite-animation-demo.ts +443 -0
- package/src/examples/sprite-particle-generator-demo.ts +486 -0
- package/src/examples/static-sprite-demo.ts +193 -0
- package/src/examples/sticky-scroll-example.ts +308 -0
- package/src/examples/styled-text-demo.ts +282 -0
- package/src/examples/tab-select-demo.ts +219 -0
- package/src/examples/terminal-title.ts +29 -0
- package/src/examples/terminal.ts +305 -0
- package/src/examples/text-node-demo.ts +416 -0
- package/src/examples/text-selection-demo.ts +377 -0
- package/src/examples/text-table-demo.ts +503 -0
- package/src/examples/text-truncation-demo.ts +481 -0
- package/src/examples/text-wrap.ts +757 -0
- package/src/examples/texture-loading-demo.ts +259 -0
- package/src/examples/timeline-example.ts +670 -0
- package/src/examples/transparency-demo.ts +400 -0
- package/src/examples/vnode-composition-demo.ts +404 -0
- package/src/examples/wide-grapheme-overlay-demo.ts +280 -0
- package/src/index.ts +24 -0
- package/src/lib/KeyHandler.integration.test.ts +292 -0
- package/src/lib/KeyHandler.stopPropagation.test.ts +289 -0
- package/src/lib/KeyHandler.test.ts +662 -0
- package/src/lib/KeyHandler.ts +222 -0
- package/src/lib/RGBA.test.ts +984 -0
- package/src/lib/RGBA.ts +204 -0
- package/src/lib/ascii.font.ts +330 -0
- package/src/lib/border.test.ts +83 -0
- package/src/lib/border.ts +170 -0
- package/src/lib/bunfs.test.ts +27 -0
- package/src/lib/bunfs.ts +18 -0
- package/src/lib/clipboard.test.ts +41 -0
- package/src/lib/clipboard.ts +47 -0
- package/src/lib/clock.ts +35 -0
- package/src/lib/data-paths.test.ts +133 -0
- package/src/lib/data-paths.ts +109 -0
- package/src/lib/debounce.ts +106 -0
- package/src/lib/detect-links.test.ts +98 -0
- package/src/lib/detect-links.ts +56 -0
- package/src/lib/env.test.ts +228 -0
- package/src/lib/env.ts +209 -0
- package/src/lib/extmarks-history.ts +51 -0
- package/src/lib/extmarks-multiwidth.test.ts +322 -0
- package/src/lib/extmarks.test.ts +3457 -0
- package/src/lib/extmarks.ts +843 -0
- package/src/lib/fonts/block.json +405 -0
- package/src/lib/fonts/grid.json +265 -0
- package/src/lib/fonts/huge.json +741 -0
- package/src/lib/fonts/pallet.json +314 -0
- package/src/lib/fonts/shade.json +591 -0
- package/src/lib/fonts/slick.json +321 -0
- package/src/lib/fonts/tiny.json +69 -0
- package/src/lib/hast-styled-text.ts +59 -0
- package/src/lib/index.ts +21 -0
- package/src/lib/keymapping.test.ts +317 -0
- package/src/lib/keymapping.ts +115 -0
- package/src/lib/objects-in-viewport.test.ts +787 -0
- package/src/lib/objects-in-viewport.ts +153 -0
- package/src/lib/output.capture.ts +58 -0
- package/src/lib/parse.keypress-kitty.protocol.test.ts +340 -0
- package/src/lib/parse.keypress-kitty.test.ts +663 -0
- package/src/lib/parse.keypress-kitty.ts +439 -0
- package/src/lib/parse.keypress.test.ts +1849 -0
- package/src/lib/parse.keypress.ts +397 -0
- package/src/lib/parse.mouse.test.ts +552 -0
- package/src/lib/parse.mouse.ts +232 -0
- package/src/lib/paste.ts +16 -0
- package/src/lib/queue.ts +65 -0
- package/src/lib/renderable.validations.test.ts +87 -0
- package/src/lib/renderable.validations.ts +83 -0
- package/src/lib/scroll-acceleration.ts +98 -0
- package/src/lib/selection.ts +240 -0
- package/src/lib/singleton.ts +28 -0
- package/src/lib/stdin-parser.test.ts +2290 -0
- package/src/lib/stdin-parser.ts +1810 -0
- package/src/lib/styled-text.ts +178 -0
- package/src/lib/terminal-capability-detection.test.ts +202 -0
- package/src/lib/terminal-capability-detection.ts +79 -0
- package/src/lib/terminal-palette.test.ts +878 -0
- package/src/lib/terminal-palette.ts +383 -0
- package/src/lib/tree-sitter/assets/README.md +118 -0
- package/src/lib/tree-sitter/assets/update.ts +334 -0
- package/src/lib/tree-sitter/assets.d.ts +9 -0
- package/src/lib/tree-sitter/cache.test.ts +273 -0
- package/src/lib/tree-sitter/client.test.ts +1165 -0
- package/src/lib/tree-sitter/client.ts +607 -0
- package/src/lib/tree-sitter/default-parsers.ts +86 -0
- package/src/lib/tree-sitter/download-utils.ts +148 -0
- package/src/lib/tree-sitter/index.ts +28 -0
- package/src/lib/tree-sitter/parser.worker.ts +1042 -0
- package/src/lib/tree-sitter/parsers-config.ts +81 -0
- package/src/lib/tree-sitter/resolve-ft.test.ts +55 -0
- package/src/lib/tree-sitter/resolve-ft.ts +189 -0
- package/src/lib/tree-sitter/types.ts +82 -0
- package/src/lib/tree-sitter-styled-text.test.ts +1253 -0
- package/src/lib/tree-sitter-styled-text.ts +306 -0
- package/src/lib/validate-dir-name.ts +55 -0
- package/src/lib/yoga.options.test.ts +628 -0
- package/src/lib/yoga.options.ts +346 -0
- package/src/plugins/core-slot.ts +579 -0
- package/src/plugins/registry.ts +402 -0
- package/src/plugins/types.ts +46 -0
- package/src/post/effects.ts +930 -0
- package/src/post/filters.ts +489 -0
- package/src/post/matrices.ts +288 -0
- package/src/renderables/ASCIIFont.ts +219 -0
- package/src/renderables/Box.test.ts +205 -0
- package/src/renderables/Box.ts +326 -0
- package/src/renderables/Code.test.ts +2062 -0
- package/src/renderables/Code.ts +357 -0
- package/src/renderables/Diff.regression.test.ts +226 -0
- package/src/renderables/Diff.test.ts +3101 -0
- package/src/renderables/Diff.ts +1211 -0
- package/src/renderables/EditBufferRenderable.test.ts +288 -0
- package/src/renderables/EditBufferRenderable.ts +1166 -0
- package/src/renderables/FrameBuffer.ts +47 -0
- package/src/renderables/Input.test.ts +1228 -0
- package/src/renderables/Input.ts +247 -0
- package/src/renderables/LineNumberRenderable.ts +724 -0
- package/src/renderables/Markdown.ts +1393 -0
- package/src/renderables/ScrollBar.ts +422 -0
- package/src/renderables/ScrollBox.ts +883 -0
- package/src/renderables/Select.test.ts +1033 -0
- package/src/renderables/Select.ts +524 -0
- package/src/renderables/Slider.test.ts +456 -0
- package/src/renderables/Slider.ts +342 -0
- package/src/renderables/TabSelect.test.ts +197 -0
- package/src/renderables/TabSelect.ts +455 -0
- package/src/renderables/Text.selection-buffer.test.ts +123 -0
- package/src/renderables/Text.test.ts +2660 -0
- package/src/renderables/Text.ts +147 -0
- package/src/renderables/TextBufferRenderable.ts +518 -0
- package/src/renderables/TextNode.test.ts +1058 -0
- package/src/renderables/TextNode.ts +325 -0
- package/src/renderables/TextTable.test.ts +1421 -0
- package/src/renderables/TextTable.ts +1344 -0
- package/src/renderables/Textarea.ts +430 -0
- package/src/renderables/TimeToFirstDraw.ts +89 -0
- package/src/renderables/__snapshots__/Code.test.ts.snap +13 -0
- package/src/renderables/__snapshots__/Diff.test.ts.snap +785 -0
- package/src/renderables/__snapshots__/Text.test.ts.snap +421 -0
- package/src/renderables/__snapshots__/TextTable.test.ts.snap +215 -0
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +144 -0
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +816 -0
- package/src/renderables/__tests__/LineNumberRenderable.test.ts +1865 -0
- package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +85 -0
- package/src/renderables/__tests__/Markdown.code-colors.test.ts +242 -0
- package/src/renderables/__tests__/Markdown.test.ts +2518 -0
- package/src/renderables/__tests__/MultiRenderable.selection.test.ts +87 -0
- package/src/renderables/__tests__/Textarea.buffer.test.ts +682 -0
- package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +675 -0
- package/src/renderables/__tests__/Textarea.editing.test.ts +2041 -0
- package/src/renderables/__tests__/Textarea.error-handling.test.ts +35 -0
- package/src/renderables/__tests__/Textarea.events.test.ts +738 -0
- package/src/renderables/__tests__/Textarea.highlights.test.ts +590 -0
- package/src/renderables/__tests__/Textarea.keybinding.test.ts +3149 -0
- package/src/renderables/__tests__/Textarea.paste.test.ts +357 -0
- package/src/renderables/__tests__/Textarea.rendering.test.ts +1866 -0
- package/src/renderables/__tests__/Textarea.scroll.test.ts +733 -0
- package/src/renderables/__tests__/Textarea.selection.test.ts +1590 -0
- package/src/renderables/__tests__/Textarea.stress.test.ts +670 -0
- package/src/renderables/__tests__/Textarea.undo-redo.test.ts +383 -0
- package/src/renderables/__tests__/Textarea.visual-lines.test.ts +310 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +221 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +89 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +457 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +158 -0
- package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +387 -0
- package/src/renderables/__tests__/markdown-parser.test.ts +217 -0
- package/src/renderables/__tests__/renderable-test-utils.ts +60 -0
- package/src/renderables/composition/README.md +8 -0
- package/src/renderables/composition/VRenderable.ts +32 -0
- package/src/renderables/composition/constructs.ts +127 -0
- package/src/renderables/composition/vnode.ts +289 -0
- package/src/renderables/index.ts +23 -0
- package/src/renderables/markdown-parser.ts +66 -0
- package/src/renderer.ts +2681 -0
- package/src/runtime-plugin-support.ts +39 -0
- package/src/runtime-plugin.ts +615 -0
- package/src/syntax-style.test.ts +841 -0
- package/src/syntax-style.ts +257 -0
- package/src/testing/README.md +210 -0
- package/src/testing/capture-spans.test.ts +194 -0
- package/src/testing/integration.test.ts +276 -0
- package/src/testing/manual-clock.ts +117 -0
- package/src/testing/mock-keys.test.ts +1378 -0
- package/src/testing/mock-keys.ts +457 -0
- package/src/testing/mock-mouse.test.ts +218 -0
- package/src/testing/mock-mouse.ts +247 -0
- package/src/testing/mock-tree-sitter-client.ts +73 -0
- package/src/testing/spy.ts +13 -0
- package/src/testing/test-recorder.test.ts +415 -0
- package/src/testing/test-recorder.ts +145 -0
- package/src/testing/test-renderer.ts +132 -0
- package/src/testing.ts +7 -0
- package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +481 -0
- package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +19 -0
- package/src/tests/__snapshots__/scrollbox.test.ts.snap +29 -0
- package/src/tests/absolute-positioning.snapshot.test.ts +638 -0
- package/src/tests/allocator-stats.test.ts +38 -0
- package/src/tests/destroy-during-render.test.ts +200 -0
- package/src/tests/destroy-on-exit.fixture.ts +36 -0
- package/src/tests/destroy-on-exit.test.ts +41 -0
- package/src/tests/hover-cursor.test.ts +98 -0
- package/src/tests/native-span-feed-async.test.ts +173 -0
- package/src/tests/native-span-feed-close.test.ts +120 -0
- package/src/tests/native-span-feed-coverage.test.ts +227 -0
- package/src/tests/native-span-feed-edge-cases.test.ts +352 -0
- package/src/tests/native-span-feed-use-after-free.test.ts +45 -0
- package/src/tests/opacity.test.ts +123 -0
- package/src/tests/renderable.snapshot.test.ts +524 -0
- package/src/tests/renderable.test.ts +1281 -0
- package/src/tests/renderer.clock.test.ts +158 -0
- package/src/tests/renderer.console-startup.test.ts +185 -0
- package/src/tests/renderer.control.test.ts +425 -0
- package/src/tests/renderer.core-slot-binding.test.ts +952 -0
- package/src/tests/renderer.cursor.test.ts +26 -0
- package/src/tests/renderer.destroy-during-render.test.ts +147 -0
- package/src/tests/renderer.focus-restore.test.ts +257 -0
- package/src/tests/renderer.focus.test.ts +294 -0
- package/src/tests/renderer.idle.test.ts +219 -0
- package/src/tests/renderer.input.test.ts +2237 -0
- package/src/tests/renderer.kitty-flags.test.ts +195 -0
- package/src/tests/renderer.mouse.test.ts +1274 -0
- package/src/tests/renderer.palette.test.ts +629 -0
- package/src/tests/renderer.selection.test.ts +49 -0
- package/src/tests/renderer.slot-registry.test.ts +684 -0
- package/src/tests/renderer.useMouse.test.ts +47 -0
- package/src/tests/runtime-plugin-node-modules-cycle.fixture.ts +76 -0
- package/src/tests/runtime-plugin-node-modules-mjs.fixture.ts +43 -0
- package/src/tests/runtime-plugin-node-modules-no-bare-rewrite.fixture.ts +67 -0
- package/src/tests/runtime-plugin-node-modules-package-type-cache.fixture.ts +72 -0
- package/src/tests/runtime-plugin-node-modules-runtime-specifier.fixture.ts +44 -0
- package/src/tests/runtime-plugin-node-modules-scoped-package-bare-rewrite.fixture.ts +85 -0
- package/src/tests/runtime-plugin-path-alias.fixture.ts +43 -0
- package/src/tests/runtime-plugin-resolve-roots.fixture.ts +65 -0
- package/src/tests/runtime-plugin-support.fixture.ts +11 -0
- package/src/tests/runtime-plugin-support.test.ts +19 -0
- package/src/tests/runtime-plugin-windows-file-url.fixture.ts +30 -0
- package/src/tests/runtime-plugin.fixture.ts +40 -0
- package/src/tests/runtime-plugin.test.ts +354 -0
- package/src/tests/scrollbox-culling-bug.test.ts +114 -0
- package/src/tests/scrollbox-hitgrid-resize.test.ts +136 -0
- package/src/tests/scrollbox-hitgrid.test.ts +909 -0
- package/src/tests/scrollbox.test.ts +1530 -0
- package/src/tests/wrap-resize-perf.test.ts +276 -0
- package/src/tests/yoga-setters.test.ts +921 -0
- package/src/text-buffer-view.test.ts +705 -0
- package/src/text-buffer-view.ts +189 -0
- package/src/text-buffer.test.ts +347 -0
- package/src/text-buffer.ts +250 -0
- package/src/types.ts +161 -0
- package/src/utils.ts +88 -0
- package/src/zig/ansi.zig +268 -0
- package/src/zig/bench/README.md +50 -0
- package/src/zig/bench/buffer-draw-text-buffer_bench.zig +887 -0
- package/src/zig/bench/edit-buffer_bench.zig +476 -0
- package/src/zig/bench/native-span-feed_bench.zig +100 -0
- package/src/zig/bench/rope-markers_bench.zig +713 -0
- package/src/zig/bench/rope_bench.zig +514 -0
- package/src/zig/bench/styled-text_bench.zig +470 -0
- package/src/zig/bench/text-buffer-coords_bench.zig +362 -0
- package/src/zig/bench/text-buffer-view_bench.zig +459 -0
- package/src/zig/bench/text-chunk-graphemes_bench.zig +273 -0
- package/src/zig/bench/utf8_bench.zig +799 -0
- package/src/zig/bench-utils.zig +431 -0
- package/src/zig/bench.zig +217 -0
- package/src/zig/buffer-methods.zig +211 -0
- package/src/zig/buffer.zig +2281 -0
- package/src/zig/build.zig +289 -0
- package/src/zig/build.zig.zon +16 -0
- package/src/zig/edit-buffer.zig +825 -0
- package/src/zig/editor-view.zig +802 -0
- package/src/zig/event-bus.zig +13 -0
- package/src/zig/event-emitter.zig +65 -0
- package/src/zig/file-logger.zig +92 -0
- package/src/zig/grapheme.zig +599 -0
- package/src/zig/lib.zig +1854 -0
- package/src/zig/link.zig +333 -0
- package/src/zig/logger.zig +43 -0
- package/src/zig/mem-registry.zig +125 -0
- package/src/zig/native-span-feed-bench-lib.zig +7 -0
- package/src/zig/native-span-feed.zig +708 -0
- package/src/zig/renderer.zig +1393 -0
- package/src/zig/rope.zig +1220 -0
- package/src/zig/syntax-style.zig +161 -0
- package/src/zig/terminal.zig +987 -0
- package/src/zig/test.zig +72 -0
- package/src/zig/tests/README.md +18 -0
- package/src/zig/tests/buffer-methods_test.zig +1109 -0
- package/src/zig/tests/buffer_test.zig +2557 -0
- package/src/zig/tests/edit-buffer-history_test.zig +271 -0
- package/src/zig/tests/edit-buffer_test.zig +1689 -0
- package/src/zig/tests/editor-view_test.zig +3299 -0
- package/src/zig/tests/event-emitter_test.zig +249 -0
- package/src/zig/tests/grapheme_test.zig +1304 -0
- package/src/zig/tests/link_test.zig +190 -0
- package/src/zig/tests/mem-registry_test.zig +473 -0
- package/src/zig/tests/memory_leak_regression_test.zig +159 -0
- package/src/zig/tests/native-span-feed_test.zig +1264 -0
- package/src/zig/tests/renderer_test.zig +1017 -0
- package/src/zig/tests/rope-nested_test.zig +712 -0
- package/src/zig/tests/rope_fuzz_test.zig +238 -0
- package/src/zig/tests/rope_test.zig +2362 -0
- package/src/zig/tests/segment-merge.test.zig +148 -0
- package/src/zig/tests/syntax-style_test.zig +557 -0
- package/src/zig/tests/terminal_test.zig +754 -0
- package/src/zig/tests/text-buffer-drawing_test.zig +3237 -0
- package/src/zig/tests/text-buffer-highlights_test.zig +666 -0
- package/src/zig/tests/text-buffer-iterators_test.zig +776 -0
- package/src/zig/tests/text-buffer-segment_test.zig +320 -0
- package/src/zig/tests/text-buffer-selection_test.zig +1035 -0
- package/src/zig/tests/text-buffer-selection_viewport_test.zig +358 -0
- package/src/zig/tests/text-buffer-view_test.zig +3649 -0
- package/src/zig/tests/text-buffer_test.zig +2191 -0
- package/src/zig/tests/unicode-width-map.zon +3909 -0
- package/src/zig/tests/utf8_no_zwj_test.zig +260 -0
- package/src/zig/tests/utf8_test.zig +4057 -0
- package/src/zig/tests/utf8_wcwidth_cursor_test.zig +267 -0
- package/src/zig/tests/utf8_wcwidth_test.zig +357 -0
- package/src/zig/tests/word-wrap-editing_test.zig +498 -0
- package/src/zig/tests/wrap-cache-perf_test.zig +113 -0
- package/src/zig/text-buffer-iterators.zig +499 -0
- package/src/zig/text-buffer-segment.zig +404 -0
- package/src/zig/text-buffer-view.zig +1371 -0
- package/src/zig/text-buffer.zig +1180 -0
- package/src/zig/utf8.zig +1948 -0
- package/src/zig/utils.zig +9 -0
- package/src/zig-structs.ts +261 -0
- package/src/zig.ts +3884 -0
- package/tsconfig.build.json +24 -0
- package/tsconfig.json +27 -0
- package/3d/SpriteResourceManager.d.ts +0 -74
- package/3d/SpriteUtils.d.ts +0 -13
- package/3d/TextureUtils.d.ts +0 -24
- package/3d/ThreeRenderable.d.ts +0 -40
- package/3d/WGPURenderer.d.ts +0 -61
- package/3d/animation/ExplodingSpriteEffect.d.ts +0 -71
- package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +0 -76
- package/3d/animation/SpriteAnimator.d.ts +0 -124
- package/3d/animation/SpriteParticleGenerator.d.ts +0 -62
- package/3d/canvas.d.ts +0 -44
- package/3d/index.d.ts +0 -12
- package/3d/physics/PlanckPhysicsAdapter.d.ts +0 -19
- package/3d/physics/RapierPhysicsAdapter.d.ts +0 -19
- package/3d/physics/physics-interface.d.ts +0 -27
- package/3d.d.ts +0 -2
- package/3d.js +0 -34041
- package/3d.js.map +0 -155
- package/LICENSE +0 -21
- package/NativeSpanFeed.d.ts +0 -41
- package/Renderable.d.ts +0 -334
- package/animation/Timeline.d.ts +0 -126
- package/ansi.d.ts +0 -13
- package/buffer.d.ts +0 -111
- package/console.d.ts +0 -144
- package/edit-buffer.d.ts +0 -98
- package/editor-view.d.ts +0 -73
- package/index-9vwc3fg6.js +0 -12260
- package/index-9vwc3fg6.js.map +0 -42
- package/index-dcj62y8t.js +0 -20614
- package/index-dcj62y8t.js.map +0 -67
- package/index-f7n39gpy.js +0 -411
- package/index-f7n39gpy.js.map +0 -10
- package/index.d.ts +0 -23
- package/index.js +0 -478
- package/index.js.map +0 -9
- package/lib/KeyHandler.d.ts +0 -61
- package/lib/RGBA.d.ts +0 -25
- package/lib/ascii.font.d.ts +0 -508
- package/lib/border.d.ts +0 -51
- package/lib/bunfs.d.ts +0 -7
- package/lib/clipboard.d.ts +0 -17
- package/lib/clock.d.ts +0 -15
- package/lib/data-paths.d.ts +0 -26
- package/lib/debounce.d.ts +0 -42
- package/lib/detect-links.d.ts +0 -6
- package/lib/env.d.ts +0 -42
- package/lib/extmarks-history.d.ts +0 -17
- package/lib/extmarks.d.ts +0 -89
- package/lib/hast-styled-text.d.ts +0 -17
- package/lib/index.d.ts +0 -21
- package/lib/keymapping.d.ts +0 -25
- package/lib/objects-in-viewport.d.ts +0 -24
- package/lib/output.capture.d.ts +0 -24
- package/lib/parse.keypress-kitty.d.ts +0 -2
- package/lib/parse.keypress.d.ts +0 -26
- package/lib/parse.mouse.d.ts +0 -30
- package/lib/paste.d.ts +0 -7
- package/lib/queue.d.ts +0 -15
- package/lib/renderable.validations.d.ts +0 -12
- package/lib/scroll-acceleration.d.ts +0 -43
- package/lib/selection.d.ts +0 -63
- package/lib/singleton.d.ts +0 -7
- package/lib/stdin-parser.d.ts +0 -87
- package/lib/styled-text.d.ts +0 -63
- package/lib/terminal-capability-detection.d.ts +0 -30
- package/lib/terminal-palette.d.ts +0 -50
- package/lib/tree-sitter/assets/update.d.ts +0 -11
- package/lib/tree-sitter/client.d.ts +0 -47
- package/lib/tree-sitter/default-parsers.d.ts +0 -2
- package/lib/tree-sitter/download-utils.d.ts +0 -21
- package/lib/tree-sitter/index.d.ts +0 -8
- package/lib/tree-sitter/parser.worker.d.ts +0 -1
- package/lib/tree-sitter/parsers-config.d.ts +0 -53
- package/lib/tree-sitter/resolve-ft.d.ts +0 -5
- package/lib/tree-sitter/types.d.ts +0 -82
- package/lib/tree-sitter-styled-text.d.ts +0 -14
- package/lib/validate-dir-name.d.ts +0 -1
- package/lib/yoga.options.d.ts +0 -32
- package/parser.worker.js +0 -899
- package/parser.worker.js.map +0 -12
- package/plugins/core-slot.d.ts +0 -72
- package/plugins/registry.d.ts +0 -42
- package/plugins/types.d.ts +0 -34
- package/post/effects.d.ts +0 -147
- package/post/filters.d.ts +0 -65
- package/post/matrices.d.ts +0 -20
- package/renderables/ASCIIFont.d.ts +0 -52
- package/renderables/Box.d.ts +0 -81
- package/renderables/Code.d.ts +0 -78
- package/renderables/Diff.d.ts +0 -142
- package/renderables/EditBufferRenderable.d.ts +0 -237
- package/renderables/FrameBuffer.d.ts +0 -16
- package/renderables/Input.d.ts +0 -67
- package/renderables/LineNumberRenderable.d.ts +0 -78
- package/renderables/Markdown.d.ts +0 -185
- package/renderables/ScrollBar.d.ts +0 -77
- package/renderables/ScrollBox.d.ts +0 -124
- package/renderables/Select.d.ts +0 -115
- package/renderables/Slider.d.ts +0 -47
- package/renderables/TabSelect.d.ts +0 -96
- package/renderables/Text.d.ts +0 -36
- package/renderables/TextBufferRenderable.d.ts +0 -105
- package/renderables/TextNode.d.ts +0 -91
- package/renderables/TextTable.d.ts +0 -140
- package/renderables/Textarea.d.ts +0 -63
- package/renderables/TimeToFirstDraw.d.ts +0 -24
- package/renderables/__tests__/renderable-test-utils.d.ts +0 -12
- package/renderables/composition/VRenderable.d.ts +0 -16
- package/renderables/composition/constructs.d.ts +0 -35
- package/renderables/composition/vnode.d.ts +0 -46
- package/renderables/index.d.ts +0 -23
- package/renderables/markdown-parser.d.ts +0 -10
- package/renderer.d.ts +0 -419
- package/runtime-plugin-support.d.ts +0 -3
- package/runtime-plugin-support.js +0 -29
- package/runtime-plugin-support.js.map +0 -10
- package/runtime-plugin.d.ts +0 -16
- package/runtime-plugin.js +0 -16
- package/runtime-plugin.js.map +0 -9
- package/syntax-style.d.ts +0 -54
- package/testing/manual-clock.d.ts +0 -17
- package/testing/mock-keys.d.ts +0 -81
- package/testing/mock-mouse.d.ts +0 -38
- package/testing/mock-tree-sitter-client.d.ts +0 -23
- package/testing/spy.d.ts +0 -7
- package/testing/test-recorder.d.ts +0 -61
- package/testing/test-renderer.d.ts +0 -23
- package/testing.d.ts +0 -6
- package/testing.js +0 -697
- package/testing.js.map +0 -15
- package/text-buffer-view.d.ts +0 -42
- package/text-buffer.d.ts +0 -67
- package/types.d.ts +0 -139
- package/utils.d.ts +0 -14
- package/zig-structs.d.ts +0 -155
- package/zig.d.ts +0 -353
- /package/{assets → src/lib/tree-sitter/assets}/javascript/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/javascript/tree-sitter-javascript.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown/injections.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown/tree-sitter-markdown.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/typescript/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/typescript/tree-sitter-typescript.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/zig/highlights.scm +0 -0
- /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
|
+
}
|