ruby2d 0.12.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +7 -0
  3. data/README.md +141 -0
  4. data/USAGE.md +2435 -0
  5. data/assets/Rakefile +637 -0
  6. data/assets/build_support/CMakeLists.txt +94 -0
  7. data/assets/build_support/mruby/build_config.rb +34 -0
  8. data/assets/build_support/mruby/build_config_wasm.rb +30 -0
  9. data/assets/build_support/sdl_test.c +174 -0
  10. data/assets/deps.yaml +16 -0
  11. data/assets/platform/include/SDL3/SDL.h +91 -0
  12. data/assets/platform/include/SDL3/SDL_assert.h +705 -0
  13. data/assets/platform/include/SDL3/SDL_asyncio.h +550 -0
  14. data/assets/platform/include/SDL3/SDL_atomic.h +692 -0
  15. data/assets/platform/include/SDL3/SDL_audio.h +2370 -0
  16. data/assets/platform/include/SDL3/SDL_begin_code.h +553 -0
  17. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_bits.h +47 -27
  18. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_blendmode.h +59 -55
  19. data/assets/platform/include/SDL3/SDL_camera.h +535 -0
  20. data/assets/platform/include/SDL3/SDL_clipboard.h +331 -0
  21. data/assets/{include/SDL2/close_code.h → platform/include/SDL3/SDL_close_code.h} +9 -8
  22. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_copying.h +3 -1
  23. data/assets/platform/include/SDL3/SDL_cpuinfo.h +374 -0
  24. data/assets/platform/include/SDL3/SDL_dialog.h +343 -0
  25. data/assets/platform/include/SDL3/SDL_dlopennote.h +234 -0
  26. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_egl.h +11 -8
  27. data/assets/platform/include/SDL3/SDL_endian.h +645 -0
  28. data/assets/platform/include/SDL3/SDL_error.h +226 -0
  29. data/assets/platform/include/SDL3/SDL_events.h +1645 -0
  30. data/assets/platform/include/SDL3/SDL_filesystem.h +537 -0
  31. data/assets/platform/include/SDL3/SDL_gamepad.h +1656 -0
  32. data/assets/platform/include/SDL3/SDL_gpu.h +4608 -0
  33. data/assets/platform/include/SDL3/SDL_guid.h +106 -0
  34. data/assets/platform/include/SDL3/SDL_haptic.h +1461 -0
  35. data/assets/platform/include/SDL3/SDL_hidapi.h +571 -0
  36. data/assets/platform/include/SDL3/SDL_hints.h +5001 -0
  37. data/assets/platform/include/SDL3/SDL_init.h +507 -0
  38. data/assets/platform/include/SDL3/SDL_intrin.h +410 -0
  39. data/assets/platform/include/SDL3/SDL_iostream.h +1379 -0
  40. data/assets/platform/include/SDL3/SDL_joystick.h +1385 -0
  41. data/assets/platform/include/SDL3/SDL_keyboard.h +608 -0
  42. data/assets/platform/include/SDL3/SDL_keycode.h +347 -0
  43. data/assets/platform/include/SDL3/SDL_loadso.h +145 -0
  44. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_locale.h +40 -24
  45. data/assets/platform/include/SDL3/SDL_log.h +541 -0
  46. data/assets/platform/include/SDL3/SDL_main.h +704 -0
  47. data/assets/platform/include/SDL3/SDL_main_impl.h +151 -0
  48. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_messagebox.h +85 -48
  49. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_metal.h +29 -29
  50. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_misc.h +13 -12
  51. data/assets/platform/include/SDL3/SDL_mouse.h +813 -0
  52. data/assets/platform/include/SDL3/SDL_mutex.h +1117 -0
  53. data/assets/platform/include/SDL3/SDL_oldnames.h +1339 -0
  54. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl.h +1247 -278
  55. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl_glext.h +5 -1
  56. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles.h +6 -7
  57. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2.h +10 -11
  58. data/assets/platform/include/SDL3/SDL_pen.h +198 -0
  59. data/assets/platform/include/SDL3/SDL_pixels.h +1441 -0
  60. data/assets/{include/SDL2/SDL_test_log.h → platform/include/SDL3/SDL_platform.h} +25 -26
  61. data/assets/platform/include/SDL3/SDL_platform_defines.h +497 -0
  62. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_power.h +40 -20
  63. data/assets/platform/include/SDL3/SDL_process.h +441 -0
  64. data/assets/platform/include/SDL3/SDL_properties.h +572 -0
  65. data/assets/platform/include/SDL3/SDL_rect.h +528 -0
  66. data/assets/platform/include/SDL3/SDL_render.h +3028 -0
  67. data/assets/platform/include/SDL3/SDL_revision.h +59 -0
  68. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_scancode.h +59 -68
  69. data/assets/platform/include/SDL3/SDL_sensor.h +321 -0
  70. data/assets/platform/include/SDL3/SDL_stdinc.h +6186 -0
  71. data/assets/platform/include/SDL3/SDL_storage.h +686 -0
  72. data/assets/platform/include/SDL3/SDL_surface.h +1769 -0
  73. data/assets/platform/include/SDL3/SDL_system.h +840 -0
  74. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test.h +16 -22
  75. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_assert.h +27 -34
  76. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_common.h +109 -52
  77. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_compare.h +22 -14
  78. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_crc32.h +27 -30
  79. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_font.h +50 -49
  80. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_fuzzer.h +64 -79
  81. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_harness.h +47 -30
  82. data/assets/platform/include/SDL3/SDL_test_log.h +83 -0
  83. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_md5.h +21 -28
  84. data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_memory.h +19 -16
  85. data/assets/platform/include/SDL3/SDL_thread.h +602 -0
  86. data/assets/platform/include/SDL3/SDL_time.h +249 -0
  87. data/assets/platform/include/SDL3/SDL_timer.h +454 -0
  88. data/assets/platform/include/SDL3/SDL_touch.h +184 -0
  89. data/assets/platform/include/SDL3/SDL_tray.h +544 -0
  90. data/assets/platform/include/SDL3/SDL_version.h +198 -0
  91. data/assets/platform/include/SDL3/SDL_video.h +3497 -0
  92. data/assets/platform/include/SDL3/SDL_vulkan.h +287 -0
  93. data/assets/platform/include/SDL3_image/SDL_image.h +3328 -0
  94. data/assets/platform/include/SDL3_mixer/SDL_mixer.h +3369 -0
  95. data/assets/platform/include/SDL3_ttf/SDL_textengine.h +181 -0
  96. data/assets/platform/include/SDL3_ttf/SDL_ttf.h +2833 -0
  97. data/assets/{include → platform/include}/mrbconf.h +42 -31
  98. data/assets/{include → platform/include}/mruby/array.h +3 -4
  99. data/assets/{include → platform/include}/mruby/boxing_nan.h +10 -0
  100. data/assets/platform/include/mruby/boxing_no.h +59 -0
  101. data/assets/{include → platform/include}/mruby/boxing_word.h +72 -26
  102. data/assets/platform/include/mruby/class.h +157 -0
  103. data/assets/{include → platform/include}/mruby/common.h +30 -1
  104. data/assets/{include → platform/include}/mruby/compile.h +52 -74
  105. data/assets/{include → platform/include}/mruby/data.h +2 -2
  106. data/assets/{include → platform/include}/mruby/debug.h +12 -5
  107. data/assets/{include → platform/include}/mruby/dump.h +7 -9
  108. data/assets/{include → platform/include}/mruby/endian.h +1 -1
  109. data/assets/platform/include/mruby/error.h +173 -0
  110. data/assets/platform/include/mruby/gc.h +79 -0
  111. data/assets/{include → platform/include}/mruby/hash.h +1 -7
  112. data/assets/platform/include/mruby/internal.h +282 -0
  113. data/assets/platform/include/mruby/irep.h +143 -0
  114. data/assets/{include → platform/include}/mruby/istruct.h +1 -1
  115. data/assets/platform/include/mruby/khash.h +455 -0
  116. data/assets/platform/include/mruby/mempool.h +19 -0
  117. data/assets/{include → platform/include}/mruby/numeric.h +7 -10
  118. data/assets/platform/include/mruby/object.h +51 -0
  119. data/assets/{include → platform/include}/mruby/opcode.h +5 -5
  120. data/assets/{include → platform/include}/mruby/ops.h +19 -6
  121. data/assets/platform/include/mruby/presym/id.h +1447 -0
  122. data/assets/{include → platform/include}/mruby/presym/scanning.h +10 -7
  123. data/assets/platform/include/mruby/presym/table.h +2893 -0
  124. data/assets/platform/include/mruby/presym.h +65 -0
  125. data/assets/platform/include/mruby/proc.h +184 -0
  126. data/assets/{include → platform/include}/mruby/range.h +0 -2
  127. data/assets/{include → platform/include}/mruby/string.h +33 -53
  128. data/assets/platform/include/mruby/throw.h +81 -0
  129. data/assets/{include → platform/include}/mruby/value.h +64 -29
  130. data/assets/{include → platform/include}/mruby/variable.h +6 -23
  131. data/assets/{include → platform/include}/mruby/version.h +7 -7
  132. data/assets/{include → platform/include}/mruby.h +238 -116
  133. data/assets/platform/macos-arm64/bin/mrbc +0 -0
  134. data/assets/platform/macos-arm64/lib/libSDL3.a +0 -0
  135. data/assets/platform/macos-arm64/lib/libSDL3_image.a +0 -0
  136. data/assets/platform/macos-arm64/lib/libSDL3_mixer.a +0 -0
  137. data/assets/platform/macos-arm64/lib/libSDL3_ttf.a +0 -0
  138. data/assets/platform/macos-arm64/lib/libmruby.a +0 -0
  139. data/assets/platform/wasm/lib/libFLAC.a +0 -0
  140. data/assets/platform/wasm/lib/libSDL3.a +0 -0
  141. data/assets/platform/wasm/lib/libSDL3_image.a +0 -0
  142. data/assets/platform/wasm/lib/libSDL3_mixer.a +0 -0
  143. data/assets/platform/wasm/lib/libSDL3_ttf.a +0 -0
  144. data/assets/platform/wasm/lib/libfreetype.a +0 -0
  145. data/assets/platform/wasm/lib/libharfbuzz.a +0 -0
  146. data/assets/platform/wasm/lib/libmruby.a +0 -0
  147. data/assets/platform/wasm/lib/libogg.a +0 -0
  148. data/assets/platform/wasm/lib/libplutosvg.a +0 -0
  149. data/assets/platform/wasm/lib/libplutovg.a +0 -0
  150. data/assets/platform/wasm/lib/libpng.a +0 -0
  151. data/assets/platform/wasm/lib/libpng16.a +0 -0
  152. data/assets/platform/wasm/lib/libvorbis.a +0 -0
  153. data/assets/platform/wasm/lib/libvorbisfile.a +0 -0
  154. data/assets/platform/wasm/lib/libzlibstatic.a +0 -0
  155. data/assets/platform/windows-arm64-mingw-ucrt/bin/mrbc.exe +0 -0
  156. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3.a +0 -0
  157. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_image.a +0 -0
  158. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
  159. data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
  160. data/assets/platform/windows-arm64-mingw-ucrt/lib/libmruby.a +0 -0
  161. data/assets/platform/windows-x86_64-mingw-ucrt/bin/mrbc.exe +0 -0
  162. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3.a +0 -0
  163. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_image.a +0 -0
  164. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
  165. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
  166. data/assets/platform/windows-x86_64-mingw-ucrt/lib/libmruby.a +0 -0
  167. data/assets/resources/fonts/outfit/OFL.txt +93 -0
  168. data/assets/resources/fonts/outfit/outfit.ttf +0 -0
  169. data/assets/resources/fonts/roboto_mono/OFL.txt +91 -0
  170. data/assets/resources/fonts/roboto_mono/roboto_mono.ttf +0 -0
  171. data/assets/resources/icons/icon.icns +0 -0
  172. data/assets/resources/icons/icon.png +0 -0
  173. data/assets/resources/spritesheets/License.txt +28 -0
  174. data/assets/resources/spritesheets/spritesheet-backgrounds.png +0 -0
  175. data/assets/resources/spritesheets/spritesheet-backgrounds.xml +16 -0
  176. data/assets/resources/spritesheets/spritesheet-characters.png +0 -0
  177. data/assets/resources/spritesheets/spritesheet-characters.xml +47 -0
  178. data/assets/resources/spritesheets/spritesheet-enemies.png +0 -0
  179. data/assets/resources/spritesheets/spritesheet-enemies.xml +62 -0
  180. data/assets/resources/spritesheets/spritesheet-tiles.png +0 -0
  181. data/assets/resources/spritesheets/spritesheet-tiles.xml +316 -0
  182. data/assets/{wasm → resources/web}/template.html +1 -1
  183. data/assets/target.rb +131 -0
  184. data/bin/ruby2d +281 -82
  185. data/examples/astar.rb +269 -0
  186. data/examples/asteroids.rb +403 -0
  187. data/examples/bezier_editor.rb +96 -0
  188. data/examples/boids.rb +191 -0
  189. data/examples/bouncing_balls.rb +119 -0
  190. data/examples/breakout.rb +186 -0
  191. data/examples/constellations.rb +100 -0
  192. data/examples/dashboard.rb +133 -0
  193. data/examples/double_pendulum.rb +254 -0
  194. data/examples/falling_sand.rb +291 -0
  195. data/examples/fireworks.rb +110 -0
  196. data/examples/fluid_dynamics.rb +340 -0
  197. data/examples/fourier_epicycles.rb +142 -0
  198. data/examples/fractal_tree.rb +326 -0
  199. data/examples/game_of_life.rb +148 -0
  200. data/examples/gamepads.rb +333 -0
  201. data/examples/hill_driver.rb +613 -0
  202. data/examples/logo_animation.rb +251 -0
  203. data/examples/lorenz_attractor.rb +115 -0
  204. data/examples/mandelbrot.rb +207 -0
  205. data/examples/marching_squares.rb +200 -0
  206. data/examples/maze.rb +323 -0
  207. data/examples/nbody.rb +338 -0
  208. data/examples/outrun.rb +391 -0
  209. data/examples/pixel_paint.rb +313 -0
  210. data/examples/platformer.rb +335 -0
  211. data/examples/ray_casting_maze.rb +175 -0
  212. data/examples/shadow_casting.rb +151 -0
  213. data/examples/shape_recognizer.rb +908 -0
  214. data/examples/snake.rb +144 -0
  215. data/examples/sprite_sheets.rb +246 -0
  216. data/examples/swarm.rb +206 -0
  217. data/examples/tsp_annealing.rb +104 -0
  218. data/examples/ui_controls.rb +163 -0
  219. data/examples/wireframe_3d.rb +139 -0
  220. data/ext/ruby2d/audio.c +324 -0
  221. data/ext/ruby2d/canvas.c +1715 -494
  222. data/ext/ruby2d/ext.c +541 -0
  223. data/ext/ruby2d/extconf.rb +122 -145
  224. data/ext/ruby2d/font.c +566 -20
  225. data/ext/ruby2d/fps.c +92 -0
  226. data/ext/ruby2d/image.c +466 -41
  227. data/ext/ruby2d/ruby2d.c +374 -1890
  228. data/ext/ruby2d/ruby2d.h +840 -460
  229. data/ext/ruby2d/shapes.c +931 -101
  230. data/ext/ruby2d/text.c +586 -21
  231. data/ext/ruby2d/window.c +1693 -283
  232. data/lib/ruby2d/atlas_parser.rb +194 -0
  233. data/lib/ruby2d/audio.rb +73 -0
  234. data/lib/ruby2d/benchmark.rb +259 -0
  235. data/lib/ruby2d/bitmap_text.rb +155 -0
  236. data/lib/ruby2d/button.rb +402 -0
  237. data/lib/ruby2d/canvas.rb +703 -279
  238. data/lib/ruby2d/circle.rb +206 -29
  239. data/lib/ruby2d/cli/browser.rb +314 -0
  240. data/lib/ruby2d/cli/build.rb +471 -257
  241. data/lib/ruby2d/cli/colorize.rb +7 -5
  242. data/lib/ruby2d/cli/examples.rb +127 -0
  243. data/lib/ruby2d/cli/launch.rb +24 -39
  244. data/lib/ruby2d/cli/lib_files.rb +48 -0
  245. data/lib/ruby2d/cli/messages.rb +40 -0
  246. data/lib/ruby2d/cli/setup.rb +273 -0
  247. data/lib/ruby2d/cli/static_server.rb +160 -0
  248. data/lib/ruby2d/cli/usage.rb +255 -0
  249. data/lib/ruby2d/color.rb +191 -69
  250. data/lib/ruby2d/core.rb +37 -19
  251. data/lib/ruby2d/deps_help.rb +89 -0
  252. data/lib/ruby2d/dsl.rb +51 -12
  253. data/lib/ruby2d/ellipse.rb +228 -0
  254. data/lib/ruby2d/exceptions.rb +0 -2
  255. data/lib/ruby2d/font.rb +34 -74
  256. data/lib/ruby2d/gamepad.rb +323 -0
  257. data/lib/ruby2d/gem_paths.rb +19 -0
  258. data/lib/ruby2d/image.rb +155 -52
  259. data/lib/ruby2d/interactive.rb +103 -0
  260. data/lib/ruby2d/json_parser.rb +268 -0
  261. data/lib/ruby2d/line.rb +194 -85
  262. data/lib/ruby2d/mruby_compat.rb +12 -0
  263. data/lib/ruby2d/polygon.rb +297 -0
  264. data/lib/ruby2d/polyline.rb +368 -0
  265. data/lib/ruby2d/quad.rb +358 -94
  266. data/lib/ruby2d/rectangle.rb +77 -19
  267. data/lib/ruby2d/renderable.rb +411 -11
  268. data/lib/ruby2d/sprite.rb +471 -180
  269. data/lib/ruby2d/sprite_sheet.rb +64 -0
  270. data/lib/ruby2d/square.rb +29 -17
  271. data/lib/ruby2d/text.rb +196 -65
  272. data/lib/ruby2d/tileset.rb +139 -81
  273. data/lib/ruby2d/triangle.rb +324 -89
  274. data/lib/ruby2d/version.rb +1 -3
  275. data/lib/ruby2d/vertices.rb +62 -85
  276. data/lib/ruby2d/warnings.rb +29 -0
  277. data/lib/ruby2d/window/class_methods.rb +218 -0
  278. data/lib/ruby2d/window/gamepad_events.rb +141 -0
  279. data/lib/ruby2d/window/key_events.rb +74 -0
  280. data/lib/ruby2d/window/mouse_events.rb +171 -0
  281. data/lib/ruby2d/window/object_events.rb +168 -0
  282. data/lib/ruby2d/window.rb +632 -585
  283. data/lib/ruby2d.rb +14 -19
  284. metadata +275 -428
  285. data/assets/app.icns +0 -0
  286. data/assets/include/GLES2/gl2.h +0 -656
  287. data/assets/include/GLES2/gl2ext.h +0 -3949
  288. data/assets/include/GLES2/gl2ext_angle.h +0 -701
  289. data/assets/include/GLES2/gl2platform.h +0 -27
  290. data/assets/include/GLES3/gl3.h +0 -1192
  291. data/assets/include/GLES3/gl31.h +0 -1507
  292. data/assets/include/GLES3/gl32.h +0 -1808
  293. data/assets/include/GLES3/gl3platform.h +0 -27
  294. data/assets/include/KHR/khrplatform.h +0 -290
  295. data/assets/include/SDL2/SDL.h +0 -233
  296. data/assets/include/SDL2/SDL_assert.h +0 -326
  297. data/assets/include/SDL2/SDL_atomic.h +0 -415
  298. data/assets/include/SDL2/SDL_audio.h +0 -1500
  299. data/assets/include/SDL2/SDL_clipboard.h +0 -141
  300. data/assets/include/SDL2/SDL_config.h +0 -61
  301. data/assets/include/SDL2/SDL_config_android.h +0 -194
  302. data/assets/include/SDL2/SDL_config_emscripten.h +0 -218
  303. data/assets/include/SDL2/SDL_config_iphoneos.h +0 -217
  304. data/assets/include/SDL2/SDL_config_macosx.h +0 -277
  305. data/assets/include/SDL2/SDL_config_minimal.h +0 -95
  306. data/assets/include/SDL2/SDL_config_ngage.h +0 -89
  307. data/assets/include/SDL2/SDL_config_os2.h +0 -207
  308. data/assets/include/SDL2/SDL_config_pandora.h +0 -141
  309. data/assets/include/SDL2/SDL_config_windows.h +0 -331
  310. data/assets/include/SDL2/SDL_config_wingdk.h +0 -253
  311. data/assets/include/SDL2/SDL_config_winrt.h +0 -220
  312. data/assets/include/SDL2/SDL_config_xbox.h +0 -235
  313. data/assets/include/SDL2/SDL_cpuinfo.h +0 -594
  314. data/assets/include/SDL2/SDL_endian.h +0 -348
  315. data/assets/include/SDL2/SDL_error.h +0 -163
  316. data/assets/include/SDL2/SDL_events.h +0 -1166
  317. data/assets/include/SDL2/SDL_filesystem.h +0 -149
  318. data/assets/include/SDL2/SDL_gamecontroller.h +0 -1074
  319. data/assets/include/SDL2/SDL_gesture.h +0 -117
  320. data/assets/include/SDL2/SDL_guid.h +0 -100
  321. data/assets/include/SDL2/SDL_haptic.h +0 -1341
  322. data/assets/include/SDL2/SDL_hidapi.h +0 -451
  323. data/assets/include/SDL2/SDL_hints.h +0 -2569
  324. data/assets/include/SDL2/SDL_image.h +0 -2173
  325. data/assets/include/SDL2/SDL_joystick.h +0 -1066
  326. data/assets/include/SDL2/SDL_keyboard.h +0 -353
  327. data/assets/include/SDL2/SDL_keycode.h +0 -358
  328. data/assets/include/SDL2/SDL_loadso.h +0 -115
  329. data/assets/include/SDL2/SDL_log.h +0 -404
  330. data/assets/include/SDL2/SDL_main.h +0 -275
  331. data/assets/include/SDL2/SDL_mixer.h +0 -2784
  332. data/assets/include/SDL2/SDL_mouse.h +0 -465
  333. data/assets/include/SDL2/SDL_mutex.h +0 -471
  334. data/assets/include/SDL2/SDL_name.h +0 -33
  335. data/assets/include/SDL2/SDL_pixels.h +0 -644
  336. data/assets/include/SDL2/SDL_platform.h +0 -261
  337. data/assets/include/SDL2/SDL_quit.h +0 -58
  338. data/assets/include/SDL2/SDL_rect.h +0 -376
  339. data/assets/include/SDL2/SDL_render.h +0 -1919
  340. data/assets/include/SDL2/SDL_revision.h +0 -6
  341. data/assets/include/SDL2/SDL_rwops.h +0 -841
  342. data/assets/include/SDL2/SDL_sensor.h +0 -322
  343. data/assets/include/SDL2/SDL_shape.h +0 -155
  344. data/assets/include/SDL2/SDL_stdinc.h +0 -830
  345. data/assets/include/SDL2/SDL_surface.h +0 -997
  346. data/assets/include/SDL2/SDL_system.h +0 -623
  347. data/assets/include/SDL2/SDL_syswm.h +0 -386
  348. data/assets/include/SDL2/SDL_test_images.h +0 -78
  349. data/assets/include/SDL2/SDL_test_random.h +0 -115
  350. data/assets/include/SDL2/SDL_thread.h +0 -464
  351. data/assets/include/SDL2/SDL_timer.h +0 -222
  352. data/assets/include/SDL2/SDL_touch.h +0 -150
  353. data/assets/include/SDL2/SDL_ttf.h +0 -2316
  354. data/assets/include/SDL2/SDL_types.h +0 -29
  355. data/assets/include/SDL2/SDL_version.h +0 -204
  356. data/assets/include/SDL2/SDL_video.h +0 -2150
  357. data/assets/include/SDL2/SDL_vulkan.h +0 -215
  358. data/assets/include/SDL2/begin_code.h +0 -187
  359. data/assets/include/mruby/boxing_no.h +0 -58
  360. data/assets/include/mruby/class.h +0 -108
  361. data/assets/include/mruby/error.h +0 -147
  362. data/assets/include/mruby/gc.h +0 -94
  363. data/assets/include/mruby/irep.h +0 -147
  364. data/assets/include/mruby/khash.h +0 -284
  365. data/assets/include/mruby/object.h +0 -43
  366. data/assets/include/mruby/presym/disable.h +0 -70
  367. data/assets/include/mruby/presym/enable.h +0 -37
  368. data/assets/include/mruby/presym.h +0 -40
  369. data/assets/include/mruby/proc.h +0 -211
  370. data/assets/include/mruby/throw.h +0 -66
  371. data/assets/macos/universal/bin/mrbc +0 -0
  372. data/assets/macos/universal/lib/libFLAC.a +0 -0
  373. data/assets/macos/universal/lib/libSDL2.a +0 -0
  374. data/assets/macos/universal/lib/libSDL2_image.a +0 -0
  375. data/assets/macos/universal/lib/libSDL2_mixer.a +0 -0
  376. data/assets/macos/universal/lib/libSDL2_ttf.a +0 -0
  377. data/assets/macos/universal/lib/libavif.a +0 -0
  378. data/assets/macos/universal/lib/libbrotlicommon-static.a +0 -0
  379. data/assets/macos/universal/lib/libbrotlidec-static.a +0 -0
  380. data/assets/macos/universal/lib/libfreetype.a +0 -0
  381. data/assets/macos/universal/lib/libgraphite2.a +0 -0
  382. data/assets/macos/universal/lib/libharfbuzz.a +0 -0
  383. data/assets/macos/universal/lib/libhwy.a +0 -0
  384. data/assets/macos/universal/lib/libjpeg.a +0 -0
  385. data/assets/macos/universal/lib/libjxl.a +0 -0
  386. data/assets/macos/universal/lib/libmodplug.a +0 -0
  387. data/assets/macos/universal/lib/libmpg123.a +0 -0
  388. data/assets/macos/universal/lib/libmruby.a +0 -0
  389. data/assets/macos/universal/lib/libogg.a +0 -0
  390. data/assets/macos/universal/lib/libpng.a +0 -0
  391. data/assets/macos/universal/lib/libtiff.a +0 -0
  392. data/assets/macos/universal/lib/libvorbis.a +0 -0
  393. data/assets/macos/universal/lib/libvorbisfile.a +0 -0
  394. data/assets/macos/universal/lib/libwebp.a +0 -0
  395. data/assets/macos/universal/lib/libzstd.a +0 -0
  396. data/assets/test_media/README.md +0 -3
  397. data/assets/test_media/bitstream_vera/COPYRIGHT.txt +0 -124
  398. data/assets/test_media/bitstream_vera/vera.ttf +0 -0
  399. data/assets/test_media/boom.png +0 -0
  400. data/assets/test_media/coin.png +0 -0
  401. data/assets/test_media/colors.png +0 -0
  402. data/assets/test_media/controller.png +0 -0
  403. data/assets/test_media/dial.wav +0 -0
  404. data/assets/test_media/hero.png +0 -0
  405. data/assets/test_media/image.bmp +0 -0
  406. data/assets/test_media/image.jpg +0 -0
  407. data/assets/test_media/image.png +0 -0
  408. data/assets/test_media/music.flac +0 -0
  409. data/assets/test_media/music.mp3 +0 -0
  410. data/assets/test_media/music.ogg +0 -0
  411. data/assets/test_media/music.wav +0 -0
  412. data/assets/test_media/originals/boom.pxm +0 -0
  413. data/assets/test_media/originals/coin.pxm +0 -0
  414. data/assets/test_media/originals/controller.sketch +0 -0
  415. data/assets/test_media/originals/hero.pxm +0 -0
  416. data/assets/test_media/originals/image.pxm +0 -0
  417. data/assets/test_media/originals/music.caf +0 -0
  418. data/assets/test_media/originals/texture_atlas.pxm +0 -0
  419. data/assets/test_media/rondo_alla_turka.ogg +0 -0
  420. data/assets/test_media/sound.flac +0 -0
  421. data/assets/test_media/sound.mp3 +0 -0
  422. data/assets/test_media/sound.ogg +0 -0
  423. data/assets/test_media/sound.wav +0 -0
  424. data/assets/test_media/sprite_sheet.png +0 -0
  425. data/assets/test_media/texture_atlas.png +0 -0
  426. data/assets/wasm/libmruby.a +0 -0
  427. data/assets/windows/mingw-w64-ucrt-x86_64/bin/mrbc.exe +0 -0
  428. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libFLAC.a +0 -0
  429. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libLerc.a +0 -0
  430. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2.a +0 -0
  431. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_image.a +0 -0
  432. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_mixer.a +0 -0
  433. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_ttf.a +0 -0
  434. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlicommon.a +0 -0
  435. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlidec.a +0 -0
  436. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbz2.a +0 -0
  437. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libdeflate.a +0 -0
  438. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libfreetype.a +0 -0
  439. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libglew32.a +0 -0
  440. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libgraphite2.a +0 -0
  441. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libharfbuzz.a +0 -0
  442. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libhwy.a +0 -0
  443. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjbig.a +0 -0
  444. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjpeg.a +0 -0
  445. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjxl.a +0 -0
  446. data/assets/windows/mingw-w64-ucrt-x86_64/lib/liblzma.a +0 -0
  447. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmodplug.a +0 -0
  448. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmpg123.a +0 -0
  449. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmruby.a +0 -0
  450. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libogg.a +0 -0
  451. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopus.a +0 -0
  452. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopusfile.a +0 -0
  453. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libpng.a +0 -0
  454. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libsndfile.a +0 -0
  455. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libssp.a +0 -1
  456. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libstdc++.a +0 -0
  457. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libtiff.a +0 -0
  458. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbis.a +0 -0
  459. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbisfile.a +0 -0
  460. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libwebp.a +0 -0
  461. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libz.a +0 -0
  462. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libzstd.a +0 -0
  463. data/assets/windows/mingw-w64-x86_64/bin/mrbc.exe +0 -0
  464. data/assets/windows/mingw-w64-x86_64/lib/libFLAC.a +0 -0
  465. data/assets/windows/mingw-w64-x86_64/lib/libLerc.a +0 -0
  466. data/assets/windows/mingw-w64-x86_64/lib/libSDL2.a +0 -0
  467. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_image.a +0 -0
  468. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_mixer.a +0 -0
  469. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_ttf.a +0 -0
  470. data/assets/windows/mingw-w64-x86_64/lib/libbrotlicommon.a +0 -0
  471. data/assets/windows/mingw-w64-x86_64/lib/libbrotlidec.a +0 -0
  472. data/assets/windows/mingw-w64-x86_64/lib/libbz2.a +0 -0
  473. data/assets/windows/mingw-w64-x86_64/lib/libdeflate.a +0 -0
  474. data/assets/windows/mingw-w64-x86_64/lib/libfreetype.a +0 -0
  475. data/assets/windows/mingw-w64-x86_64/lib/libglew32.a +0 -0
  476. data/assets/windows/mingw-w64-x86_64/lib/libgraphite2.a +0 -0
  477. data/assets/windows/mingw-w64-x86_64/lib/libharfbuzz.a +0 -0
  478. data/assets/windows/mingw-w64-x86_64/lib/libhwy.a +0 -0
  479. data/assets/windows/mingw-w64-x86_64/lib/libjbig.a +0 -0
  480. data/assets/windows/mingw-w64-x86_64/lib/libjpeg.a +0 -0
  481. data/assets/windows/mingw-w64-x86_64/lib/libjxl.a +0 -0
  482. data/assets/windows/mingw-w64-x86_64/lib/liblzma.a +0 -0
  483. data/assets/windows/mingw-w64-x86_64/lib/libmodplug.a +0 -0
  484. data/assets/windows/mingw-w64-x86_64/lib/libmpg123.a +0 -0
  485. data/assets/windows/mingw-w64-x86_64/lib/libmruby.a +0 -0
  486. data/assets/windows/mingw-w64-x86_64/lib/libogg.a +0 -0
  487. data/assets/windows/mingw-w64-x86_64/lib/libopus.a +0 -0
  488. data/assets/windows/mingw-w64-x86_64/lib/libopusfile.a +0 -0
  489. data/assets/windows/mingw-w64-x86_64/lib/libpng.a +0 -0
  490. data/assets/windows/mingw-w64-x86_64/lib/libsndfile.a +0 -0
  491. data/assets/windows/mingw-w64-x86_64/lib/libssp.a +0 -1
  492. data/assets/windows/mingw-w64-x86_64/lib/libstdc++.a +0 -0
  493. data/assets/windows/mingw-w64-x86_64/lib/libtiff.a +0 -0
  494. data/assets/windows/mingw-w64-x86_64/lib/libvorbis.a +0 -0
  495. data/assets/windows/mingw-w64-x86_64/lib/libvorbisfile.a +0 -0
  496. data/assets/windows/mingw-w64-x86_64/lib/libwebp.a +0 -0
  497. data/assets/windows/mingw-w64-x86_64/lib/libz.a +0 -0
  498. data/assets/windows/mingw-w64-x86_64/lib/libzstd.a +0 -0
  499. data/assets/xcode/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
  500. data/assets/xcode/ios/Assets.xcassets/Contents.json +0 -6
  501. data/assets/xcode/ios/Base.lproj/LaunchScreen.storyboard +0 -27
  502. data/assets/xcode/ios/Info.plist +0 -43
  503. data/assets/xcode/ios/MRuby.framework/Headers/mrbconf.h +0 -143
  504. data/assets/xcode/ios/MRuby.framework/Headers/mruby/array.h +0 -280
  505. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  506. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  507. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  508. data/assets/xcode/ios/MRuby.framework/Headers/mruby/class.h +0 -97
  509. data/assets/xcode/ios/MRuby.framework/Headers/mruby/common.h +0 -77
  510. data/assets/xcode/ios/MRuby.framework/Headers/mruby/compile.h +0 -195
  511. data/assets/xcode/ios/MRuby.framework/Headers/mruby/data.h +0 -75
  512. data/assets/xcode/ios/MRuby.framework/Headers/mruby/debug.h +0 -67
  513. data/assets/xcode/ios/MRuby.framework/Headers/mruby/dump.h +0 -196
  514. data/assets/xcode/ios/MRuby.framework/Headers/mruby/error.h +0 -75
  515. data/assets/xcode/ios/MRuby.framework/Headers/mruby/gc.h +0 -91
  516. data/assets/xcode/ios/MRuby.framework/Headers/mruby/hash.h +0 -215
  517. data/assets/xcode/ios/MRuby.framework/Headers/mruby/irep.h +0 -75
  518. data/assets/xcode/ios/MRuby.framework/Headers/mruby/istruct.h +0 -47
  519. data/assets/xcode/ios/MRuby.framework/Headers/mruby/khash.h +0 -274
  520. data/assets/xcode/ios/MRuby.framework/Headers/mruby/numeric.h +0 -161
  521. data/assets/xcode/ios/MRuby.framework/Headers/mruby/object.h +0 -44
  522. data/assets/xcode/ios/MRuby.framework/Headers/mruby/opcode.h +0 -69
  523. data/assets/xcode/ios/MRuby.framework/Headers/mruby/ops.h +0 -117
  524. data/assets/xcode/ios/MRuby.framework/Headers/mruby/proc.h +0 -131
  525. data/assets/xcode/ios/MRuby.framework/Headers/mruby/range.h +0 -49
  526. data/assets/xcode/ios/MRuby.framework/Headers/mruby/re.h +0 -16
  527. data/assets/xcode/ios/MRuby.framework/Headers/mruby/string.h +0 -444
  528. data/assets/xcode/ios/MRuby.framework/Headers/mruby/throw.h +0 -55
  529. data/assets/xcode/ios/MRuby.framework/Headers/mruby/value.h +0 -309
  530. data/assets/xcode/ios/MRuby.framework/Headers/mruby/variable.h +0 -136
  531. data/assets/xcode/ios/MRuby.framework/Headers/mruby/version.h +0 -110
  532. data/assets/xcode/ios/MRuby.framework/Headers/mruby.h +0 -1282
  533. data/assets/xcode/ios/MRuby.framework/Info.plist +0 -20
  534. data/assets/xcode/ios/MRuby.framework/MRuby +0 -0
  535. data/assets/xcode/ios/MyApp.xcodeproj/project.pbxproj +0 -368
  536. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  537. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  538. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  539. data/assets/xcode/ios/main.c +0 -1
  540. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  541. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json +0 -6
  542. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +0 -17
  543. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  544. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json +0 -6
  545. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  546. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  547. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  548. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json +0 -6
  549. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +0 -17
  550. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  551. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json +0 -6
  552. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  553. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  554. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +0 -32
  555. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +0 -16
  556. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +0 -16
  557. data/assets/xcode/tvos/Assets.xcassets/Contents.json +0 -6
  558. data/assets/xcode/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +0 -22
  559. data/assets/xcode/tvos/Info.plist +0 -30
  560. data/assets/xcode/tvos/MRuby.framework/Headers/mrbconf.h +0 -143
  561. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/array.h +0 -280
  562. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  563. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  564. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  565. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/class.h +0 -97
  566. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/common.h +0 -77
  567. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/compile.h +0 -195
  568. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/data.h +0 -75
  569. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/debug.h +0 -67
  570. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/dump.h +0 -196
  571. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/error.h +0 -75
  572. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/gc.h +0 -91
  573. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/hash.h +0 -215
  574. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/irep.h +0 -75
  575. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/istruct.h +0 -47
  576. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/khash.h +0 -274
  577. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/numeric.h +0 -161
  578. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/object.h +0 -44
  579. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/opcode.h +0 -69
  580. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/ops.h +0 -117
  581. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/proc.h +0 -131
  582. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/range.h +0 -49
  583. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/re.h +0 -16
  584. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/string.h +0 -444
  585. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/throw.h +0 -55
  586. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/value.h +0 -309
  587. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/variable.h +0 -136
  588. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/version.h +0 -110
  589. data/assets/xcode/tvos/MRuby.framework/Headers/mruby.h +0 -1282
  590. data/assets/xcode/tvos/MRuby.framework/Info.plist +0 -20
  591. data/assets/xcode/tvos/MRuby.framework/MRuby +0 -0
  592. data/assets/xcode/tvos/MyApp.xcodeproj/project.pbxproj +0 -350
  593. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  594. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  595. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  596. data/assets/xcode/tvos/main.c +0 -1
  597. data/ext/ruby2d/common.c +0 -185
  598. data/ext/ruby2d/controllers.c +0 -110
  599. data/ext/ruby2d/gl.c +0 -398
  600. data/ext/ruby2d/gl2.c +0 -86
  601. data/ext/ruby2d/gl3.c +0 -304
  602. data/ext/ruby2d/gles.c +0 -302
  603. data/ext/ruby2d/input.c +0 -48
  604. data/ext/ruby2d/music.c +0 -127
  605. data/ext/ruby2d/sound.c +0 -132
  606. data/lib/ruby2d/cli/console.rb +0 -65
  607. data/lib/ruby2d/cli/enable_console.rb +0 -7
  608. data/lib/ruby2d/cli/platform.rb +0 -17
  609. data/lib/ruby2d/music.rb +0 -77
  610. data/lib/ruby2d/pixel.rb +0 -18
  611. data/lib/ruby2d/pixmap.rb +0 -39
  612. data/lib/ruby2d/pixmap_atlas.rb +0 -56
  613. data/lib/ruby2d/sound.rb +0 -61
  614. data/lib/ruby2d/texture.rb +0 -38
  615. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2.h +0 -0
  616. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2ext.h +0 -0
  617. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2platform.h +0 -0
  618. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_khrplatform.h +0 -0
  619. /data/assets/{include → platform/include}/mruby/re.h +0 -0
data/lib/ruby2d/circle.rb CHANGED
@@ -1,58 +1,235 @@
1
- # frozen_string_literal: true
2
-
3
1
  # Ruby2D::Circle
4
2
 
5
3
  module Ruby2D
6
- #
7
- # Create a circle using +Circle.new+
8
- #
4
+ # A circle
9
5
  class Circle
10
6
  include Renderable
11
7
 
12
- attr_accessor :x, :y, :radius, :sectors
8
+ attr_accessor :radius, :sectors, :rotate, :fill, :stroke_width
9
+ attr_reader :x, :y, :stroke_color
10
+ alias_method :stroke_colour, :stroke_color
11
+
12
+ # Set the x position (the center). Pass a symbol (`:left`, `:center`,
13
+ # `:right`) to set alignment intent — resolved at draw time against the
14
+ # window, with the circle's bounding box hugging the chosen edge.
15
+ def x=(value)
16
+ return self.x_align = value if value.is_a?(Symbol)
17
+ @x_align = nil unless @_resolving_alignment
18
+ @x = value
19
+ end
20
+
21
+ # Set the y position (the center). Pass a symbol (`:top`, `:center`,
22
+ # `:bottom`) to set alignment intent.
23
+ def y=(value)
24
+ return self.y_align = value if value.is_a?(Symbol)
25
+ @y_align = nil unless @_resolving_alignment
26
+ @y = value
27
+ end
13
28
 
14
29
  # Create a circle
15
- #
16
- # @param [Numeric] x
17
- # @param [Numeric] y
18
- # @param [Numeric] z
19
- # @param [Numeric] radius
20
- # @param [Numeric] sectors Smoothness of the circle is better when more +sectors+ are used.
21
- # @param [String | Color] color Or +colour+
22
- # @param [Float] opacity
23
- def initialize(x: 25, y: 25, z: 0, radius: 50, sectors: 30,
24
- color: nil, colour: nil, opacity: nil)
30
+ def initialize(x: 0, y: 0, z: 0, radius: 50, sectors: 30,
31
+ rotate: 0, rx: nil, ry: nil,
32
+ color: nil, colour: nil, opacity: nil,
33
+ fill: true, stroke_width: 0, stroke_color: nil, stroke_colour: nil,
34
+ add: true, visible: true,
35
+ padding: nil, padding_top: nil, padding_right: nil,
36
+ padding_bottom: nil, padding_left: nil)
37
+ x, y = _extract_alignment(x, y)
38
+ _apply_padding(padding, padding_top, padding_right, padding_bottom, padding_left)
39
+ _validate_dimensions(radius: radius)
25
40
  @x = x
26
41
  @y = y
27
42
  @z = z
28
43
  @radius = radius
29
44
  @sectors = sectors
45
+ @rotate = rotate
46
+ @_user_rx = rx
47
+ @_user_ry = ry
30
48
  self.color = color || colour || 'white'
31
- self.color.opacity = opacity unless opacity.nil?
32
- add
49
+ self.opacity = opacity unless opacity.nil?
50
+ @fill = fill
51
+ @stroke_width = stroke_width
52
+ self.stroke_color = stroke_color || stroke_colour || (color || colour)
53
+ self.stroke_color.opacity = opacity unless opacity.nil?
54
+ @visible = visible
55
+ self.add if add
56
+ end
57
+
58
+ # Set the stroke color. Single-color only — a per-vertex array is rejected.
59
+ def stroke_color=(c)
60
+ resolved = c.nil? ? nil : Color.set(c)
61
+ if resolved.is_a?(Color::Set)
62
+ raise ArgumentError, "`#{self.class}` does not support per-vertex stroke colors; pass a single color"
63
+ end
64
+
65
+ @stroke_color = resolved || Color.new('white')
66
+ @_stroke_cc = nil
67
+ end
68
+ alias_method :stroke_colour=, :stroke_color=
69
+
70
+ # Get the rotation center x coordinate
71
+ def rx
72
+ @_user_rx.nil? ? @x : @_user_rx
73
+ end
74
+
75
+ # Get the rotation center y coordinate
76
+ def ry
77
+ @_user_ry.nil? ? @y : @_user_ry
78
+ end
79
+
80
+ # Set the rotation center x coordinate
81
+ def rx=(val)
82
+ @_user_rx = val
83
+ end
84
+
85
+ # Set the rotation center y coordinate
86
+ def ry=(val)
87
+ @_user_ry = val
88
+ end
89
+
90
+ # Bounding-box width and height (the diameter)
91
+ def width
92
+ @radius * 2
93
+ end
94
+
95
+ def height
96
+ @radius * 2
33
97
  end
34
98
 
35
- # Check if the circle contains the point at +(x, y)+
99
+ # Set the color value. Single-color only a per-vertex color array is
100
+ # rejected with a clear message rather than a generic "not a valid color".
101
+ def color=(color)
102
+ c = Color.set(color)
103
+ if c.is_a?(Color::Set)
104
+ raise ArgumentError, "`#{self.class}` does not support per-vertex colors; pass a single color"
105
+ end
106
+
107
+ @color = c
108
+ @_cc = nil # invalidate cached color components
109
+ end
110
+
111
+ # Check if the circle contains the given point. Compares squared distance
112
+ # to squared radius to skip the square root on this per-event hit path. A
113
+ # negative radius (reachable via the unguarded runtime setter) contains
114
+ # nothing, matching the old `sqrt(...) <= @radius` behavior the squared form
115
+ # would otherwise lose.
36
116
  def contains?(x, y)
37
- Math.sqrt((x - @x)**2 + (y - @y)**2) <= @radius
117
+ return false if @radius.negative?
118
+ x, y = _unrotate(x, y) if @rotate != 0
119
+ dx = x - @x
120
+ dy = y - @y
121
+ dx * dx + dy * dy <= @radius * @radius
38
122
  end
39
123
 
40
- def self.draw(opts = {})
124
+ # Render a circle without creating an instance
125
+ def self.render(x: 0, y: 0, radius: 50, sectors: 30, rotate: 0,
126
+ rx: nil, ry: nil, color: nil, colour: nil, opacity: nil,
127
+ fill: true, stroke_width: 0, stroke_color: nil, stroke_colour: nil)
128
+ fill_input = color || colour
129
+ explicit_stroke = stroke_color || stroke_colour
130
+ stroke_input = explicit_stroke || fill_input
131
+ # Reject a per-vertex stroke color, matching the instance setter — circles
132
+ # have a single stroke color. Only check when the stroke is drawn or an
133
+ # explicit stroke color was given, so an invalid one still raises.
134
+ if (stroke_width > 0 || !explicit_stroke.nil?) && !stroke_input.nil? &&
135
+ Color.set(stroke_input).is_a?(Color::Set)
136
+ raise ArgumentError, "`#{self}` does not support per-vertex stroke colors; pass a single color"
137
+ end
138
+
41
139
  Window.render_ready_check
140
+ # Resolve the fill color once (as Quad#draw_immediate does). The common
141
+ # case — a single Color with scalar opacity — reads the resolved
142
+ # channels directly; only a `Color::Set` or per-vertex opacity array
143
+ # pays for the flattened array (and gets the arity errors it raises).
144
+ # `for_render` returns a shared cached instance — read-only here.
145
+ resolved = Color.for_render(fill_input.nil? ? 'white' : fill_input)
146
+ uniform = !resolved.is_a?(Color::Set) && !opacity.is_a?(Array)
147
+ c = uniform ? nil : Renderable.flatten_resolved_color(resolved, 1, opacity, label: self)
42
148
 
43
- ext_draw([
44
- opts[:x], opts[:y], opts[:radius], opts[:sectors],
45
- opts[:color][0], opts[:color][1], opts[:color][2], opts[:color][3]
46
- ])
149
+ if rotate != 0
150
+ cx = rx || x
151
+ cy = ry || y
152
+ rad = rotate * Math::PI / 180.0
153
+ sa = Math.sin(rad); ca = Math.cos(rad)
154
+ dx = x - cx; dy = y - cy
155
+ x = dx * ca - dy * sa + cx
156
+ y = dx * sa + dy * ca + cy
157
+ end
158
+
159
+ if fill
160
+ if uniform
161
+ Ext.draw_circle(x, y, radius, sectors,
162
+ resolved.r, resolved.g, resolved.b, opacity || resolved.a)
163
+ else
164
+ Ext.draw_circle(x, y, radius, sectors, c[0], c[1], c[2], c[3])
165
+ end
166
+ end
167
+ # Resolve the stroke color only when actually stroking.
168
+ if stroke_width > 0
169
+ sc = Renderable.resolve_single_color(stroke_input) || Color.new('white')
170
+ sc = Color.new(sc)
171
+ sc.opacity = opacity if opacity
172
+ Ext.stroke_circle(x, y, radius, sectors, stroke_width, sc.r, sc.g, sc.b, sc.a)
173
+ end
47
174
  end
48
175
 
49
176
  private
50
177
 
178
+ # Circle is center-anchored, so shift the alignment resolver's bounding-box
179
+ # top-left result by the radius to land on the center.
180
+ def _alignment_anchor_dx
181
+ @radius
182
+ end
183
+
184
+ def _alignment_anchor_dy
185
+ @radius
186
+ end
187
+
51
188
  def render
52
- self.class.ext_draw([
53
- @x, @y, @radius, @sectors,
54
- @color.r, @color.g, @color.b, @color.a
55
- ])
189
+ _resolve_alignment
190
+ ensure_cc
191
+ ensure_scc if @stroke_width && @stroke_width > 0
192
+
193
+ x = @x; y = @y
194
+
195
+ if @rotate != 0
196
+ cx = rx; cy = ry
197
+ rad = @rotate * Math::PI / 180.0
198
+ sa = Math.sin(rad); ca = Math.cos(rad)
199
+ dx = x - cx; dy = y - cy
200
+ x = dx * ca - dy * sa + cx
201
+ y = dx * sa + dy * ca + cy
202
+ end
203
+
204
+ if @fill
205
+ cc = @_cc
206
+ Ext.draw_circle(x, y, @radius, @sectors, cc[0], cc[1], cc[2], cc[3])
207
+ end
208
+
209
+ if @stroke_width && @stroke_width > 0
210
+ scc = @_stroke_cc
211
+ Ext.stroke_circle(x, y, @radius, @sectors, @stroke_width, scc[0], scc[1], scc[2], scc[3])
212
+ end
213
+ end
214
+
215
+ # Scene-graph draw hook (see Renderable#_render_scene). Circle's `render` is
216
+ # already zero-arg, so the hook is the same method under the scene name.
217
+ alias_method :_render_scene, :render
218
+ public :_render_scene
219
+
220
+ # Build/rebuild flat color cache for the native extension
221
+ def ensure_cc
222
+ if @_cc.nil? || @_cc[0] != @color.r || @_cc[1] != @color.g || @_cc[2] != @color.b || @_cc[3] != @color.a
223
+ @_cc = [@color.r, @color.g, @color.b, @color.a]
224
+ end
225
+ end
226
+
227
+ # Build/rebuild flat stroke color cache for the native extension
228
+ def ensure_scc
229
+ c = @stroke_color
230
+ if @_stroke_cc.nil? || @_stroke_cc[0] != c.r || @_stroke_cc[1] != c.g || @_stroke_cc[2] != c.b || @_stroke_cc[3] != c.a
231
+ @_stroke_cc = [c.r, c.g, c.b, c.a]
232
+ end
56
233
  end
57
234
  end
58
235
  end
@@ -0,0 +1,314 @@
1
+ require 'io/console'
2
+ require_relative 'colorize'
3
+
4
+ module Ruby2D
5
+ module CLI
6
+ # Generic interactive arrow-key TUI for browsing a list of items. Used by
7
+ # both `ruby2d examples` and `ruby2d usage`. Items are hashes with at least
8
+ # `:title` (shown in the list) and `:description` (shown beneath the list).
9
+ module Browser
10
+
11
+ RED = "\e[38;2;246;60;56m"
12
+ RESET = "\e[0m"
13
+ BOLD = "\e[1m"
14
+ DIM = "\e[2m"
15
+
16
+ # Native-Windows Ruby (RubyInstaller) needs its own input handling: on some
17
+ # builds `IO.console.raw` doesn't drop line/echo input, and even in raw
18
+ # mode the console won't emit arrow keys as bytes unless virtual-terminal
19
+ # input is on. `WinConsole` sets both directly; `read_key` then parses the
20
+ # `\e[A`-style sequences that result. POSIX terminals are untouched.
21
+ WINDOWS = Gem.win_platform?
22
+
23
+ # Drives the Win32 console input mode through `SetConsoleMode`, because
24
+ # native-Windows Ruby's `io/console` `raw` is unreliable here (confirmed on
25
+ # `aarch64-mingw-ucrt`: `raw` left LINE/ECHO input enabled). Enabling
26
+ # `VIRTUAL_TERMINAL_INPUT` is what makes arrow keys arrive as `\e[A`
27
+ # sequences instead of being swallowed. All Fiddle use is lazy and
28
+ # failure-tolerant: any problem returns nil and the caller falls back to
29
+ # the plain `io/console` path.
30
+ module WinConsole
31
+ STD_INPUT_HANDLE = -10
32
+ PROCESSED_INPUT = 0x0001
33
+ LINE_INPUT = 0x0002
34
+ ECHO_INPUT = 0x0004
35
+ VT_INPUT = 0x0200
36
+
37
+ # Lazily resolve the three kernel32 calls we need; memoize the result
38
+ # (nil if Fiddle or the console API is unavailable).
39
+ def self.api
40
+ unless @resolved
41
+ @resolved = true
42
+ @api =
43
+ begin
44
+ require 'fiddle'
45
+ k32 = Fiddle.dlopen('kernel32')
46
+ {
47
+ get_handle: Fiddle::Function.new(k32['GetStdHandle'], [Fiddle::TYPE_LONG], Fiddle::TYPE_VOIDP),
48
+ get_mode: Fiddle::Function.new(k32['GetConsoleMode'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT),
49
+ set_mode: Fiddle::Function.new(k32['SetConsoleMode'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG], Fiddle::TYPE_INT)
50
+ }
51
+ rescue LoadError, StandardError
52
+ nil
53
+ end
54
+ end
55
+ @api
56
+ end
57
+
58
+ # Switch the console to raw + virtual-terminal input. Returns the prior
59
+ # mode (to hand back to `restore`), or nil when there's no console to set
60
+ # (Fiddle missing, stdin redirected, `GetConsoleMode` failed).
61
+ def self.enable_raw
62
+ fns = api or return nil
63
+ handle = fns[:get_handle].call(STD_INPUT_HANDLE)
64
+ buf = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT, Fiddle::RUBY_FREE)
65
+ return nil if fns[:get_mode].call(handle, buf) == 0
66
+ prev = buf[0, Fiddle::SIZEOF_INT].unpack1('L')
67
+ fns[:set_mode].call(handle, (prev & ~(LINE_INPUT | ECHO_INPUT | PROCESSED_INPUT)) | VT_INPUT)
68
+ prev
69
+ end
70
+
71
+ # Re-apply raw + VT without disturbing the saved prior mode — used after
72
+ # a child example returns, in case it left the shared console mode
73
+ # changed.
74
+ def self.reassert_raw
75
+ enable_raw
76
+ end
77
+
78
+ def self.restore(prev)
79
+ return if prev.nil?
80
+ fns = api or return
81
+ fns[:set_mode].call(fns[:get_handle].call(STD_INPUT_HANDLE), prev)
82
+ end
83
+ end
84
+
85
+ # Run the interactive browser.
86
+ # list array of item hashes with :title and :description
87
+ # label header label, e.g. 'Examples' or 'Usage Guide'
88
+ # footer_action verb after 'Enter to', e.g. 'run' or 'view'
89
+ # fallback called when there is no usable TTY
90
+ # block invoked with the selected item when Enter is pressed
91
+ def self.run(list:, label:, footer_action:, fallback: nil, &on_select)
92
+ return if list.empty?
93
+
94
+ unless $stdout.tty? && IO.console
95
+ fallback&.call
96
+ return
97
+ end
98
+
99
+ selected = 0
100
+ prev_mode = nil
101
+ begin
102
+ enter_alt_screen
103
+ # On Windows, take over the console mode ourselves; `managed` is true
104
+ # only when that succeeded (otherwise fall back to `io/console` raw).
105
+ prev_mode = WinConsole.enable_raw if WINDOWS
106
+ managed = !prev_mode.nil?
107
+ # Managed mode reads IO.console directly; binmode stops Windows CRLF
108
+ # read-translation from stalling Enter (it holds the CR of CR+LF
109
+ # waiting to see whether an LF follows).
110
+ IO.console.binmode if managed
111
+ loop do
112
+ render(list, selected, label, footer_action)
113
+ case read_key(managed)
114
+ when :up then selected = (selected - 1) % list.length
115
+ when :down then selected = (selected + 1) % list.length
116
+ when :pgup then selected = [selected - 10, 0].max
117
+ when :pgdn then selected = [selected + 10, list.length - 1].min
118
+ when :home then selected = 0
119
+ when :last then selected = list.length - 1
120
+ when :enter
121
+ print "\e[2J\e[H\e[?25h\e[?1000l\e[?1006l"
122
+ on_select.call(list[selected])
123
+ # The example shared this console; re-assert our mode and drop
124
+ # anything typed while it ran so stray keys (e.g. a queued Enter)
125
+ # don't fire actions back in the picker.
126
+ WinConsole.reassert_raw if managed
127
+ IO.console.iflush if IO.console.respond_to?(:iflush)
128
+ print "\e[?25l\e[?1000h\e[?1006h"
129
+ when :quit
130
+ break
131
+ end
132
+ end
133
+ ensure
134
+ WinConsole.restore(prev_mode) if WINDOWS
135
+ leave_alt_screen
136
+ end
137
+ end
138
+
139
+ # Enabling mouse-event reporting (1000 + 1006/SGR) stops most terminals
140
+ # from translating the scroll wheel into arrow keys while the alt screen
141
+ # is active. Mouse sequences are ignored in `read_key`.
142
+ def self.enter_alt_screen
143
+ print "\e[?1049h\e[?25l\e[?1000h\e[?1006h"
144
+ end
145
+
146
+ def self.leave_alt_screen
147
+ print "\e[?1006l\e[?1000l\e[?1049l\e[?25h"
148
+ end
149
+
150
+ # Block for one keypress and map it to an action.
151
+ # `managed` is true when `WinConsole` already put the console in raw + VT
152
+ # input mode, so we read `IO.console` directly. Otherwise (POSIX, or
153
+ # Windows without a settable console) we go through `io/console`'s `raw`.
154
+ def self.read_key(managed = false)
155
+ if managed
156
+ read_console(IO.console)
157
+ else
158
+ IO.console.raw { |io| read_console(io) }
159
+ end
160
+ end
161
+
162
+ # Classify one keypress from an already-raw stream. Windows and POSIX share
163
+ # the single-byte keys and diverge only on how escape sequences are read:
164
+ # POSIX's `read_escape_sequence` uses `IO.select`/`read_nonblock` (fine on
165
+ # a pty), which native-Windows Ruby can't use on a console handle.
166
+ def self.read_console(io)
167
+ c = io.getc
168
+ if c.nil? then :quit
169
+ elsif WINDOWS && c == "\n" then nil # LF half of CR+LF; the CR already fired :enter
170
+ elsif (action = classify_char(c)) then action
171
+ elsif WINDOWS && (c == "\x00" || c == "\xE0") then classify_scancode(io.getc)
172
+ elsif c == "\e"
173
+ classify_escape(WINDOWS ? read_escape_windows(io) : read_escape_sequence(io))
174
+ end
175
+ end
176
+
177
+ # Single-byte keys, identical on every platform.
178
+ def self.classify_char(c)
179
+ case c
180
+ when "\r", "\n" then :enter
181
+ when 'q', 'Q', "\x03", "\x04" then :quit
182
+ when 'k' then :up
183
+ when 'j' then :down
184
+ when 'g' then :home
185
+ when 'G' then :last
186
+ end
187
+ end
188
+
189
+ # Legacy (non-VT) Windows consoles report arrows and navigation keys as two
190
+ # bytes: a `\x00` or `\xE0` prefix, consumed by `read_console`, then the
191
+ # scan code mapped here. With `VIRTUAL_TERMINAL_INPUT` on they arrive as
192
+ # `\e[A` sequences instead, but this keeps the fallback working too.
193
+ # (Left/Right are unused and fall through.)
194
+ def self.classify_scancode(c)
195
+ case c
196
+ when 'H' then :up # 0x48
197
+ when 'P' then :down # 0x50
198
+ when 'I' then :pgup # 0x49
199
+ when 'Q' then :pgdn # 0x51
200
+ when 'G' then :home # 0x47
201
+ when 'O' then :last # 0x4F (End)
202
+ end
203
+ end
204
+
205
+ # Read a CSI/SS3 escape sequence on Windows without `IO.select` or
206
+ # `read_nonblock` (unsupported on a console handle). An arrow key's whole
207
+ # sequence lands in the input buffer at once, so a blocking `getc` returns
208
+ # each following byte right away. A lone ESC has no follow-on byte and
209
+ # would block here, so on Windows we quit with `q`, not ESC. If the byte
210
+ # after ESC isn't a CSI/SS3 introducer we stop at once, swallowing nothing
211
+ # extra.
212
+ def self.read_escape_windows(io)
213
+ seq = io.getc.to_s
214
+ return seq unless seq == '[' || seq == 'O'
215
+ 14.times do
216
+ c = io.getc
217
+ break if c.nil?
218
+ seq << c
219
+ break if c.match?(/[A-Za-z~]/)
220
+ end
221
+ seq
222
+ end
223
+
224
+ # Read one CSI/SS3 escape sequence after the leading ESC. Waits briefly
225
+ # for each byte so chunked delivery doesn't cut us short, and stops at
226
+ # the first byte in the CSI final-byte range (0x40-0x7E).
227
+ def self.read_escape_sequence(io)
228
+ seq = ''
229
+ 32.times do
230
+ break unless IO.select([io], nil, nil, 0.01)
231
+ c = io.read_nonblock(1, exception: false)
232
+ break if c.nil? || c == :wait_readable
233
+ seq << c
234
+ break if seq.length >= 2 && c.match?(/[A-Za-z~]/)
235
+ end
236
+ seq
237
+ end
238
+
239
+ def self.classify_escape(seq)
240
+ return nil if seq.start_with?('[<') && seq.end_with?('M', 'm') # SGR mouse
241
+ return nil if seq.start_with?('[M') # X10 mouse
242
+ case seq
243
+ when '' then :quit # bare ESC
244
+ when '[A', 'OA' then :up
245
+ when '[B', 'OB' then :down
246
+ when '[H', '[1~', '[7~', 'OH' then :home
247
+ when '[F', '[4~', '[8~', 'OF' then :last
248
+ when '[5~' then :pgup
249
+ when '[6~' then :pgdn
250
+ end
251
+ end
252
+
253
+ def self.wrap(text, width)
254
+ return [] if text.nil? || text.empty? || width <= 0
255
+ lines = []
256
+ current = ''
257
+ text.split(' ').each do |word|
258
+ if current.empty?
259
+ current = word
260
+ elsif current.length + 1 + word.length <= width
261
+ current << ' ' << word
262
+ else
263
+ lines << current
264
+ current = word
265
+ end
266
+ end
267
+ lines << current unless current.empty?
268
+ lines
269
+ end
270
+
271
+ def self.render(list, selected, label, footer_action)
272
+ rows, cols = IO.console.winsize
273
+ rows = 24 if rows.nil? || rows < 10
274
+ cols = 80 if cols.nil? || cols < 40
275
+
276
+ print "\e[2J\e[H"
277
+
278
+ title = " #{'Ruby 2D'.ruby2d_red.bold} — #{label} #{"(#{selected + 1}/#{list.length})".dim}"
279
+ footer = " #{"↑/↓ navigate · Enter to #{footer_action} · q to quit".dim}"
280
+ desc_height = 3
281
+ desc_lines = wrap(list[selected][:description], cols - 4)[0, desc_height]
282
+
283
+ # 1 (blank) + title + 1 + viewport + 1 + desc_height + 1 + footer = rows
284
+ viewport = rows - (5 + desc_height)
285
+ viewport = [viewport, 5].max
286
+ viewport = [viewport, list.length].min
287
+
288
+ start = [selected - viewport / 2, 0].max
289
+ start = [start, list.length - viewport].min
290
+ start = 0 if start.negative?
291
+
292
+ width = list.length.to_s.length
293
+
294
+ puts
295
+ puts title
296
+ puts
297
+ viewport.times do |i|
298
+ idx = start + i
299
+ item = list[idx]
300
+ num = (idx + 1).to_s.rjust(width)
301
+ if idx == selected
302
+ puts " #{RED}◆ #{BOLD}#{num}#{RESET} #{RED}#{BOLD}#{item[:title]}#{RESET}"
303
+ else
304
+ puts " #{DIM}#{num}#{RESET} #{item[:title]}"
305
+ end
306
+ end
307
+ puts
308
+ desc_height.times { |i| puts " #{DIM}#{desc_lines[i] || ''}#{RESET}" }
309
+ puts
310
+ print footer
311
+ end
312
+ end
313
+ end
314
+ end