ruby2d 0.12.1 → 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 (620) 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 -443
  285. data/assets/app.icns +0 -0
  286. data/assets/include/GL/glew.h +0 -26427
  287. data/assets/include/GLES2/gl2.h +0 -656
  288. data/assets/include/GLES2/gl2ext.h +0 -3949
  289. data/assets/include/GLES2/gl2ext_angle.h +0 -701
  290. data/assets/include/GLES2/gl2platform.h +0 -27
  291. data/assets/include/GLES3/gl3.h +0 -1192
  292. data/assets/include/GLES3/gl31.h +0 -1507
  293. data/assets/include/GLES3/gl32.h +0 -1808
  294. data/assets/include/GLES3/gl3platform.h +0 -27
  295. data/assets/include/KHR/khrplatform.h +0 -290
  296. data/assets/include/SDL2/SDL.h +0 -233
  297. data/assets/include/SDL2/SDL_assert.h +0 -326
  298. data/assets/include/SDL2/SDL_atomic.h +0 -415
  299. data/assets/include/SDL2/SDL_audio.h +0 -1500
  300. data/assets/include/SDL2/SDL_clipboard.h +0 -141
  301. data/assets/include/SDL2/SDL_config.h +0 -61
  302. data/assets/include/SDL2/SDL_config_android.h +0 -194
  303. data/assets/include/SDL2/SDL_config_emscripten.h +0 -218
  304. data/assets/include/SDL2/SDL_config_iphoneos.h +0 -217
  305. data/assets/include/SDL2/SDL_config_macosx.h +0 -277
  306. data/assets/include/SDL2/SDL_config_minimal.h +0 -95
  307. data/assets/include/SDL2/SDL_config_ngage.h +0 -89
  308. data/assets/include/SDL2/SDL_config_os2.h +0 -207
  309. data/assets/include/SDL2/SDL_config_pandora.h +0 -141
  310. data/assets/include/SDL2/SDL_config_windows.h +0 -331
  311. data/assets/include/SDL2/SDL_config_wingdk.h +0 -253
  312. data/assets/include/SDL2/SDL_config_winrt.h +0 -220
  313. data/assets/include/SDL2/SDL_config_xbox.h +0 -235
  314. data/assets/include/SDL2/SDL_cpuinfo.h +0 -594
  315. data/assets/include/SDL2/SDL_endian.h +0 -348
  316. data/assets/include/SDL2/SDL_error.h +0 -163
  317. data/assets/include/SDL2/SDL_events.h +0 -1166
  318. data/assets/include/SDL2/SDL_filesystem.h +0 -149
  319. data/assets/include/SDL2/SDL_gamecontroller.h +0 -1074
  320. data/assets/include/SDL2/SDL_gesture.h +0 -117
  321. data/assets/include/SDL2/SDL_guid.h +0 -100
  322. data/assets/include/SDL2/SDL_haptic.h +0 -1341
  323. data/assets/include/SDL2/SDL_hidapi.h +0 -451
  324. data/assets/include/SDL2/SDL_hints.h +0 -2569
  325. data/assets/include/SDL2/SDL_image.h +0 -2173
  326. data/assets/include/SDL2/SDL_joystick.h +0 -1066
  327. data/assets/include/SDL2/SDL_keyboard.h +0 -353
  328. data/assets/include/SDL2/SDL_keycode.h +0 -358
  329. data/assets/include/SDL2/SDL_loadso.h +0 -115
  330. data/assets/include/SDL2/SDL_log.h +0 -404
  331. data/assets/include/SDL2/SDL_main.h +0 -275
  332. data/assets/include/SDL2/SDL_mixer.h +0 -2784
  333. data/assets/include/SDL2/SDL_mouse.h +0 -465
  334. data/assets/include/SDL2/SDL_mutex.h +0 -471
  335. data/assets/include/SDL2/SDL_name.h +0 -33
  336. data/assets/include/SDL2/SDL_pixels.h +0 -644
  337. data/assets/include/SDL2/SDL_platform.h +0 -261
  338. data/assets/include/SDL2/SDL_quit.h +0 -58
  339. data/assets/include/SDL2/SDL_rect.h +0 -376
  340. data/assets/include/SDL2/SDL_render.h +0 -1919
  341. data/assets/include/SDL2/SDL_revision.h +0 -6
  342. data/assets/include/SDL2/SDL_rwops.h +0 -841
  343. data/assets/include/SDL2/SDL_sensor.h +0 -322
  344. data/assets/include/SDL2/SDL_shape.h +0 -155
  345. data/assets/include/SDL2/SDL_stdinc.h +0 -830
  346. data/assets/include/SDL2/SDL_surface.h +0 -997
  347. data/assets/include/SDL2/SDL_system.h +0 -623
  348. data/assets/include/SDL2/SDL_syswm.h +0 -386
  349. data/assets/include/SDL2/SDL_test_images.h +0 -78
  350. data/assets/include/SDL2/SDL_test_random.h +0 -115
  351. data/assets/include/SDL2/SDL_thread.h +0 -464
  352. data/assets/include/SDL2/SDL_timer.h +0 -222
  353. data/assets/include/SDL2/SDL_touch.h +0 -150
  354. data/assets/include/SDL2/SDL_ttf.h +0 -2316
  355. data/assets/include/SDL2/SDL_types.h +0 -29
  356. data/assets/include/SDL2/SDL_version.h +0 -204
  357. data/assets/include/SDL2/SDL_video.h +0 -2150
  358. data/assets/include/SDL2/SDL_vulkan.h +0 -215
  359. data/assets/include/SDL2/begin_code.h +0 -187
  360. data/assets/include/mruby/boxing_no.h +0 -58
  361. data/assets/include/mruby/class.h +0 -108
  362. data/assets/include/mruby/error.h +0 -147
  363. data/assets/include/mruby/gc.h +0 -94
  364. data/assets/include/mruby/irep.h +0 -147
  365. data/assets/include/mruby/khash.h +0 -284
  366. data/assets/include/mruby/object.h +0 -43
  367. data/assets/include/mruby/presym/disable.h +0 -70
  368. data/assets/include/mruby/presym/enable.h +0 -37
  369. data/assets/include/mruby/presym.h +0 -40
  370. data/assets/include/mruby/proc.h +0 -211
  371. data/assets/include/mruby/throw.h +0 -66
  372. data/assets/macos/universal/bin/mrbc +0 -0
  373. data/assets/macos/universal/lib/libFLAC.a +0 -0
  374. data/assets/macos/universal/lib/libSDL2.a +0 -0
  375. data/assets/macos/universal/lib/libSDL2_image.a +0 -0
  376. data/assets/macos/universal/lib/libSDL2_mixer.a +0 -0
  377. data/assets/macos/universal/lib/libSDL2_ttf.a +0 -0
  378. data/assets/macos/universal/lib/libavif.a +0 -0
  379. data/assets/macos/universal/lib/libbrotlicommon-static.a +0 -0
  380. data/assets/macos/universal/lib/libbrotlidec-static.a +0 -0
  381. data/assets/macos/universal/lib/libfreetype.a +0 -0
  382. data/assets/macos/universal/lib/libgraphite2.a +0 -0
  383. data/assets/macos/universal/lib/libharfbuzz.a +0 -0
  384. data/assets/macos/universal/lib/libhwy.a +0 -0
  385. data/assets/macos/universal/lib/libjpeg.a +0 -0
  386. data/assets/macos/universal/lib/libjxl.a +0 -0
  387. data/assets/macos/universal/lib/libmodplug.a +0 -0
  388. data/assets/macos/universal/lib/libmpg123.a +0 -0
  389. data/assets/macos/universal/lib/libmruby.a +0 -0
  390. data/assets/macos/universal/lib/libogg.a +0 -0
  391. data/assets/macos/universal/lib/libpng.a +0 -0
  392. data/assets/macos/universal/lib/libtiff.a +0 -0
  393. data/assets/macos/universal/lib/libvorbis.a +0 -0
  394. data/assets/macos/universal/lib/libvorbisfile.a +0 -0
  395. data/assets/macos/universal/lib/libwebp.a +0 -0
  396. data/assets/macos/universal/lib/libzstd.a +0 -0
  397. data/assets/test_media/README.md +0 -3
  398. data/assets/test_media/bitstream_vera/COPYRIGHT.txt +0 -124
  399. data/assets/test_media/bitstream_vera/vera.ttf +0 -0
  400. data/assets/test_media/boom.png +0 -0
  401. data/assets/test_media/coin.png +0 -0
  402. data/assets/test_media/colors.png +0 -0
  403. data/assets/test_media/controller.png +0 -0
  404. data/assets/test_media/dial.wav +0 -0
  405. data/assets/test_media/hero.png +0 -0
  406. data/assets/test_media/image.bmp +0 -0
  407. data/assets/test_media/image.jpg +0 -0
  408. data/assets/test_media/image.png +0 -0
  409. data/assets/test_media/music.flac +0 -0
  410. data/assets/test_media/music.mp3 +0 -0
  411. data/assets/test_media/music.ogg +0 -0
  412. data/assets/test_media/music.wav +0 -0
  413. data/assets/test_media/originals/boom.pxm +0 -0
  414. data/assets/test_media/originals/coin.pxm +0 -0
  415. data/assets/test_media/originals/controller.sketch +0 -0
  416. data/assets/test_media/originals/hero.pxm +0 -0
  417. data/assets/test_media/originals/image.pxm +0 -0
  418. data/assets/test_media/originals/music.caf +0 -0
  419. data/assets/test_media/originals/texture_atlas.pxm +0 -0
  420. data/assets/test_media/rondo_alla_turka.ogg +0 -0
  421. data/assets/test_media/sound.flac +0 -0
  422. data/assets/test_media/sound.mp3 +0 -0
  423. data/assets/test_media/sound.ogg +0 -0
  424. data/assets/test_media/sound.wav +0 -0
  425. data/assets/test_media/sprite_sheet.png +0 -0
  426. data/assets/test_media/texture_atlas.png +0 -0
  427. data/assets/wasm/libmruby.a +0 -0
  428. data/assets/windows/mingw-w64-ucrt-x86_64/bin/mrbc.exe +0 -0
  429. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libFLAC.a +0 -0
  430. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libLerc.a +0 -0
  431. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2.a +0 -0
  432. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_image.a +0 -0
  433. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_mixer.a +0 -0
  434. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_ttf.a +0 -0
  435. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlicommon.a +0 -0
  436. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlidec.a +0 -0
  437. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbz2.a +0 -0
  438. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libdeflate.a +0 -0
  439. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libfreetype.a +0 -0
  440. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libglew32.a +0 -0
  441. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libgraphite2.a +0 -0
  442. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libharfbuzz.a +0 -0
  443. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libhwy.a +0 -0
  444. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjbig.a +0 -0
  445. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjpeg.a +0 -0
  446. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjxl.a +0 -0
  447. data/assets/windows/mingw-w64-ucrt-x86_64/lib/liblzma.a +0 -0
  448. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmodplug.a +0 -0
  449. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmpg123.a +0 -0
  450. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmruby.a +0 -0
  451. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libogg.a +0 -0
  452. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopus.a +0 -0
  453. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopusfile.a +0 -0
  454. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libpng.a +0 -0
  455. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libsndfile.a +0 -0
  456. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libssp.a +0 -1
  457. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libstdc++.a +0 -0
  458. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libtiff.a +0 -0
  459. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbis.a +0 -0
  460. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbisfile.a +0 -0
  461. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libwebp.a +0 -0
  462. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libz.a +0 -0
  463. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libzstd.a +0 -0
  464. data/assets/windows/mingw-w64-x86_64/bin/mrbc.exe +0 -0
  465. data/assets/windows/mingw-w64-x86_64/lib/libFLAC.a +0 -0
  466. data/assets/windows/mingw-w64-x86_64/lib/libLerc.a +0 -0
  467. data/assets/windows/mingw-w64-x86_64/lib/libSDL2.a +0 -0
  468. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_image.a +0 -0
  469. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_mixer.a +0 -0
  470. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_ttf.a +0 -0
  471. data/assets/windows/mingw-w64-x86_64/lib/libbrotlicommon.a +0 -0
  472. data/assets/windows/mingw-w64-x86_64/lib/libbrotlidec.a +0 -0
  473. data/assets/windows/mingw-w64-x86_64/lib/libbz2.a +0 -0
  474. data/assets/windows/mingw-w64-x86_64/lib/libdeflate.a +0 -0
  475. data/assets/windows/mingw-w64-x86_64/lib/libfreetype.a +0 -0
  476. data/assets/windows/mingw-w64-x86_64/lib/libglew32.a +0 -0
  477. data/assets/windows/mingw-w64-x86_64/lib/libgraphite2.a +0 -0
  478. data/assets/windows/mingw-w64-x86_64/lib/libharfbuzz.a +0 -0
  479. data/assets/windows/mingw-w64-x86_64/lib/libhwy.a +0 -0
  480. data/assets/windows/mingw-w64-x86_64/lib/libjbig.a +0 -0
  481. data/assets/windows/mingw-w64-x86_64/lib/libjpeg.a +0 -0
  482. data/assets/windows/mingw-w64-x86_64/lib/libjxl.a +0 -0
  483. data/assets/windows/mingw-w64-x86_64/lib/liblzma.a +0 -0
  484. data/assets/windows/mingw-w64-x86_64/lib/libmodplug.a +0 -0
  485. data/assets/windows/mingw-w64-x86_64/lib/libmpg123.a +0 -0
  486. data/assets/windows/mingw-w64-x86_64/lib/libmruby.a +0 -0
  487. data/assets/windows/mingw-w64-x86_64/lib/libogg.a +0 -0
  488. data/assets/windows/mingw-w64-x86_64/lib/libopus.a +0 -0
  489. data/assets/windows/mingw-w64-x86_64/lib/libopusfile.a +0 -0
  490. data/assets/windows/mingw-w64-x86_64/lib/libpng.a +0 -0
  491. data/assets/windows/mingw-w64-x86_64/lib/libsndfile.a +0 -0
  492. data/assets/windows/mingw-w64-x86_64/lib/libssp.a +0 -1
  493. data/assets/windows/mingw-w64-x86_64/lib/libstdc++.a +0 -0
  494. data/assets/windows/mingw-w64-x86_64/lib/libtiff.a +0 -0
  495. data/assets/windows/mingw-w64-x86_64/lib/libvorbis.a +0 -0
  496. data/assets/windows/mingw-w64-x86_64/lib/libvorbisfile.a +0 -0
  497. data/assets/windows/mingw-w64-x86_64/lib/libwebp.a +0 -0
  498. data/assets/windows/mingw-w64-x86_64/lib/libz.a +0 -0
  499. data/assets/windows/mingw-w64-x86_64/lib/libzstd.a +0 -0
  500. data/assets/xcode/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
  501. data/assets/xcode/ios/Assets.xcassets/Contents.json +0 -6
  502. data/assets/xcode/ios/Base.lproj/LaunchScreen.storyboard +0 -27
  503. data/assets/xcode/ios/Info.plist +0 -43
  504. data/assets/xcode/ios/MRuby.framework/Headers/mrbconf.h +0 -143
  505. data/assets/xcode/ios/MRuby.framework/Headers/mruby/array.h +0 -280
  506. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  507. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  508. data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  509. data/assets/xcode/ios/MRuby.framework/Headers/mruby/class.h +0 -97
  510. data/assets/xcode/ios/MRuby.framework/Headers/mruby/common.h +0 -77
  511. data/assets/xcode/ios/MRuby.framework/Headers/mruby/compile.h +0 -195
  512. data/assets/xcode/ios/MRuby.framework/Headers/mruby/data.h +0 -75
  513. data/assets/xcode/ios/MRuby.framework/Headers/mruby/debug.h +0 -67
  514. data/assets/xcode/ios/MRuby.framework/Headers/mruby/dump.h +0 -196
  515. data/assets/xcode/ios/MRuby.framework/Headers/mruby/error.h +0 -75
  516. data/assets/xcode/ios/MRuby.framework/Headers/mruby/gc.h +0 -91
  517. data/assets/xcode/ios/MRuby.framework/Headers/mruby/hash.h +0 -215
  518. data/assets/xcode/ios/MRuby.framework/Headers/mruby/irep.h +0 -75
  519. data/assets/xcode/ios/MRuby.framework/Headers/mruby/istruct.h +0 -47
  520. data/assets/xcode/ios/MRuby.framework/Headers/mruby/khash.h +0 -274
  521. data/assets/xcode/ios/MRuby.framework/Headers/mruby/numeric.h +0 -161
  522. data/assets/xcode/ios/MRuby.framework/Headers/mruby/object.h +0 -44
  523. data/assets/xcode/ios/MRuby.framework/Headers/mruby/opcode.h +0 -69
  524. data/assets/xcode/ios/MRuby.framework/Headers/mruby/ops.h +0 -117
  525. data/assets/xcode/ios/MRuby.framework/Headers/mruby/proc.h +0 -131
  526. data/assets/xcode/ios/MRuby.framework/Headers/mruby/range.h +0 -49
  527. data/assets/xcode/ios/MRuby.framework/Headers/mruby/re.h +0 -16
  528. data/assets/xcode/ios/MRuby.framework/Headers/mruby/string.h +0 -444
  529. data/assets/xcode/ios/MRuby.framework/Headers/mruby/throw.h +0 -55
  530. data/assets/xcode/ios/MRuby.framework/Headers/mruby/value.h +0 -309
  531. data/assets/xcode/ios/MRuby.framework/Headers/mruby/variable.h +0 -136
  532. data/assets/xcode/ios/MRuby.framework/Headers/mruby/version.h +0 -110
  533. data/assets/xcode/ios/MRuby.framework/Headers/mruby.h +0 -1282
  534. data/assets/xcode/ios/MRuby.framework/Info.plist +0 -20
  535. data/assets/xcode/ios/MRuby.framework/MRuby +0 -0
  536. data/assets/xcode/ios/MyApp.xcodeproj/project.pbxproj +0 -368
  537. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  538. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  539. data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  540. data/assets/xcode/ios/main.c +0 -1
  541. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  542. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json +0 -6
  543. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +0 -17
  544. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  545. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json +0 -6
  546. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  547. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  548. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
  549. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json +0 -6
  550. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +0 -17
  551. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
  552. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json +0 -6
  553. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
  554. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +0 -6
  555. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +0 -32
  556. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +0 -16
  557. data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +0 -16
  558. data/assets/xcode/tvos/Assets.xcassets/Contents.json +0 -6
  559. data/assets/xcode/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +0 -22
  560. data/assets/xcode/tvos/Info.plist +0 -30
  561. data/assets/xcode/tvos/MRuby.framework/Headers/mrbconf.h +0 -143
  562. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/array.h +0 -280
  563. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
  564. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
  565. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
  566. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/class.h +0 -97
  567. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/common.h +0 -77
  568. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/compile.h +0 -195
  569. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/data.h +0 -75
  570. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/debug.h +0 -67
  571. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/dump.h +0 -196
  572. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/error.h +0 -75
  573. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/gc.h +0 -91
  574. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/hash.h +0 -215
  575. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/irep.h +0 -75
  576. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/istruct.h +0 -47
  577. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/khash.h +0 -274
  578. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/numeric.h +0 -161
  579. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/object.h +0 -44
  580. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/opcode.h +0 -69
  581. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/ops.h +0 -117
  582. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/proc.h +0 -131
  583. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/range.h +0 -49
  584. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/re.h +0 -16
  585. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/string.h +0 -444
  586. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/throw.h +0 -55
  587. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/value.h +0 -309
  588. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/variable.h +0 -136
  589. data/assets/xcode/tvos/MRuby.framework/Headers/mruby/version.h +0 -110
  590. data/assets/xcode/tvos/MRuby.framework/Headers/mruby.h +0 -1282
  591. data/assets/xcode/tvos/MRuby.framework/Info.plist +0 -20
  592. data/assets/xcode/tvos/MRuby.framework/MRuby +0 -0
  593. data/assets/xcode/tvos/MyApp.xcodeproj/project.pbxproj +0 -350
  594. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  595. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  596. data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
  597. data/assets/xcode/tvos/main.c +0 -1
  598. data/ext/ruby2d/common.c +0 -185
  599. data/ext/ruby2d/controllers.c +0 -110
  600. data/ext/ruby2d/gl.c +0 -398
  601. data/ext/ruby2d/gl2.c +0 -86
  602. data/ext/ruby2d/gl3.c +0 -304
  603. data/ext/ruby2d/gles.c +0 -302
  604. data/ext/ruby2d/input.c +0 -48
  605. data/ext/ruby2d/music.c +0 -127
  606. data/ext/ruby2d/sound.c +0 -132
  607. data/lib/ruby2d/cli/console.rb +0 -65
  608. data/lib/ruby2d/cli/enable_console.rb +0 -7
  609. data/lib/ruby2d/cli/platform.rb +0 -17
  610. data/lib/ruby2d/music.rb +0 -77
  611. data/lib/ruby2d/pixel.rb +0 -18
  612. data/lib/ruby2d/pixmap.rb +0 -39
  613. data/lib/ruby2d/pixmap_atlas.rb +0 -56
  614. data/lib/ruby2d/sound.rb +0 -61
  615. data/lib/ruby2d/texture.rb +0 -38
  616. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2.h +0 -0
  617. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2ext.h +0 -0
  618. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2platform.h +0 -0
  619. /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_khrplatform.h +0 -0
  620. /data/assets/{include → platform/include}/mruby/re.h +0 -0
@@ -0,0 +1,194 @@
1
+ # Ruby2D::AtlasParser
2
+
3
+ module Ruby2D
4
+ # Internal parser for sprite-sheet atlas files. Reads either Sparrow XML or
5
+ # TexturePacker JSON (Hash or Array variants) and returns a uniform shape:
6
+ #
7
+ # { image_path: 'sheet.png',
8
+ # frames: { 'frame_name' => { x:, y:, width:, height: }, ... } }
9
+ #
10
+ # Hand-written and Regexp-free so it works on mruby builds without the
11
+ # regex mrbgem.
12
+ module AtlasParser
13
+ class ParseError < StandardError; end
14
+
15
+ def self.parse_file(path)
16
+ data = File.read(path)
17
+ lower = path.to_s.downcase
18
+ if lower.end_with?('.xml')
19
+ parse_xml(data)
20
+ elsif lower.end_with?('.json')
21
+ parse_json(data)
22
+ else
23
+ sniff(data, path)
24
+ end
25
+ end
26
+
27
+ def self.sniff(data, path)
28
+ i = 0
29
+ i += 1 while i < data.length && ws?(data[i])
30
+ first = data[i]
31
+ return parse_xml(data) if first == '<'
32
+ return parse_json(data) if first == '{'
33
+
34
+ raise ParseError, "Cannot determine atlas format for #{path}"
35
+ end
36
+
37
+ def self.parse_xml(str)
38
+ atlas_attrs = find_tags(str, 'TextureAtlas').first
39
+ image_path = atlas_attrs && parse_xml_attrs(atlas_attrs)['imagePath']
40
+
41
+ frames = {}
42
+ find_tags(str, 'SubTexture').each do |attrs_str|
43
+ attrs = parse_xml_attrs(attrs_str)
44
+ name = attrs['name']
45
+ next unless name
46
+
47
+ rect = {
48
+ x: (attrs['x'] || '0').to_i,
49
+ y: (attrs['y'] || '0').to_i,
50
+ width: (attrs['width'] || '0').to_i,
51
+ height: (attrs['height'] || '0').to_i
52
+ }
53
+ # Extended Sparrow trim attributes: `frameWidth`/`frameHeight` give
54
+ # the original frame's logical dimensions, and `frameX`/`frameY` are
55
+ # the (negative) offset from the original frame's top-left to where
56
+ # the trimmed rect begins. Convert to a positive `trim_x`/`trim_y`.
57
+ if attrs['frameWidth'] || attrs['frameHeight'] || attrs['frameX'] || attrs['frameY']
58
+ rect[:source_width] = (attrs['frameWidth'] || rect[:width]).to_i
59
+ rect[:source_height] = (attrs['frameHeight'] || rect[:height]).to_i
60
+ rect[:trim_x] = -(attrs['frameX'] || '0').to_i
61
+ rect[:trim_y] = -(attrs['frameY'] || '0').to_i
62
+ end
63
+ frames[name] = rect
64
+ end
65
+
66
+ { image_path: image_path, frames: frames }
67
+ end
68
+
69
+ def self.parse_json(str)
70
+ data = JsonParser.parse(str)
71
+ raise ParseError, 'Invalid JSON atlas: top-level value must be an object' unless data.is_a?(Hash)
72
+
73
+ meta = data['meta']
74
+ image_path = meta.is_a?(Hash) ? meta['image'] : nil
75
+
76
+ frames = {}
77
+ frames_data = data['frames']
78
+ if frames_data.is_a?(Hash)
79
+ frames_data.each { |name, info| frames[name] = extract_json_frame(info) }
80
+ elsif frames_data.is_a?(Array)
81
+ frames_data.each do |info|
82
+ next unless info.is_a?(Hash)
83
+
84
+ name = info['filename']
85
+ frames[name] = extract_json_frame(info) if name
86
+ end
87
+ else
88
+ raise ParseError, "Invalid JSON atlas: 'frames' must be a hash or array"
89
+ end
90
+
91
+ { image_path: image_path, frames: frames }
92
+ end
93
+
94
+ def self.extract_json_frame(info)
95
+ frame = info.is_a?(Hash) ? info['frame'] : nil
96
+ frame = {} unless frame.is_a?(Hash)
97
+ result = {
98
+ x: (frame['x'] || 0).to_i,
99
+ y: (frame['y'] || 0).to_i,
100
+ width: (frame['w'] || frame['width'] || 0).to_i,
101
+ height: (frame['h'] || frame['height'] || 0).to_i
102
+ }
103
+ # TexturePacker can pack frames rotated 90° to save atlas space.
104
+ # We capture the flag so the consumer can refuse or handle it; the
105
+ # key is omitted when false to keep the common-case hash lean.
106
+ result[:rotated] = true if info.is_a?(Hash) && info['rotated'] == true
107
+
108
+ # Trim metadata: `sourceSize` is the original frame's logical size,
109
+ # `spriteSourceSize.x/y` is where the packed pixels live within it.
110
+ source = info.is_a?(Hash) ? info['sourceSize'] : nil
111
+ sprite_source = info.is_a?(Hash) ? info['spriteSourceSize'] : nil
112
+ if source.is_a?(Hash) && (source['w'] || source['h'])
113
+ result[:source_width] = (source['w'] || result[:width]).to_i
114
+ result[:source_height] = (source['h'] || result[:height]).to_i
115
+ if sprite_source.is_a?(Hash)
116
+ result[:trim_x] = (sprite_source['x'] || 0).to_i
117
+ result[:trim_y] = (sprite_source['y'] || 0).to_i
118
+ else
119
+ result[:trim_x] = 0
120
+ result[:trim_y] = 0
121
+ end
122
+ end
123
+
124
+ result
125
+ end
126
+
127
+ # Locate every `<TagName ...>` (or `<TagName ... />`) opening tag in `str`
128
+ # and return the inner attribute strings, in document order.
129
+ def self.find_tags(str, tag_name)
130
+ results = []
131
+ marker = "<#{tag_name}"
132
+ marker_len = marker.length
133
+ i = 0
134
+ while (pos = str.index(marker, i))
135
+ after_idx = pos + marker_len
136
+ after = str[after_idx]
137
+ # Confirm this is the right tag boundary (not a longer name like
138
+ # `<TextureAtlasFoo`)
139
+ if after && (ws?(after) || after == '>' || after == '/')
140
+ end_pos = str.index('>', after_idx)
141
+ break unless end_pos
142
+
143
+ attrs_str = str[after_idx...end_pos]
144
+ # Drop the trailing slash from self-closing tags.
145
+ attrs_str = attrs_str[0...-1] if attrs_str.end_with?('/')
146
+ results << attrs_str
147
+ i = end_pos + 1
148
+ else
149
+ i = pos + 1
150
+ end
151
+ end
152
+ results
153
+ end
154
+
155
+ # Parse `name="value"` (or `name='value'`) attributes out of an XML tag's
156
+ # attribute string. Tolerates extra whitespace between tokens.
157
+ def self.parse_xml_attrs(str)
158
+ attrs = {}
159
+ return attrs unless str
160
+
161
+ i = 0
162
+ len = str.length
163
+ while i < len
164
+ i += 1 while i < len && ws?(str[i])
165
+ break if i >= len
166
+
167
+ name_start = i
168
+ i += 1 while i < len && str[i] != '=' && !ws?(str[i])
169
+ name = str[name_start...i]
170
+
171
+ i += 1 while i < len && ws?(str[i])
172
+ break unless i < len && str[i] == '='
173
+
174
+ i += 1
175
+ i += 1 while i < len && ws?(str[i])
176
+ break unless i < len
177
+
178
+ quote = str[i]
179
+ break unless quote == '"' || quote == "'"
180
+
181
+ i += 1
182
+ val_start = i
183
+ i += 1 while i < len && str[i] != quote
184
+ attrs[name] = str[val_start...i]
185
+ i += 1 if i < len
186
+ end
187
+ attrs
188
+ end
189
+
190
+ def self.ws?(c)
191
+ c == ' ' || c == "\t" || c == "\n" || c == "\r"
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,73 @@
1
+ module Ruby2D
2
+ class Audio
3
+ attr_reader :path
4
+
5
+ # Create an audio object from a file
6
+ def initialize(path, loop: false)
7
+ @path = path.to_s
8
+ raise Error, "Cannot find audio file `#{@path}`" unless File.exist? @path
9
+
10
+ @loop = loop ? true : false
11
+ @ext_audio = Ext.audio_load(@path)
12
+ end
13
+
14
+ # Play the sound
15
+ def play
16
+ Ext.audio_play(@ext_audio, @loop)
17
+ end
18
+
19
+ # Pause the music
20
+ def pause
21
+ Ext.audio_pause(@ext_audio)
22
+ end
23
+
24
+ # Resume paused music
25
+ def resume
26
+ Ext.audio_resume(@ext_audio)
27
+ end
28
+
29
+ # Stop the sound
30
+ def stop(ms_fade = 0)
31
+ Ext.audio_stop(@ext_audio, ms_fade)
32
+ end
33
+
34
+ # Whether the audio loops on play
35
+ def looping?
36
+ @loop
37
+ end
38
+
39
+ # Set looping
40
+ def loop=(value)
41
+ @loop = value ? true : false
42
+ Ext.audio_set_loop(@ext_audio, @loop)
43
+ end
44
+
45
+ # Returns the length in seconds
46
+ def length
47
+ Ext.audio_length(@ext_audio)
48
+ end
49
+
50
+ # Get the volume of the sound, 0.0 to 1.0
51
+ def volume
52
+ Ext.audio_get_volume(@ext_audio)
53
+ end
54
+
55
+ # Set the volume of the sound, 0.0 to 1.0
56
+ def volume=(volume)
57
+ Ext.audio_set_volume(@ext_audio, volume.clamp(0.0, 1.0))
58
+ end
59
+
60
+ class << self
61
+ # Get the mixer volume, 0.0 to 1.0
62
+ def volume
63
+ Ext.audio_get_mixer_volume
64
+ end
65
+
66
+ # Set the mixer volume, 0.0 to 1.0
67
+ def volume=(volume)
68
+ Ext.audio_set_mixer_volume(volume.clamp(0.0, 1.0))
69
+ end
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,259 @@
1
+ module Ruby2D
2
+ # Lightweight benchmarking harness for Ruby 2D rendering performance.
3
+ #
4
+ # Runs a scene with fps_cap: :infinity (vsync off, no frame cap) and records
5
+ # per-frame deltas plus GC activity over a timed window.
6
+ # After a warmup period the harness samples each frame's duration,
7
+ # then auto-closes and prints a frame-time histogram and GC summary.
8
+ #
9
+ # Usage:
10
+ #
11
+ # Ruby2D::Benchmark.run('My Scene', warmup: 10, duration: 5) do
12
+ # # set up your scene / render block here
13
+ # end
14
+ #
15
+ class Benchmark
16
+ DEFAULTS = { warmup: 10, duration: 5 }.freeze
17
+
18
+ # Per-frame CPU/present split. The wall-clock frame delta the harness
19
+ # records includes `SDL_RenderPresent`, which on a desktop compositor can
20
+ # be the dominant, floor-setting cost — so raw fps hides whether a change
21
+ # moved the CPU work at all (an empty window can even measure slower than a
22
+ # populated one). These accumulators, filled by the two wrappers installed
23
+ # in `run`, let the report separate CPU-build time from the present wait.
24
+ # present_ns — time inside `Ext.end_frame` (≈ present; the cap delay is
25
+ # off at fps_cap :infinity)
26
+ # render_ns — time inside `Window#render_objects` (scene-graph draw:
27
+ # dispatch + FFI marshaling, plus any `render do` block)
28
+ # Both are summed per frame and read+reset each update tick. Wrapper-only
29
+ # state lives here (module methods can't close over harness locals); it is
30
+ # bench-only and never loaded by the gem proper.
31
+ module Clock
32
+ class << self
33
+ attr_accessor :present_ns, :render_ns
34
+ end
35
+ self.present_ns = 0.0
36
+ self.render_ns = 0.0
37
+ end
38
+
39
+ # Wraps `Ext.end_frame` to accumulate present time. Prepended to the Ext
40
+ # singleton in `run`. The extra `Ext.now` reads are sub-microsecond and
41
+ # apply to every benchmark equally, so A/B comparisons stay consistent.
42
+ module PresentTimer
43
+ def end_frame(*args)
44
+ t = Ext.now
45
+ super
46
+ ensure
47
+ Clock.present_ns += Ext.now - t
48
+ end
49
+ end
50
+
51
+ # Wraps `Window#render_objects` to accumulate scene-graph draw time.
52
+ # Prepended to the benchmark window's singleton in `run`.
53
+ module RenderTimer
54
+ def render_objects(*args)
55
+ t = Ruby2D::Ext.now
56
+ super
57
+ ensure
58
+ Clock.render_ns += Ruby2D::Ext.now - t
59
+ end
60
+ end
61
+
62
+ attr_reader :name, :warmup, :duration
63
+
64
+ def initialize(name, warmup: DEFAULTS[:warmup], duration: DEFAULTS[:duration])
65
+ @name = name
66
+ @warmup = warmup
67
+ @duration = duration
68
+ end
69
+
70
+ def self.run(name, **opts, &block)
71
+ new(name, **opts).run(&block)
72
+ end
73
+
74
+ def run(&setup)
75
+ frame_times = []
76
+ cpu_times = []
77
+ render_times = []
78
+ phase = :warmup
79
+ phase_start = nil
80
+ warmup_frames = 0
81
+ measure_start = nil
82
+ prev_t = nil
83
+
84
+ gc_alloc_start = nil
85
+ gc_minor_start = nil
86
+ gc_major_start = nil
87
+ # mruby (the web build) has no `GC.stat`; skip the allocation section
88
+ # there rather than fault. CRuby reports it as before.
89
+ gc_available = GC.respond_to?(:stat)
90
+ @reported = false
91
+
92
+ w = DSL.window
93
+
94
+ # Install the CPU/present split probes (idempotent — prepend is a no-op
95
+ # if the module is already in the ancestor chain from a prior run).
96
+ Ext.singleton_class.prepend(PresentTimer)
97
+ w.singleton_class.prepend(RenderTimer)
98
+
99
+ # Uncap frame rate so we measure raw throughput
100
+ w.set(fps_cap: :infinity)
101
+
102
+ # Let the caller configure the scene (add objects, render blocks, etc.)
103
+ setup.call
104
+
105
+ # Chain any update proc the setup block registered so per-frame
106
+ # benchmark work runs alongside the harness phase logic.
107
+ user_update = w.instance_variable_get(:@update_proc)
108
+
109
+ w.update do
110
+ # Monotonic clock (matching the engine): immune to wall-clock jumps that
111
+ # would corrupt the frame-time histogram mid-measurement.
112
+ now = Ext.now
113
+
114
+ # Lazily initialise the phase timer on the first real frame —
115
+ # this avoids counting window-creation overhead as warmup time.
116
+ first_frame = phase_start.nil?
117
+ if first_frame
118
+ phase_start = now
119
+ prev_t = now
120
+ end
121
+
122
+ delta = now - prev_t
123
+ prev_t = now
124
+
125
+ # Read + reset the split the wrappers accumulated since the previous
126
+ # update tick — i.e. the frame that just completed, the same frame
127
+ # `delta` spans. `cpu` is the frame minus its present wait; clamp away
128
+ # sub-microsecond clock jitter that could make it momentarily negative.
129
+ present = Clock.present_ns
130
+ render = Clock.render_ns
131
+ Clock.present_ns = 0.0
132
+ Clock.render_ns = 0.0
133
+ cpu = delta - present
134
+ cpu = 0.0 if cpu.negative?
135
+
136
+ # Run the caller's update proc, forwarding the frame delta if it takes
137
+ # one (mirrors Window#update_callback's arity handling).
138
+ if user_update
139
+ user_update.arity.zero? ? user_update.call : user_update.call(delta)
140
+ end
141
+
142
+ next if first_frame # exclude the first frame from phase timing
143
+
144
+ case phase
145
+ when :warmup
146
+ warmup_frames += 1
147
+ if now - phase_start >= @warmup
148
+ phase = :measure
149
+ measure_start = now
150
+ if gc_available
151
+ gc_alloc_start = GC.stat(:total_allocated_objects)
152
+ gc_minor_start = GC.stat(:minor_gc_count)
153
+ gc_major_start = GC.stat(:major_gc_count)
154
+ end
155
+ end
156
+ when :measure
157
+ frame_times << delta
158
+ cpu_times << cpu
159
+ render_times << render
160
+ if now - measure_start >= @duration
161
+ if gc_available
162
+ @gc_alloc_delta = GC.stat(:total_allocated_objects) - gc_alloc_start
163
+ @gc_minor_delta = GC.stat(:minor_gc_count) - gc_minor_start
164
+ @gc_major_delta = GC.stat(:major_gc_count) - gc_major_start
165
+ end
166
+ # Print from inside the loop: on the web build `w.show` never
167
+ # returns (emscripten unwinds the C stack, and `close` is a no-op
168
+ # there), so a report after `show` would be dead code
169
+ # there. The `@reported` guard keeps it to a single print.
170
+ unless @reported
171
+ report(frame_times, cpu_times, render_times, warmup_frames)
172
+ @reported = true
173
+ end
174
+ w.close
175
+ end
176
+ end
177
+ end
178
+
179
+ w.show
180
+
181
+ # CRuby returns here once the window closes; the web build never does
182
+ # (it reported from inside the loop above). Report only if the loop
183
+ # somehow exited without doing so.
184
+ report(frame_times, cpu_times, render_times, warmup_frames) unless @reported
185
+ end
186
+
187
+ private
188
+
189
+ def report(frame_times, cpu_times, render_times, warmup_frames)
190
+ puts "Ruby 2D Benchmark — #{@name}"
191
+ puts '-' * 60
192
+
193
+ if frame_times.empty?
194
+ puts ' No samples collected!'
195
+ puts
196
+ return
197
+ end
198
+
199
+ total = frame_times.size
200
+ total_time = frame_times.sum
201
+ avg_ms = (total_time * 1000.0) / total
202
+ fps = total / total_time
203
+
204
+ sorted = frame_times.sort
205
+ pct = ->(s, p) { s[[(s.size * p).floor, s.size - 1].min] * 1000.0 }
206
+ p50 = pct.call(sorted, 0.50)
207
+ p95 = pct.call(sorted, 0.95)
208
+ p99 = pct.call(sorted, 0.99)
209
+ p999 = pct.call(sorted, 0.999)
210
+ max_ms = sorted.last * 1000.0
211
+
212
+ # CPU build (frame minus present) and its share of the scene-graph draw.
213
+ cpu_time = cpu_times.sum
214
+ cpu_avg_ms = (cpu_time * 1000.0) / total
215
+ cpu_fps = cpu_time.positive? ? total / cpu_time : 0.0
216
+ cpu_sorted = cpu_times.sort
217
+ present_avg_ms = ((total_time - cpu_time) * 1000.0) / total
218
+ render_avg_ms = (render_times.sum * 1000.0) / total
219
+ render_p95_ms = pct.call(render_times.sort, 0.95)
220
+
221
+ puts format(' %-14s %s', 'Warmup:', "#{@warmup}s (#{warmup_frames} frames)")
222
+ puts format(' %-14s %s', 'Measured:', "#{@duration}s (#{total} frames)")
223
+ puts
224
+ puts format(' %-14s %.1f fps (%.2f ms/frame)', 'Throughput:', fps, avg_ms)
225
+ puts
226
+ puts ' Frame time (wall clock, incl. present):'
227
+ puts format(' %-10s %.2f ms', 'p50:', p50)
228
+ puts format(' %-10s %.2f ms', 'p95:', p95)
229
+ puts format(' %-10s %.2f ms', 'p99:', p99)
230
+ puts format(' %-10s %.2f ms', 'p99.9:', p999)
231
+ puts format(' %-10s %.2f ms', 'max:', max_ms)
232
+ puts
233
+ puts ' CPU build (frame minus present) — the per-object cost:'
234
+ puts format(' %-10s %.1f fps-equiv (%.2f ms/frame)', 'throughput:', cpu_fps, cpu_avg_ms)
235
+ puts format(' %-10s %.2f ms', 'p50:', pct.call(cpu_sorted, 0.50))
236
+ puts format(' %-10s %.2f ms', 'p95:', pct.call(cpu_sorted, 0.95))
237
+ puts format(' %-10s %.2f ms', 'p99:', pct.call(cpu_sorted, 0.99))
238
+ puts format(' %-10s %.2f ms (p95 %.2f ms)', 'render:', render_avg_ms, render_p95_ms)
239
+ puts format(' %-10s %.2f ms', 'present:', present_avg_ms)
240
+ puts
241
+
242
+ # GC stats are CRuby-only (see `gc_available`); the web build omits them.
243
+ if @gc_alloc_delta
244
+ puts ' GC:'
245
+ puts format(' %-12s %s objects (%s / frame)', 'Allocations:',
246
+ thousands(@gc_alloc_delta), thousands((@gc_alloc_delta.to_f / total).round))
247
+ puts format(' %-12s %d', 'Minor GCs:', @gc_minor_delta)
248
+ puts format(' %-12s %d', 'Major GCs:', @gc_major_delta)
249
+ end
250
+ puts '-' * 60
251
+ puts
252
+ end
253
+
254
+ def thousands(n)
255
+ sign = n.negative? ? '-' : ''
256
+ "#{sign}#{n.abs.to_s.reverse.scan(/\d{1,3}/).join(',').reverse}"
257
+ end
258
+ end
259
+ end
@@ -0,0 +1,155 @@
1
+ # Ruby2D::BitmapText
2
+
3
+ module Ruby2D
4
+ # Text drawn with the built-in bitmap font (no TTF file needed)
5
+ class BitmapText
6
+ include Renderable
7
+
8
+ attr_reader :content, :scale, :x, :y
9
+ attr_accessor :rotate
10
+
11
+ # Set the x position. BitmapText has no symbolic alignment, so x must be a
12
+ # number — a symbol would otherwise crash with a type error at draw time.
13
+ def x=(value)
14
+ @x = _validate_coordinate(:x, value)
15
+ end
16
+
17
+ # Set the y position (numeric only — see `x=`).
18
+ def y=(value)
19
+ @y = _validate_coordinate(:y, value)
20
+ end
21
+
22
+ # Get the rotation center x coordinate (defaults to the text's center)
23
+ def rx
24
+ @_user_rx.nil? ? @x + @width / 2.0 : @_user_rx
25
+ end
26
+
27
+ # Get the rotation center y coordinate
28
+ def ry
29
+ @_user_ry.nil? ? @y + @height / 2.0 : @_user_ry
30
+ end
31
+
32
+ # Set the rotation center x coordinate
33
+ def rx=(val)
34
+ @_user_rx = val
35
+ end
36
+
37
+ # Set the rotation center y coordinate
38
+ def ry=(val)
39
+ @_user_ry = val
40
+ end
41
+
42
+ # Create a bitmap text object
43
+ def initialize(content, x: 0, y: 0, z: 0, scale: 3,
44
+ rotate: 0, rx: nil, ry: nil,
45
+ color: nil, colour: nil, opacity: nil,
46
+ add: true, visible: true)
47
+ self.x = x
48
+ self.y = y
49
+ @z = z
50
+ @rotate = rotate
51
+ @_user_rx = rx
52
+ @_user_ry = ry
53
+ @content = content.to_s
54
+ @scale = validate_scale(scale)
55
+
56
+ self.color = color || colour || 'white'
57
+ self.opacity = opacity unless opacity.nil?
58
+ Ext.bitmap_text_create(self)
59
+
60
+ @visible = visible
61
+ self.add if add
62
+ end
63
+
64
+ # Set the text content. A no-op when the content is unchanged — rebuilding
65
+ # the texture is the expensive part, and per-frame assignments of the same
66
+ # string (HUDs, score counters) are common.
67
+ def content=(msg)
68
+ msg = msg.to_s
69
+ return if msg == @content
70
+
71
+ @content = msg
72
+ Ext.bitmap_text_create(self)
73
+ end
74
+
75
+ # Set the scale. A no-op when unchanged, like `content=` — rebuilding the
76
+ # texture is the expensive part.
77
+ def scale=(s)
78
+ s = validate_scale(s)
79
+ return if s == @scale
80
+
81
+ @scale = s
82
+ Ext.bitmap_text_create(self)
83
+ end
84
+
85
+ # Render the text. Called with overrides for one-shot rendering inside a
86
+ # render block; with no arguments it draws the same frame the scene graph
87
+ # does (delegating to `_render_scene`).
88
+ def render(x: nil, y: nil, scale: nil, rotate: nil, color: nil, colour: nil, opacity: nil)
89
+ if x.nil? && y.nil? && scale.nil? && rotate.nil? && color.nil? && colour.nil? && opacity.nil?
90
+ return _render_scene
91
+ end
92
+
93
+ Window.render_ready_check
94
+
95
+ saved_x, saved_y = @x, @y
96
+ saved_scale = @scale
97
+ saved_rotate = @rotate
98
+ saved_color = @color
99
+
100
+ @x = x if x
101
+ @y = y if y
102
+ @scale = validate_scale(scale) if scale
103
+ @rotate = rotate if rotate
104
+
105
+ c = color || colour
106
+ if c || opacity
107
+ @color = c ? Color.new(c) : Color.new(saved_color)
108
+ @color.opacity = opacity if opacity
109
+ end
110
+
111
+ begin
112
+ Ext.bitmap_text_draw(self, rx, ry)
113
+ ensure
114
+ @x, @y = saved_x, saved_y
115
+ @scale = saved_scale
116
+ @rotate = saved_rotate
117
+ @color = saved_color
118
+ end
119
+ end
120
+
121
+ private
122
+
123
+ # Scene-graph draw hook (see Renderable#_render_scene): `render` with no
124
+ # overrides, minus its keyword handling — a zero-arg call into a
125
+ # keyword-heavy `render` still pays microseconds of keyword setup on wasm
126
+ # mruby.
127
+ def _render_scene
128
+ Ext.bitmap_text_draw(self, rx, ry)
129
+ end
130
+ public :_render_scene
131
+
132
+ def _validate_coordinate(axis, value)
133
+ unless value.is_a?(Numeric)
134
+ raise Error,
135
+ "BitmapText #{axis} must be a number; symbolic alignment " \
136
+ "(e.g. #{axis}: :center) is not supported — use Text instead"
137
+ end
138
+ value
139
+ end
140
+
141
+ # Ensure the scale is a positive number, raising a clear error instead of
142
+ # letting an invalid value reach the native renderer (where a non-numeric
143
+ # value surfaces as a cryptic `TypeError` and zero/negative silently builds
144
+ # a blank, zero-or-negative-sized texture). Coerce to the same integer the
145
+ # native renderer uses (truncation toward zero) so the `scale` reader equals
146
+ # the scale actually rendered — e.g. `scale: 2.9` renders and reports 2.
147
+ def validate_scale(scale)
148
+ unless scale.is_a?(Numeric) && scale > 0
149
+ raise Error, "BitmapText scale must be a positive number, got #{scale.inspect}"
150
+ end
151
+
152
+ scale.to_i
153
+ end
154
+ end
155
+ end