@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,887 @@
1
+ const std = @import("std");
2
+ const bench_utils = @import("../bench-utils.zig");
3
+ const buffer = @import("../buffer.zig");
4
+ const text_buffer = @import("../text-buffer.zig");
5
+ const text_buffer_view = @import("../text-buffer-view.zig");
6
+ const gp = @import("../grapheme.zig");
7
+ const link = @import("../link.zig");
8
+
9
+ const OptimizedBuffer = buffer.OptimizedBuffer;
10
+ const UnifiedTextBuffer = text_buffer.UnifiedTextBuffer;
11
+ const UnifiedTextBufferView = text_buffer_view.UnifiedTextBufferView;
12
+ const WrapMode = text_buffer.WrapMode;
13
+ const BenchResult = bench_utils.BenchResult;
14
+ const BenchStats = bench_utils.BenchStats;
15
+ const MemStat = bench_utils.MemStat;
16
+
17
+ pub const benchName = "Buffer drawTextBuffer";
18
+
19
+ fn generateText(allocator: std.mem.Allocator, lines: u32, avg_line_len: u32) ![]u8 {
20
+ var buf: std.ArrayListUnmanaged(u8) = .{};
21
+ errdefer buf.deinit(allocator);
22
+
23
+ const patterns = [_][]const u8{
24
+ "The quick brown fox jumps over the lazy dog. ",
25
+ "Lorem ipsum dolor sit amet consectetur. ",
26
+ "function test() { return 42; } ",
27
+ "Hello 世界 Unicode テスト 🌍 ",
28
+ "Mixed: ASCII 中文 emoji 🚀💻 text. ",
29
+ };
30
+
31
+ for (0..lines) |i| {
32
+ var line_len: u32 = 0;
33
+ while (line_len < avg_line_len) {
34
+ const pattern = patterns[i % patterns.len];
35
+ try buf.appendSlice(allocator, pattern);
36
+ line_len += @intCast(pattern.len);
37
+ }
38
+ try buf.append(allocator, '\n');
39
+ }
40
+
41
+ return try buf.toOwnedSlice(allocator);
42
+ }
43
+
44
+ fn generateManySmallChunks(allocator: std.mem.Allocator, chunks: u32) ![]u8 {
45
+ var buf: std.ArrayListUnmanaged(u8) = .{};
46
+ errdefer buf.deinit(allocator);
47
+
48
+ for (0..chunks) |i| {
49
+ try buf.appendSlice(allocator, "ab ");
50
+ if (i % 20 == 19) try buf.append(allocator, '\n');
51
+ }
52
+
53
+ return try buf.toOwnedSlice(allocator);
54
+ }
55
+
56
+ fn setupTextBuffer(
57
+ allocator: std.mem.Allocator,
58
+ pool: *gp.GraphemePool,
59
+ text: []const u8,
60
+ wrap_width: ?u32,
61
+ ) !struct { *UnifiedTextBuffer, *UnifiedTextBufferView } {
62
+ const link_pool = link.initGlobalLinkPool(allocator);
63
+ const tb = try UnifiedTextBuffer.init(allocator, pool, link_pool, .unicode);
64
+ errdefer tb.deinit();
65
+
66
+ try tb.setText(text);
67
+
68
+ const view = try UnifiedTextBufferView.init(allocator, tb);
69
+ errdefer view.deinit();
70
+
71
+ if (wrap_width) |w| {
72
+ view.setWrapMode(.char);
73
+ view.setWrapWidth(w);
74
+ } else {
75
+ view.setWrapMode(.none);
76
+ }
77
+
78
+ return .{ tb, view };
79
+ }
80
+
81
+ fn benchRenderColdCache(
82
+ allocator: std.mem.Allocator,
83
+ pool: *gp.GraphemePool,
84
+ iterations: usize,
85
+ show_mem: bool,
86
+ bench_filter: ?[]const u8,
87
+ ) ![]BenchResult {
88
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
89
+ errdefer results.deinit(allocator);
90
+
91
+ const name = "COLD: 120x40 render (500 lines, wrap=120, includes setup)";
92
+ if (!bench_utils.matchesBenchFilter(name, bench_filter)) return try results.toOwnedSlice(allocator);
93
+
94
+ const text = try generateText(allocator, 500, 100);
95
+ defer allocator.free(text);
96
+
97
+ var stats = BenchStats{};
98
+ var final_buf_mem: usize = 0;
99
+
100
+ for (0..iterations) |i| {
101
+ const tb, const view = try setupTextBuffer(allocator, pool, text, 120);
102
+ defer tb.deinit();
103
+ defer view.deinit();
104
+
105
+ const buf = try OptimizedBuffer.init(allocator, 120, 40, .{ .pool = pool });
106
+ defer buf.deinit();
107
+
108
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
109
+
110
+ var timer = try std.time.Timer.start();
111
+ try buf.drawTextBuffer(view, 0, 0);
112
+ stats.record(timer.read());
113
+
114
+ if (i == iterations - 1 and show_mem) {
115
+ final_buf_mem = @sizeOf(OptimizedBuffer) + (buf.width * buf.height * (@sizeOf(u32) + @sizeOf(@TypeOf(buf.buffer.fg[0])) * 2 + @sizeOf(u8)));
116
+ }
117
+ }
118
+
119
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
120
+ const mem_stat_slice = try allocator.alloc(MemStat, 1);
121
+ mem_stat_slice[0] = .{ .name = "Buf", .bytes = final_buf_mem };
122
+ break :blk mem_stat_slice;
123
+ } else null;
124
+
125
+ try results.append(allocator, BenchResult{
126
+ .name = name,
127
+ .min_ns = stats.min_ns,
128
+ .avg_ns = stats.avg(),
129
+ .max_ns = stats.max_ns,
130
+ .total_ns = stats.total_ns,
131
+ .iterations = iterations,
132
+ .mem_stats = mem_stats,
133
+ });
134
+
135
+ return try results.toOwnedSlice(allocator);
136
+ }
137
+
138
+ fn benchWrapAndRender(
139
+ allocator: std.mem.Allocator,
140
+ pool: *gp.GraphemePool,
141
+ iterations: usize,
142
+ show_mem: bool,
143
+ bench_filter: ?[]const u8,
144
+ ) ![]BenchResult {
145
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
146
+ errdefer results.deinit(allocator);
147
+
148
+ const name = "WRAP+RENDER: 120x40 render (500 lines, wrap=120)";
149
+ if (!bench_utils.matchesBenchFilter(name, bench_filter)) return try results.toOwnedSlice(allocator);
150
+
151
+ const text = try generateText(allocator, 500, 100);
152
+ defer allocator.free(text);
153
+
154
+ var stats = BenchStats{};
155
+ var final_tb_mem: usize = 0;
156
+ var final_view_mem: usize = 0;
157
+ var final_buf_mem: usize = 0;
158
+
159
+ for (0..iterations) |i| {
160
+ const tb, const view = try setupTextBuffer(allocator, pool, text, 120);
161
+ defer tb.deinit();
162
+ defer view.deinit();
163
+
164
+ const buf = try OptimizedBuffer.init(allocator, 120, 40, .{ .pool = pool });
165
+ defer buf.deinit();
166
+
167
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
168
+
169
+ var timer = try std.time.Timer.start();
170
+ try buf.drawTextBuffer(view, 0, 0);
171
+ stats.record(timer.read());
172
+
173
+ if (i == iterations - 1 and show_mem) {
174
+ final_tb_mem = tb.getArenaAllocatedBytes();
175
+ final_view_mem = view.getArenaAllocatedBytes();
176
+ final_buf_mem = @sizeOf(OptimizedBuffer) + (buf.width * buf.height * (@sizeOf(u32) + @sizeOf(@TypeOf(buf.buffer.fg[0])) * 2 + @sizeOf(u8)));
177
+ }
178
+ }
179
+
180
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
181
+ const mem_stat_slice = try allocator.alloc(MemStat, 3);
182
+ mem_stat_slice[0] = .{ .name = "TB", .bytes = final_tb_mem };
183
+ mem_stat_slice[1] = .{ .name = "View", .bytes = final_view_mem };
184
+ mem_stat_slice[2] = .{ .name = "Buf", .bytes = final_buf_mem };
185
+ break :blk mem_stat_slice;
186
+ } else null;
187
+
188
+ try results.append(allocator, BenchResult{
189
+ .name = name,
190
+ .min_ns = stats.min_ns,
191
+ .avg_ns = stats.avg(),
192
+ .max_ns = stats.max_ns,
193
+ .total_ns = stats.total_ns,
194
+ .iterations = iterations,
195
+ .mem_stats = mem_stats,
196
+ });
197
+
198
+ return try results.toOwnedSlice(allocator);
199
+ }
200
+
201
+ fn benchRenderWarmCache(
202
+ allocator: std.mem.Allocator,
203
+ pool: *gp.GraphemePool,
204
+ iterations: usize,
205
+ show_mem: bool,
206
+ bench_filter: ?[]const u8,
207
+ ) ![]BenchResult {
208
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
209
+ errdefer results.deinit(allocator);
210
+
211
+ const warm_name = "WARM: 120x40 render (500 lines, pre-wrapped, pure render)";
212
+ const hot_name = "HOT: 120x40 render (500 lines, reused buffer, pure render)";
213
+ const run_warm = bench_utils.matchesBenchFilter(warm_name, bench_filter);
214
+ const run_hot = bench_utils.matchesBenchFilter(hot_name, bench_filter);
215
+ if (!run_warm and !run_hot) return try results.toOwnedSlice(allocator);
216
+
217
+ const text = try generateText(allocator, 500, 100);
218
+ defer allocator.free(text);
219
+
220
+ if (run_warm) {
221
+ const tb, const view = try setupTextBuffer(allocator, pool, text, 120);
222
+ defer tb.deinit();
223
+ defer view.deinit();
224
+
225
+ var stats = BenchStats{};
226
+ var final_buf_mem: usize = 0;
227
+
228
+ for (0..iterations) |i| {
229
+ const buf = try OptimizedBuffer.init(allocator, 120, 40, .{ .pool = pool });
230
+ defer buf.deinit();
231
+
232
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
233
+
234
+ var timer = try std.time.Timer.start();
235
+ try buf.drawTextBuffer(view, 0, 0);
236
+ stats.record(timer.read());
237
+
238
+ if (i == iterations - 1 and show_mem) {
239
+ final_buf_mem = @sizeOf(OptimizedBuffer) + (buf.width * buf.height * (@sizeOf(u32) + @sizeOf(@TypeOf(buf.buffer.fg[0])) * 2 + @sizeOf(u8)));
240
+ }
241
+ }
242
+
243
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
244
+ const mem_stat_slice = try allocator.alloc(MemStat, 1);
245
+ mem_stat_slice[0] = .{ .name = "Buf", .bytes = final_buf_mem };
246
+ break :blk mem_stat_slice;
247
+ } else null;
248
+
249
+ try results.append(allocator, BenchResult{
250
+ .name = warm_name,
251
+ .min_ns = stats.min_ns,
252
+ .avg_ns = stats.avg(),
253
+ .max_ns = stats.max_ns,
254
+ .total_ns = stats.total_ns,
255
+ .iterations = iterations,
256
+ .mem_stats = mem_stats,
257
+ });
258
+ }
259
+
260
+ if (run_hot) {
261
+ const tb, const view = try setupTextBuffer(allocator, pool, text, 120);
262
+ defer tb.deinit();
263
+ defer view.deinit();
264
+
265
+ const buf = try OptimizedBuffer.init(allocator, 120, 40, .{ .pool = pool });
266
+ defer buf.deinit();
267
+
268
+ var stats = BenchStats{};
269
+
270
+ for (0..iterations) |_| {
271
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
272
+
273
+ var timer = try std.time.Timer.start();
274
+ try buf.drawTextBuffer(view, 0, 0);
275
+ stats.record(timer.read());
276
+ }
277
+
278
+ try results.append(allocator, BenchResult{
279
+ .name = hot_name,
280
+ .min_ns = stats.min_ns,
281
+ .avg_ns = stats.avg(),
282
+ .max_ns = stats.max_ns,
283
+ .total_ns = stats.total_ns,
284
+ .iterations = iterations,
285
+ .mem_stats = null,
286
+ });
287
+ }
288
+
289
+ return try results.toOwnedSlice(allocator);
290
+ }
291
+
292
+ fn benchRenderSmallResolution(
293
+ allocator: std.mem.Allocator,
294
+ pool: *gp.GraphemePool,
295
+ iterations: usize,
296
+ show_mem: bool,
297
+ bench_filter: ?[]const u8,
298
+ ) ![]BenchResult {
299
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
300
+ errdefer results.deinit(allocator);
301
+
302
+ const no_wrap_name = "80x24 render (100 lines, no wrap)";
303
+ const wrap_name = "80x24 render (100 lines, wrap=40)";
304
+ const run_no_wrap = bench_utils.matchesBenchFilter(no_wrap_name, bench_filter);
305
+ const run_wrap = bench_utils.matchesBenchFilter(wrap_name, bench_filter);
306
+ if (!run_no_wrap and !run_wrap) return try results.toOwnedSlice(allocator);
307
+
308
+ const text = try generateText(allocator, 100, 80);
309
+ defer allocator.free(text);
310
+
311
+ if (run_no_wrap) {
312
+ const tb, const view = try setupTextBuffer(allocator, pool, text, 80);
313
+ defer tb.deinit();
314
+ defer view.deinit();
315
+
316
+ const buf = try OptimizedBuffer.init(allocator, 80, 24, .{ .pool = pool });
317
+ defer buf.deinit();
318
+
319
+ var stats = BenchStats{};
320
+ var final_buf_mem: usize = 0;
321
+
322
+ for (0..iterations) |i| {
323
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
324
+
325
+ var timer = try std.time.Timer.start();
326
+ try buf.drawTextBuffer(view, 0, 0);
327
+ stats.record(timer.read());
328
+
329
+ if (i == iterations - 1 and show_mem) {
330
+ final_buf_mem = @sizeOf(OptimizedBuffer) + (buf.width * buf.height * (@sizeOf(u32) + @sizeOf(@TypeOf(buf.buffer.fg[0])) * 2 + @sizeOf(u8)));
331
+ }
332
+ }
333
+
334
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
335
+ const mem_stat_slice = try allocator.alloc(MemStat, 1);
336
+ mem_stat_slice[0] = .{ .name = "Buf", .bytes = final_buf_mem };
337
+ break :blk mem_stat_slice;
338
+ } else null;
339
+
340
+ try results.append(allocator, BenchResult{
341
+ .name = no_wrap_name,
342
+ .min_ns = stats.min_ns,
343
+ .avg_ns = stats.avg(),
344
+ .max_ns = stats.max_ns,
345
+ .total_ns = stats.total_ns,
346
+ .iterations = iterations,
347
+ .mem_stats = mem_stats,
348
+ });
349
+ }
350
+
351
+ if (run_wrap) {
352
+ const tb, const view = try setupTextBuffer(allocator, pool, text, 40);
353
+ defer tb.deinit();
354
+ defer view.deinit();
355
+
356
+ const buf = try OptimizedBuffer.init(allocator, 80, 24, .{ .pool = pool });
357
+ defer buf.deinit();
358
+
359
+ var stats = BenchStats{};
360
+
361
+ for (0..iterations) |_| {
362
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
363
+
364
+ var timer = try std.time.Timer.start();
365
+ try buf.drawTextBuffer(view, 0, 0);
366
+ stats.record(timer.read());
367
+ }
368
+
369
+ try results.append(allocator, BenchResult{
370
+ .name = wrap_name,
371
+ .min_ns = stats.min_ns,
372
+ .avg_ns = stats.avg(),
373
+ .max_ns = stats.max_ns,
374
+ .total_ns = stats.total_ns,
375
+ .iterations = iterations,
376
+ .mem_stats = null,
377
+ });
378
+ }
379
+
380
+ return try results.toOwnedSlice(allocator);
381
+ }
382
+
383
+ fn benchRenderMediumResolution(
384
+ allocator: std.mem.Allocator,
385
+ pool: *gp.GraphemePool,
386
+ iterations: usize,
387
+ show_mem: bool,
388
+ bench_filter: ?[]const u8,
389
+ ) ![]BenchResult {
390
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
391
+ errdefer results.deinit(allocator);
392
+
393
+ const name = "200x60 render (1000 lines, wrap=200)";
394
+ if (!bench_utils.matchesBenchFilter(name, bench_filter)) return try results.toOwnedSlice(allocator);
395
+
396
+ const text = try generateText(allocator, 1000, 120);
397
+ defer allocator.free(text);
398
+
399
+ const tb, const view = try setupTextBuffer(allocator, pool, text, 200);
400
+ defer tb.deinit();
401
+ defer view.deinit();
402
+
403
+ const buf = try OptimizedBuffer.init(allocator, 200, 60, .{ .pool = pool });
404
+ defer buf.deinit();
405
+
406
+ var stats = BenchStats{};
407
+ var final_buf_mem: usize = 0;
408
+
409
+ for (0..iterations) |i| {
410
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
411
+
412
+ var timer = try std.time.Timer.start();
413
+ try buf.drawTextBuffer(view, 0, 0);
414
+ stats.record(timer.read());
415
+
416
+ if (i == iterations - 1 and show_mem) {
417
+ final_buf_mem = @sizeOf(OptimizedBuffer) + (buf.width * buf.height * (@sizeOf(u32) + @sizeOf(@TypeOf(buf.buffer.fg[0])) * 2 + @sizeOf(u8)));
418
+ }
419
+ }
420
+
421
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
422
+ const mem_stat_slice = try allocator.alloc(MemStat, 1);
423
+ mem_stat_slice[0] = .{ .name = "Buf", .bytes = final_buf_mem };
424
+ break :blk mem_stat_slice;
425
+ } else null;
426
+
427
+ try results.append(allocator, BenchResult{
428
+ .name = name,
429
+ .min_ns = stats.min_ns,
430
+ .avg_ns = stats.avg(),
431
+ .max_ns = stats.max_ns,
432
+ .total_ns = stats.total_ns,
433
+ .iterations = iterations,
434
+ .mem_stats = mem_stats,
435
+ });
436
+
437
+ return try results.toOwnedSlice(allocator);
438
+ }
439
+
440
+ fn benchRenderMassiveResolution(
441
+ allocator: std.mem.Allocator,
442
+ pool: *gp.GraphemePool,
443
+ iterations: usize,
444
+ show_mem: bool,
445
+ bench_filter: ?[]const u8,
446
+ ) ![]BenchResult {
447
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
448
+ errdefer results.deinit(allocator);
449
+
450
+ const name = "400x200 render (10k lines, wrap=400)";
451
+ if (!bench_utils.matchesBenchFilter(name, bench_filter)) return try results.toOwnedSlice(allocator);
452
+
453
+ const text = try generateText(allocator, 10000, 200);
454
+ defer allocator.free(text);
455
+
456
+ const tb, const view = try setupTextBuffer(allocator, pool, text, 400);
457
+ defer tb.deinit();
458
+ defer view.deinit();
459
+
460
+ const buf = try OptimizedBuffer.init(allocator, 400, 200, .{ .pool = pool });
461
+ defer buf.deinit();
462
+
463
+ var stats = BenchStats{};
464
+ var final_buf_mem: usize = 0;
465
+
466
+ for (0..iterations) |i| {
467
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
468
+
469
+ var timer = try std.time.Timer.start();
470
+ try buf.drawTextBuffer(view, 0, 0);
471
+ stats.record(timer.read());
472
+
473
+ if (i == iterations - 1 and show_mem) {
474
+ final_buf_mem = @sizeOf(OptimizedBuffer) + (buf.width * buf.height * (@sizeOf(u32) + @sizeOf(@TypeOf(buf.buffer.fg[0])) * 2 + @sizeOf(u8)));
475
+ }
476
+ }
477
+
478
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
479
+ const mem_stat_slice = try allocator.alloc(MemStat, 1);
480
+ mem_stat_slice[0] = .{ .name = "Buf", .bytes = final_buf_mem };
481
+ break :blk mem_stat_slice;
482
+ } else null;
483
+
484
+ try results.append(allocator, BenchResult{
485
+ .name = name,
486
+ .min_ns = stats.min_ns,
487
+ .avg_ns = stats.avg(),
488
+ .max_ns = stats.max_ns,
489
+ .total_ns = stats.total_ns,
490
+ .iterations = iterations,
491
+ .mem_stats = mem_stats,
492
+ });
493
+
494
+ return try results.toOwnedSlice(allocator);
495
+ }
496
+
497
+ fn benchRenderMassiveLines(
498
+ allocator: std.mem.Allocator,
499
+ pool: *gp.GraphemePool,
500
+ iterations: usize,
501
+ show_mem: bool,
502
+ bench_filter: ?[]const u8,
503
+ ) ![]BenchResult {
504
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
505
+ errdefer results.deinit(allocator);
506
+
507
+ const name = "120x40 render (50k lines, viewport first 40)";
508
+ if (!bench_utils.matchesBenchFilter(name, bench_filter)) return try results.toOwnedSlice(allocator);
509
+
510
+ const text = try generateText(allocator, 50000, 60);
511
+ defer allocator.free(text);
512
+
513
+ const tb, const view = try setupTextBuffer(allocator, pool, text, null);
514
+ defer tb.deinit();
515
+ defer view.deinit();
516
+
517
+ const buf = try OptimizedBuffer.init(allocator, 120, 40, .{ .pool = pool });
518
+ defer buf.deinit();
519
+
520
+ var stats = BenchStats{};
521
+ var final_buf_mem: usize = 0;
522
+
523
+ for (0..iterations) |i| {
524
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
525
+
526
+ var timer = try std.time.Timer.start();
527
+ try buf.drawTextBuffer(view, 0, 0);
528
+ stats.record(timer.read());
529
+
530
+ if (i == iterations - 1 and show_mem) {
531
+ final_buf_mem = @sizeOf(OptimizedBuffer) + (buf.width * buf.height * (@sizeOf(u32) + @sizeOf(@TypeOf(buf.buffer.fg[0])) * 2 + @sizeOf(u8)));
532
+ }
533
+ }
534
+
535
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
536
+ const mem_stat_slice = try allocator.alloc(MemStat, 1);
537
+ mem_stat_slice[0] = .{ .name = "Buf", .bytes = final_buf_mem };
538
+ break :blk mem_stat_slice;
539
+ } else null;
540
+
541
+ try results.append(allocator, BenchResult{
542
+ .name = name,
543
+ .min_ns = stats.min_ns,
544
+ .avg_ns = stats.avg(),
545
+ .max_ns = stats.max_ns,
546
+ .total_ns = stats.total_ns,
547
+ .iterations = iterations,
548
+ .mem_stats = mem_stats,
549
+ });
550
+
551
+ return try results.toOwnedSlice(allocator);
552
+ }
553
+
554
+ fn benchRenderOneMassiveLine(
555
+ allocator: std.mem.Allocator,
556
+ pool: *gp.GraphemePool,
557
+ iterations: usize,
558
+ show_mem: bool,
559
+ bench_filter: ?[]const u8,
560
+ ) ![]BenchResult {
561
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
562
+ errdefer results.deinit(allocator);
563
+
564
+ const name = "80x30 render (1 massive line 500KB, wrap=80)";
565
+ if (!bench_utils.matchesBenchFilter(name, bench_filter)) return try results.toOwnedSlice(allocator);
566
+
567
+ var buf_builder: std.ArrayListUnmanaged(u8) = .{};
568
+ defer buf_builder.deinit(allocator);
569
+
570
+ for (0..100000) |_| {
571
+ try buf_builder.appendSlice(allocator, "word ");
572
+ }
573
+ const text = try buf_builder.toOwnedSlice(allocator);
574
+ defer allocator.free(text);
575
+
576
+ const tb, const view = try setupTextBuffer(allocator, pool, text, 80);
577
+ defer tb.deinit();
578
+ defer view.deinit();
579
+
580
+ const buf = try OptimizedBuffer.init(allocator, 80, 30, .{ .pool = pool });
581
+ defer buf.deinit();
582
+
583
+ var stats = BenchStats{};
584
+ var final_buf_mem: usize = 0;
585
+
586
+ for (0..iterations) |i| {
587
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
588
+
589
+ var timer = try std.time.Timer.start();
590
+ try buf.drawTextBuffer(view, 0, 0);
591
+ stats.record(timer.read());
592
+
593
+ if (i == iterations - 1 and show_mem) {
594
+ final_buf_mem = @sizeOf(OptimizedBuffer) + (buf.width * buf.height * (@sizeOf(u32) + @sizeOf(@TypeOf(buf.buffer.fg[0])) * 2 + @sizeOf(u8)));
595
+ }
596
+ }
597
+
598
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
599
+ const mem_stat_slice = try allocator.alloc(MemStat, 1);
600
+ mem_stat_slice[0] = .{ .name = "Buf", .bytes = final_buf_mem };
601
+ break :blk mem_stat_slice;
602
+ } else null;
603
+
604
+ try results.append(allocator, BenchResult{
605
+ .name = name,
606
+ .min_ns = stats.min_ns,
607
+ .avg_ns = stats.avg(),
608
+ .max_ns = stats.max_ns,
609
+ .total_ns = stats.total_ns,
610
+ .iterations = iterations,
611
+ .mem_stats = mem_stats,
612
+ });
613
+
614
+ return try results.toOwnedSlice(allocator);
615
+ }
616
+
617
+ fn benchRenderManySmallChunks(
618
+ allocator: std.mem.Allocator,
619
+ pool: *gp.GraphemePool,
620
+ iterations: usize,
621
+ show_mem: bool,
622
+ bench_filter: ?[]const u8,
623
+ ) ![]BenchResult {
624
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
625
+ errdefer results.deinit(allocator);
626
+
627
+ const name = "80x30 render (10k tiny chunks)";
628
+ if (!bench_utils.matchesBenchFilter(name, bench_filter)) return try results.toOwnedSlice(allocator);
629
+
630
+ const text = try generateManySmallChunks(allocator, 10000);
631
+ defer allocator.free(text);
632
+
633
+ const tb, const view = try setupTextBuffer(allocator, pool, text, 80);
634
+ defer tb.deinit();
635
+ defer view.deinit();
636
+
637
+ const buf = try OptimizedBuffer.init(allocator, 80, 30, .{ .pool = pool });
638
+ defer buf.deinit();
639
+
640
+ var stats = BenchStats{};
641
+ var final_buf_mem: usize = 0;
642
+
643
+ for (0..iterations) |i| {
644
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
645
+
646
+ var timer = try std.time.Timer.start();
647
+ try buf.drawTextBuffer(view, 0, 0);
648
+ stats.record(timer.read());
649
+
650
+ if (i == iterations - 1 and show_mem) {
651
+ final_buf_mem = @sizeOf(OptimizedBuffer) + (buf.width * buf.height * (@sizeOf(u32) + @sizeOf(@TypeOf(buf.buffer.fg[0])) * 2 + @sizeOf(u8)));
652
+ }
653
+ }
654
+
655
+ const mem_stats: ?[]const MemStat = if (show_mem) blk: {
656
+ const mem_stat_slice = try allocator.alloc(MemStat, 1);
657
+ mem_stat_slice[0] = .{ .name = "Buf", .bytes = final_buf_mem };
658
+ break :blk mem_stat_slice;
659
+ } else null;
660
+
661
+ try results.append(allocator, BenchResult{
662
+ .name = name,
663
+ .min_ns = stats.min_ns,
664
+ .avg_ns = stats.avg(),
665
+ .max_ns = stats.max_ns,
666
+ .total_ns = stats.total_ns,
667
+ .iterations = iterations,
668
+ .mem_stats = mem_stats,
669
+ });
670
+
671
+ return try results.toOwnedSlice(allocator);
672
+ }
673
+
674
+ fn benchRenderWithViewport(
675
+ allocator: std.mem.Allocator,
676
+ pool: *gp.GraphemePool,
677
+ iterations: usize,
678
+ show_mem: bool,
679
+ bench_filter: ?[]const u8,
680
+ ) ![]BenchResult {
681
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
682
+ errdefer results.deinit(allocator);
683
+ _ = show_mem;
684
+
685
+ const viewport_name = "100x30 render (10k lines, viewport at line 5000)";
686
+ const no_viewport_name = "100x30 render (10k lines, no viewport)";
687
+ const run_viewport = bench_utils.matchesBenchFilter(viewport_name, bench_filter);
688
+ const run_no_viewport = bench_utils.matchesBenchFilter(no_viewport_name, bench_filter);
689
+ if (!run_viewport and !run_no_viewport) return try results.toOwnedSlice(allocator);
690
+
691
+ const text = try generateText(allocator, 10000, 100);
692
+ defer allocator.free(text);
693
+
694
+ if (run_viewport) {
695
+ const tb, const view = try setupTextBuffer(allocator, pool, text, null);
696
+ defer tb.deinit();
697
+ defer view.deinit();
698
+
699
+ view.setViewport(.{ .x = 0, .y = 5000, .width = 100, .height = 30 });
700
+
701
+ const buf = try OptimizedBuffer.init(allocator, 100, 30, .{ .pool = pool });
702
+ defer buf.deinit();
703
+
704
+ var stats = BenchStats{};
705
+
706
+ for (0..iterations) |_| {
707
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
708
+
709
+ var timer = try std.time.Timer.start();
710
+ try buf.drawTextBuffer(view, 0, 0);
711
+ stats.record(timer.read());
712
+ }
713
+
714
+ try results.append(allocator, BenchResult{
715
+ .name = viewport_name,
716
+ .min_ns = stats.min_ns,
717
+ .avg_ns = stats.avg(),
718
+ .max_ns = stats.max_ns,
719
+ .total_ns = stats.total_ns,
720
+ .iterations = iterations,
721
+ .mem_stats = null,
722
+ });
723
+ }
724
+
725
+ if (run_no_viewport) {
726
+ const tb, const view = try setupTextBuffer(allocator, pool, text, null);
727
+ defer tb.deinit();
728
+ defer view.deinit();
729
+
730
+ const buf = try OptimizedBuffer.init(allocator, 100, 30, .{ .pool = pool });
731
+ defer buf.deinit();
732
+
733
+ var stats = BenchStats{};
734
+
735
+ for (0..iterations) |_| {
736
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
737
+
738
+ var timer = try std.time.Timer.start();
739
+ try buf.drawTextBuffer(view, 0, 0);
740
+ stats.record(timer.read());
741
+ }
742
+
743
+ try results.append(allocator, BenchResult{
744
+ .name = no_viewport_name,
745
+ .min_ns = stats.min_ns,
746
+ .avg_ns = stats.avg(),
747
+ .max_ns = stats.max_ns,
748
+ .total_ns = stats.total_ns,
749
+ .iterations = iterations,
750
+ .mem_stats = null,
751
+ });
752
+ }
753
+
754
+ return try results.toOwnedSlice(allocator);
755
+ }
756
+
757
+ fn benchRenderWithSelection(
758
+ allocator: std.mem.Allocator,
759
+ pool: *gp.GraphemePool,
760
+ iterations: usize,
761
+ show_mem: bool,
762
+ bench_filter: ?[]const u8,
763
+ ) ![]BenchResult {
764
+ var results: std.ArrayListUnmanaged(BenchResult) = .{};
765
+ errdefer results.deinit(allocator);
766
+ _ = show_mem;
767
+
768
+ const selection_name = "120x40 render (500 lines, with selection)";
769
+ const no_selection_name = "120x40 render (500 lines, no selection)";
770
+ const run_selection = bench_utils.matchesBenchFilter(selection_name, bench_filter);
771
+ const run_no_selection = bench_utils.matchesBenchFilter(no_selection_name, bench_filter);
772
+ if (!run_selection and !run_no_selection) return try results.toOwnedSlice(allocator);
773
+
774
+ const text = try generateText(allocator, 500, 100);
775
+ defer allocator.free(text);
776
+
777
+ if (run_selection) {
778
+ const tb, const view = try setupTextBuffer(allocator, pool, text, 120);
779
+ defer tb.deinit();
780
+ defer view.deinit();
781
+
782
+ view.setSelection(500, 1500, .{ 0.2, 0.4, 0.8, 1.0 }, .{ 1.0, 1.0, 1.0, 1.0 });
783
+
784
+ const buf = try OptimizedBuffer.init(allocator, 120, 40, .{ .pool = pool });
785
+ defer buf.deinit();
786
+
787
+ var stats = BenchStats{};
788
+
789
+ for (0..iterations) |_| {
790
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
791
+
792
+ var timer = try std.time.Timer.start();
793
+ try buf.drawTextBuffer(view, 0, 0);
794
+ stats.record(timer.read());
795
+ }
796
+
797
+ try results.append(allocator, BenchResult{
798
+ .name = selection_name,
799
+ .min_ns = stats.min_ns,
800
+ .avg_ns = stats.avg(),
801
+ .max_ns = stats.max_ns,
802
+ .total_ns = stats.total_ns,
803
+ .iterations = iterations,
804
+ .mem_stats = null,
805
+ });
806
+ }
807
+
808
+ if (run_no_selection) {
809
+ const tb, const view = try setupTextBuffer(allocator, pool, text, 120);
810
+ defer tb.deinit();
811
+ defer view.deinit();
812
+
813
+ const buf = try OptimizedBuffer.init(allocator, 120, 40, .{ .pool = pool });
814
+ defer buf.deinit();
815
+
816
+ var stats = BenchStats{};
817
+
818
+ for (0..iterations) |_| {
819
+ try buf.clear(.{ 0.0, 0.0, 0.0, 1.0 }, null);
820
+
821
+ var timer = try std.time.Timer.start();
822
+ try buf.drawTextBuffer(view, 0, 0);
823
+ stats.record(timer.read());
824
+ }
825
+
826
+ try results.append(allocator, BenchResult{
827
+ .name = no_selection_name,
828
+ .min_ns = stats.min_ns,
829
+ .avg_ns = stats.avg(),
830
+ .max_ns = stats.max_ns,
831
+ .total_ns = stats.total_ns,
832
+ .iterations = iterations,
833
+ .mem_stats = null,
834
+ });
835
+ }
836
+
837
+ return try results.toOwnedSlice(allocator);
838
+ }
839
+
840
+ pub fn run(
841
+ allocator: std.mem.Allocator,
842
+ show_mem: bool,
843
+ bench_filter: ?[]const u8,
844
+ ) ![]BenchResult {
845
+ // Global pool and unicode data are initialized once in bench.zig
846
+ const pool = gp.initGlobalPool(allocator);
847
+
848
+ var all_results: std.ArrayListUnmanaged(BenchResult) = .{};
849
+ errdefer all_results.deinit(allocator);
850
+
851
+ const iterations: usize = 10;
852
+
853
+ const cold_cache_results = try benchRenderColdCache(allocator, pool, iterations, show_mem, bench_filter);
854
+ try all_results.appendSlice(allocator, cold_cache_results);
855
+
856
+ const warm_cache_results = try benchRenderWarmCache(allocator, pool, iterations, show_mem, bench_filter);
857
+ try all_results.appendSlice(allocator, warm_cache_results);
858
+
859
+ const wrap_render_results = try benchWrapAndRender(allocator, pool, iterations, show_mem, bench_filter);
860
+ try all_results.appendSlice(allocator, wrap_render_results);
861
+
862
+ const small_res_results = try benchRenderSmallResolution(allocator, pool, iterations, show_mem, bench_filter);
863
+ try all_results.appendSlice(allocator, small_res_results);
864
+
865
+ const medium_res_results = try benchRenderMediumResolution(allocator, pool, iterations, show_mem, bench_filter);
866
+ try all_results.appendSlice(allocator, medium_res_results);
867
+
868
+ const massive_res_results = try benchRenderMassiveResolution(allocator, pool, iterations, show_mem, bench_filter);
869
+ try all_results.appendSlice(allocator, massive_res_results);
870
+
871
+ const massive_lines_results = try benchRenderMassiveLines(allocator, pool, iterations, show_mem, bench_filter);
872
+ try all_results.appendSlice(allocator, massive_lines_results);
873
+
874
+ const one_massive_line_results = try benchRenderOneMassiveLine(allocator, pool, iterations, show_mem, bench_filter);
875
+ try all_results.appendSlice(allocator, one_massive_line_results);
876
+
877
+ const many_chunks_results = try benchRenderManySmallChunks(allocator, pool, iterations, show_mem, bench_filter);
878
+ try all_results.appendSlice(allocator, many_chunks_results);
879
+
880
+ const viewport_results = try benchRenderWithViewport(allocator, pool, iterations, show_mem, bench_filter);
881
+ try all_results.appendSlice(allocator, viewport_results);
882
+
883
+ const selection_results = try benchRenderWithSelection(allocator, pool, iterations, show_mem, bench_filter);
884
+ try all_results.appendSlice(allocator, selection_results);
885
+
886
+ return try all_results.toOwnedSlice(allocator);
887
+ }