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/ext/ruby2d/image.c CHANGED
@@ -2,57 +2,482 @@
2
2
 
3
3
  #include "ruby2d.h"
4
4
 
5
+ R2D_DEFINE_DATA_TYPE(R2D_Image);
5
6
 
6
- SDL_Surface *R2D_CreateImageSurface(const char *path) {
7
- R2D_Init();
7
+ // Image-specific ivar IDs. Shared ivar IDs (id_x, id_y, id_width, id_height,
8
+ // id_rotate, id_color, id_r, id_g, id_b, id_a, id_ext_image, id_path) live in
9
+ // ext.c; this file only caches what's unique to Image.
10
+ static R_ID id_clipped, id_clip_x, id_clip_y, id_clip_width, id_clip_height;
11
+ static R_ID id_orig_width, id_orig_height;
12
+ static R_ID id_source_width, id_source_height, id_trim_x, id_trim_y;
13
+ static R_ID id_user_rx, id_user_ry;
14
+ static R_ID id_flip;
15
+ static R_ID id_flip_horizontal, id_flip_vertical, id_flip_both;
16
+
17
+
18
+ /*
19
+ * Initialize — caches ivar IDs and registers Ruby2D::Ext image bindings.
20
+ * Bindings take the Image Ruby object as their first arg and read ivars off
21
+ * it; the C side reads ivars from that object via obj_* macros.
22
+ */
23
+ void R2D_Image_Init() {
24
+ id_orig_width = r_id("@orig_width");
25
+ id_orig_height = r_id("@orig_height");
26
+ id_clipped = r_id("@clipped");
27
+ id_clip_x = r_id("@clip_x");
28
+ id_clip_y = r_id("@clip_y");
29
+ id_clip_width = r_id("@clip_width");
30
+ id_clip_height = r_id("@clip_height");
31
+ id_source_width = r_id("@source_width");
32
+ id_source_height = r_id("@source_height");
33
+ id_trim_x = r_id("@trim_x");
34
+ id_trim_y = r_id("@trim_y");
35
+ id_user_rx = r_id("@_user_rx");
36
+ id_user_ry = r_id("@_user_ry");
37
+ id_flip = r_id("@flip");
38
+ id_flip_horizontal = r_id("horizontal");
39
+ id_flip_vertical = r_id("vertical");
40
+ id_flip_both = r_id("both");
41
+
42
+ r_define_class_method(ruby2d_ext_module, "image_create", ruby2d_ext_image_create, r_args_variadic);
43
+ r_define_class_method(ruby2d_ext_module, "image_draw", ruby2d_ext_image_draw, r_args_variadic);
44
+ r_define_class_method(ruby2d_ext_module, "image_draw_quads", ruby2d_ext_image_draw_quads, r_args_variadic);
45
+ r_define_class_method(ruby2d_ext_module, "image_resize", ruby2d_ext_image_resize, r_args_variadic);
46
+ }
47
+
48
+
49
+ // Case-insensitive check for the `.svg` extension on a path.
50
+ static bool path_is_svg(const char *path) {
51
+ if (!path) return false;
52
+ size_t len = strlen(path);
53
+ if (len < 4) return false;
54
+ const char *ext = path + len - 4;
55
+ return ext[0] == '.' &&
56
+ (ext[1] == 's' || ext[1] == 'S') &&
57
+ (ext[2] == 'v' || ext[2] == 'V') &&
58
+ (ext[3] == 'g' || ext[3] == 'G');
59
+ }
60
+
61
+
62
+ /*
63
+ * Ruby2D::Ext.image_create(image)
64
+ */
65
+ R_VAL ruby2d_ext_image_create(RUBY2D_METHOD_ARGS_VARIADIC) {
66
+ RUBY2D_EXTRACT_VARIADIC;
67
+ if (argc != 1) r_raise("Ruby2D::Ext.image_create expects 1 arg (image), got %d", (int)argc);
68
+ R_VAL obj = argv[0];
69
+
70
+ const char *path = obj_str(obj, id_path);
8
71
 
9
- // Check if image file exists
10
72
  if (!R2D_FileExists(path)) {
11
- R2D_Error("R2D_CreateImageSurface", "Image file `%s` not found", path);
12
- return NULL;
73
+ r_error("Image file `%s` not found", path);
74
+ return R_NIL;
13
75
  }
14
76
 
15
- // Load image from file as SDL_Surface
16
- SDL_Surface *surface = IMG_Load(path);
17
- if (surface != NULL) {
18
- int bits_per_color = surface->format->Amask == 0 ?
19
- surface->format->BitsPerPixel / 3 :
20
- surface->format->BitsPerPixel / 4;
77
+ R2D_Image *img = ALLOC(R2D_Image);
78
+ img->surface = NULL;
21
79
 
22
- if (bits_per_color < 8) {
23
- R2D_Log(R2D_WARN, "`%s` has less than 8 bits per color and will likely not render correctly", path, bits_per_color);
80
+ // SVGs rasterize at their intrinsic size via IMG_Load and then pixelate when
81
+ // drawn larger. If the user supplied a width and height, rasterize at the
82
+ // requested size so small upscales and rotations stay crisp; downscales to
83
+ // the user's size are handled by SDL at draw time.
84
+ if (path_is_svg(path)) {
85
+ R_VAL w_val = r_ivar_get(obj, id_width);
86
+ R_VAL h_val = r_ivar_get(obj, id_height);
87
+ if (r_test(w_val) && r_test(h_val)) {
88
+ int w = (int)NUM2DBL(w_val);
89
+ int h = (int)NUM2DBL(h_val);
90
+ if (w > 0 && h > 0) {
91
+ SDL_IOStream *io = SDL_IOFromFile(path, "rb");
92
+ if (io) {
93
+ img->surface = IMG_LoadSizedSVG_IO(io, w * 2, h * 2);
94
+ SDL_CloseIO(io);
95
+ }
96
+ }
24
97
  }
25
98
  }
26
- return surface;
99
+
100
+ if (!img->surface) img->surface = IMG_Load(path);
101
+ if (!img->surface) {
102
+ xfree(img);
103
+ r_error("Failed to load image `%s`: %s", path, SDL_GetError());
104
+ return R_NIL;
105
+ }
106
+
107
+ img->texture = NULL;
108
+
109
+ obj_set_struct(obj, id_ext_image, R2D_Image, img);
110
+ obj_set_int(obj, id_width, img->surface->w);
111
+ obj_set_int(obj, id_height, img->surface->h);
112
+ obj_set_int(obj, id_orig_width, img->surface->w);
113
+ obj_set_int(obj, id_orig_height, img->surface->h);
114
+ obj_set_bool(obj, id_clipped, false);
115
+ obj_set_float(obj, id_clip_x, 0.0);
116
+ obj_set_float(obj, id_clip_y, 0.0);
117
+ obj_set_int(obj, id_clip_width, img->surface->w);
118
+ obj_set_int(obj, id_clip_height, img->surface->h);
119
+ obj_set_int(obj, id_source_width, img->surface->w);
120
+ obj_set_int(obj, id_source_height, img->surface->h);
121
+ obj_set_int(obj, id_trim_x, 0);
122
+ obj_set_int(obj, id_trim_y, 0);
123
+ obj_set_float(obj, id_rotate, 0.0);
124
+
125
+ return R_TRUE;
27
126
  }
28
127
 
29
- void R2D_ImageConvertToRGB(SDL_Surface *surface) {
30
- Uint32 r = surface->format->Rmask;
31
- Uint32 g = surface->format->Gmask;
32
- Uint32 a = surface->format->Amask;
33
-
34
- if (r&0xFF000000 || r&0xFF0000) {
35
- char *p = (char *)surface->pixels;
36
- int bpp = surface->format->BytesPerPixel;
37
- int w = surface->w;
38
- int h = surface->h;
39
- char tmp;
40
- for (int i = 0; i < bpp * w * h; i += bpp) {
41
- if (a&0xFF) {
42
- tmp = p[i];
43
- p[i] = p[i+3];
44
- p[i+3] = tmp;
45
- }
46
- if (g&0xFF0000) {
47
- tmp = p[i+1];
48
- p[i+1] = p[i+2];
49
- p[i+2] = tmp;
50
- }
51
- if (r&0xFF0000) {
52
- tmp = p[i];
53
- p[i] = p[i+2];
54
- p[i+2] = tmp;
55
- }
128
+
129
+ /*
130
+ * Ruby2D::Ext.image_draw(image)
131
+ */
132
+ R_VAL ruby2d_ext_image_draw(RUBY2D_METHOD_ARGS_VARIADIC) {
133
+ RUBY2D_EXTRACT_VARIADIC;
134
+ if (argc != 1) r_raise("Ruby2D::Ext.image_draw expects 1 arg (image), got %d", (int)argc);
135
+ R_VAL obj = argv[0];
136
+
137
+ R2D_Image *img;
138
+ obj_struct(obj, id_ext_image, R2D_Image, img);
139
+
140
+ // Create texture from surface if not already done
141
+ if (img->texture == NULL) {
142
+ img->texture = SDL_CreateTextureFromSurface(R2D_GetRenderer(), img->surface);
143
+ if (!img->texture) {
144
+ r_raise("SDL_CreateTextureFromSurface failed: %s", SDL_GetError());
145
+ return R_NIL;
146
+ }
147
+ SDL_SetTextureBlendMode(img->texture, SDL_BLENDMODE_BLEND);
148
+ // Keep the surface alive for canvas blitting; R2D_Image_free handles cleanup
149
+ }
150
+
151
+ // Determine flip mode early — affects trim-offset mirroring below.
152
+ SDL_FlipMode flip_mode = SDL_FLIP_NONE;
153
+ R_VAL flip_val = r_ivar_get(obj, id_flip);
154
+ if (r_test(flip_val)) {
155
+ R_ID flip_sym = r_sym_to_id(flip_val);
156
+ if (flip_sym == id_flip_horizontal)
157
+ flip_mode = SDL_FLIP_HORIZONTAL;
158
+ else if (flip_sym == id_flip_vertical)
159
+ flip_mode = SDL_FLIP_VERTICAL;
160
+ else if (flip_sym == id_flip_both)
161
+ flip_mode = (SDL_FlipMode)(SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL);
162
+ }
163
+
164
+ float img_x = obj_float(obj, id_x);
165
+ float img_y = obj_float(obj, id_y);
166
+ float img_w = obj_float(obj, id_width);
167
+ float img_h = obj_float(obj, id_height);
168
+
169
+ SDL_FRect dst_rect;
170
+ SDL_FRect clip_rect;
171
+ SDL_FRect *src_rect = NULL;
172
+
173
+ if (obj_bool(obj, id_clipped)) {
174
+ // Source rect inside the texture, clamped to the area that actually
175
+ // remains after the clip offset. The public accessors (`clip_x=`,
176
+ // `clip_width=`, etc.) are unvalidated, so a zero-size, negative, or
177
+ // past-the-edge clip can reach here; an offset-aware clamp keeps the
178
+ // src rect inside the texture and the scale math finite.
179
+ int orig_width = obj_int(obj, id_orig_width);
180
+ int orig_height = obj_int(obj, id_orig_height);
181
+ int clip_w_int = obj_int(obj, id_clip_width);
182
+ int clip_h_int = obj_int(obj, id_clip_height);
183
+
184
+ int clip_x = (int)obj_float(obj, id_clip_x);
185
+ int clip_y = (int)obj_float(obj, id_clip_y);
186
+ if (clip_x < 0) clip_x = 0;
187
+ if (clip_x > orig_width) clip_x = orig_width;
188
+ if (clip_y < 0) clip_y = 0;
189
+ if (clip_y > orig_height) clip_y = orig_height;
190
+
191
+ int avail_w = orig_width - clip_x;
192
+ int avail_h = orig_height - clip_y;
193
+ int clipped_w = clip_w_int > avail_w ? avail_w : clip_w_int;
194
+ int clipped_h = clip_h_int > avail_h ? avail_h : clip_h_int;
195
+
196
+ // Degenerate or fully out-of-bounds clip: nothing to draw. Bail before
197
+ // the source_w/source_h division so it can't produce Inf/NaN geometry.
198
+ if (clipped_w <= 0 || clipped_h <= 0) return R_TRUE;
199
+
200
+ clip_rect.x = clip_x;
201
+ clip_rect.y = clip_y;
202
+ clip_rect.w = clipped_w;
203
+ clip_rect.h = clipped_h;
204
+ src_rect = &clip_rect;
205
+
206
+ // Trim metadata: `source_width`/`source_height` is the original logical
207
+ // frame size, `trim_x`/`trim_y` is where the packed pixels live within
208
+ // it. With the no-trim defaults (source = clip, trim = 0), the math
209
+ // collapses to drawing the clip rect at (img_x, img_y).
210
+ int source_w = obj_int(obj, id_source_width);
211
+ int source_h = obj_int(obj, id_source_height);
212
+ int trim_x = obj_int(obj, id_trim_x);
213
+ int trim_y = obj_int(obj, id_trim_y);
214
+ if (source_w <= 0) source_w = clipped_w;
215
+ if (source_h <= 0) source_h = clipped_h;
216
+
217
+ // Mirror the trim offset for flipped sprites so the pose flips around
218
+ // the original frame's center, not around the trimmed rect's center.
219
+ if (flip_mode & SDL_FLIP_HORIZONTAL) trim_x = source_w - trim_x - clipped_w;
220
+ if (flip_mode & SDL_FLIP_VERTICAL) trim_y = source_h - trim_y - clipped_h;
221
+
222
+ float scale_x = img_w / (float)source_w;
223
+ float scale_y = img_h / (float)source_h;
224
+
225
+ dst_rect.x = img_x + trim_x * scale_x;
226
+ dst_rect.y = img_y + trim_y * scale_y;
227
+ dst_rect.w = clipped_w * scale_x;
228
+ dst_rect.h = clipped_h * scale_y;
229
+ } else {
230
+ dst_rect.x = img_x;
231
+ dst_rect.y = img_y;
232
+ dst_rect.w = img_w;
233
+ dst_rect.h = img_h;
234
+ }
235
+
236
+ // Read color directly from the Color object
237
+ R_VAL color_obj = r_ivar_get(obj, id_color);
238
+ SDL_SetTextureColorModFloat(img->texture,
239
+ NUM2DBL(r_ivar_get(color_obj, id_r)),
240
+ NUM2DBL(r_ivar_get(color_obj, id_g)),
241
+ NUM2DBL(r_ivar_get(color_obj, id_b))
242
+ );
243
+ SDL_SetTextureAlphaModFloat(img->texture, NUM2DBL(r_ivar_get(color_obj, id_a)));
244
+
245
+ // Rotation center: world coords minus dst_rect's top-left. With trim,
246
+ // the dst rect shifts by (trim_x*scale_x, trim_y*scale_y), so the
247
+ // center-relative offset shifts by the same amount.
248
+ R_VAL urx = r_ivar_get(obj, id_user_rx);
249
+ R_VAL ury = r_ivar_get(obj, id_user_ry);
250
+ float center_rx = r_test(urx) ? NUM2DBL(urx) : img_x + img_w / 2.0f;
251
+ float center_ry = r_test(ury) ? NUM2DBL(ury) : img_y + img_h / 2.0f;
252
+
253
+ SDL_FPoint center = {
254
+ center_rx - dst_rect.x,
255
+ center_ry - dst_rect.y
256
+ };
257
+
258
+ R2D_CheckSDL(SDL_RenderTextureRotated(
259
+ R2D_GetRenderer(),
260
+ img->texture,
261
+ src_rect,
262
+ &dst_rect,
263
+ obj_float(obj, id_rotate),
264
+ &center,
265
+ flip_mode
266
+ ), "SDL_RenderTextureRotated");
267
+
268
+ return R_TRUE;
269
+ }
270
+
271
+
272
+ // Grow-only scratch buffers for image_draw_quads, reused across every call so a
273
+ // per-frame tileset draw costs no malloc/free. Capacity is measured in quads:
274
+ // quad_capacity quads back quad_capacity*4 vertices and quad_capacity*6 indices.
275
+ // Safe as a single shared slot because the render path is single-threaded and
276
+ // each call fully repopulates the vertices before drawing and retains nothing
277
+ // after. Never freed — bounded by the largest tileset ever drawn, matching the
278
+ // engine's no-teardown design. The index buffer is a pure function of quad
279
+ // position (i*4 + {0,1,2,0,2,3}), so it is filled only for the newly grown
280
+ // region and left untouched on every steady-state frame.
281
+ static SDL_Vertex *quad_vertices = NULL;
282
+ static int *quad_indices = NULL;
283
+ static int quad_capacity = 0;
284
+
285
+ /*
286
+ * Ruby2D::Ext.image_draw_quads
287
+ *
288
+ * Draws a batch of textured quads from one atlas texture in a single
289
+ * SDL_RenderGeometry call. Used by Tileset to render every placed tile at once
290
+ * rather than one draw call per tile.
291
+ * coords_batch - Array of N coordinate arrays, each 8 floats
292
+ * [x1,y1, x2,y2, x3,y3, x4,y4]
293
+ * tex_coords_batch - Array of N texture-coordinate arrays, each 8 floats
294
+ * [u1,v1, u2,v2, u3,v3, u4,v4], paired with coords_batch
295
+ * color - Color object with @r, @g, @b, @a, applied to every quad
296
+ *
297
+ * The vertex buffer is fully repopulated on every call, even when no placement
298
+ * changed since the last frame. Don't add a dirty-flag skip: an A/B measured it
299
+ * ~9% slower on tiles_static (299 -> 272 fps) because the per-frame CPU write
300
+ * keeps the buffer hot in cache for SDL_RenderGeometry's immediate read — the
301
+ * "wasted" marshaling is prefetching. See "Tried and rejected" in
302
+ * benchmark/README.md.
303
+ */
304
+ R_VAL ruby2d_ext_image_draw_quads(RUBY2D_METHOD_ARGS_VARIADIC) {
305
+ RUBY2D_EXTRACT_VARIADIC;
306
+ if (argc != 4) r_raise("Ruby2D::Ext.image_draw_quads expects 4 args (image, coords_batch, tex_coords_batch, color), got %d", (int)argc);
307
+ R_VAL obj = argv[0];
308
+ R_VAL coords_batch = argv[1];
309
+ R_VAL tex_coords_batch = argv[2];
310
+ R_VAL color_obj = argv[3];
311
+
312
+ R2D_Image *img;
313
+ obj_struct(obj, id_ext_image, R2D_Image, img);
314
+
315
+ int count = (int)r_ary_len(coords_batch);
316
+ if (count <= 0) return R_TRUE;
317
+
318
+ // Create texture from surface if not already done
319
+ if (img->texture == NULL) {
320
+ img->texture = SDL_CreateTextureFromSurface(
321
+ R2D_GetRenderer(), img->surface
322
+ );
323
+ if (!img->texture) {
324
+ r_raise("SDL_CreateTextureFromSurface failed: %s", SDL_GetError());
325
+ return R_NIL;
56
326
  }
327
+ SDL_SetTextureBlendMode(img->texture, SDL_BLENDMODE_BLEND);
328
+ }
329
+
330
+ // Extract color components (a single tint applied to every quad)
331
+ float cr = NUM2DBL(r_ivar_get(color_obj, id_r));
332
+ float cg = NUM2DBL(r_ivar_get(color_obj, id_g));
333
+ float cb = NUM2DBL(r_ivar_get(color_obj, id_b));
334
+ float ca = NUM2DBL(r_ivar_get(color_obj, id_a));
335
+
336
+ // One batch: 4 vertices and 6 indices per quad, drawn in a single call. Grow
337
+ // the shared scratch buffers if this batch is the largest seen so far; on the
338
+ // steady-state frame (count <= quad_capacity) this is a no-op.
339
+ if (count > quad_capacity) {
340
+ SDL_Vertex *nv = (SDL_Vertex *)realloc(quad_vertices, (size_t)count * 4 * sizeof(SDL_Vertex));
341
+ if (nv) quad_vertices = nv;
342
+ int *ni = (int *)realloc(quad_indices, (size_t)count * 6 * sizeof(int));
343
+ if (ni) quad_indices = ni;
344
+ if (!nv || !ni) {
345
+ r_raise("Ruby2D::Ext.image_draw_quads failed to allocate geometry for %d quads", count);
346
+ return R_NIL;
347
+ }
348
+ // Indices are address-independent and realloc preserves the prefix, so fill
349
+ // only the freshly grown quads [quad_capacity, count).
350
+ for (int i = quad_capacity; i < count; i++) {
351
+ int v = i * 4;
352
+ int x = i * 6;
353
+ quad_indices[x + 0] = v + 0;
354
+ quad_indices[x + 1] = v + 1;
355
+ quad_indices[x + 2] = v + 2;
356
+ quad_indices[x + 3] = v + 0;
357
+ quad_indices[x + 4] = v + 2;
358
+ quad_indices[x + 5] = v + 3;
359
+ }
360
+ quad_capacity = count;
361
+ }
362
+
363
+ for (int i = 0; i < count; i++) {
364
+ R_VAL coords = r_ary_entry(coords_batch, i);
365
+ R_VAL tex = r_ary_entry(tex_coords_batch, i);
366
+ int v = i * 4;
367
+
368
+ quad_vertices[v + 0] = (SDL_Vertex){
369
+ .position = { NUM2DBL(r_ary_entry(coords, 0)), NUM2DBL(r_ary_entry(coords, 1)) },
370
+ .color = { cr, cg, cb, ca },
371
+ .tex_coord = { NUM2DBL(r_ary_entry(tex, 0)), NUM2DBL(r_ary_entry(tex, 1)) }
372
+ };
373
+ quad_vertices[v + 1] = (SDL_Vertex){
374
+ .position = { NUM2DBL(r_ary_entry(coords, 2)), NUM2DBL(r_ary_entry(coords, 3)) },
375
+ .color = { cr, cg, cb, ca },
376
+ .tex_coord = { NUM2DBL(r_ary_entry(tex, 2)), NUM2DBL(r_ary_entry(tex, 3)) }
377
+ };
378
+ quad_vertices[v + 2] = (SDL_Vertex){
379
+ .position = { NUM2DBL(r_ary_entry(coords, 4)), NUM2DBL(r_ary_entry(coords, 5)) },
380
+ .color = { cr, cg, cb, ca },
381
+ .tex_coord = { NUM2DBL(r_ary_entry(tex, 4)), NUM2DBL(r_ary_entry(tex, 5)) }
382
+ };
383
+ quad_vertices[v + 3] = (SDL_Vertex){
384
+ .position = { NUM2DBL(r_ary_entry(coords, 6)), NUM2DBL(r_ary_entry(coords, 7)) },
385
+ .color = { cr, cg, cb, ca },
386
+ .tex_coord = { NUM2DBL(r_ary_entry(tex, 6)), NUM2DBL(r_ary_entry(tex, 7)) }
387
+ };
388
+ }
389
+
390
+ bool ok = SDL_RenderGeometry(R2D_GetRenderer(), img->texture,
391
+ quad_vertices, count * 4, quad_indices, count * 6);
392
+ R2D_CheckSDL(ok, "SDL_RenderGeometry");
393
+
394
+ return R_TRUE;
395
+ }
396
+
397
+
398
+ /*
399
+ * Ruby2D::Image#ext_resize
400
+ *
401
+ * Re-rasterizes the source at a new pixel size. SVG sources reload via
402
+ * IMG_LoadSizedSVG_IO at 2× the requested size; raster sources reload and
403
+ * resample via SDL_ScaleSurface. The cached texture is freed and recreated
404
+ * lazily on the next draw.
405
+ */
406
+ R_VAL ruby2d_ext_image_resize(RUBY2D_METHOD_ARGS_VARIADIC) {
407
+ RUBY2D_EXTRACT_VARIADIC;
408
+ if (argc != 3) r_raise("Ruby2D::Ext.image_resize expects 3 args (image, w, h), got %d", (int)argc);
409
+ R_VAL obj = argv[0];
410
+ R_VAL w_val = argv[1];
411
+ R_VAL h_val = argv[2];
412
+
413
+ R2D_Image *img;
414
+ obj_struct(obj, id_ext_image, R2D_Image, img);
415
+
416
+ int new_w = (int)NUM2DBL(w_val);
417
+ int new_h = (int)NUM2DBL(h_val);
418
+ if (new_w <= 0 || new_h <= 0) {
419
+ r_raise("Image#resize! requires positive width and height");
420
+ return R_NIL;
421
+ }
422
+
423
+ const char *path = obj_str(obj, id_path);
424
+ SDL_Surface *new_surface = NULL;
425
+
426
+ if (path_is_svg(path)) {
427
+ SDL_IOStream *io = SDL_IOFromFile(path, "rb");
428
+ if (io) {
429
+ new_surface = IMG_LoadSizedSVG_IO(io, new_w * 2, new_h * 2);
430
+ SDL_CloseIO(io);
431
+ }
432
+ } else {
433
+ SDL_Surface *src = IMG_Load(path);
434
+ if (src) {
435
+ new_surface = SDL_ScaleSurface(src, new_w, new_h, SDL_SCALEMODE_LINEAR);
436
+ SDL_DestroySurface(src);
437
+ }
438
+ }
439
+
440
+ if (!new_surface) {
441
+ r_raise("Image#resize! failed: %s", SDL_GetError());
442
+ return R_NIL;
443
+ }
444
+
445
+ if (img->surface) SDL_DestroySurface(img->surface);
446
+ if (img->texture) {
447
+ SDL_DestroyTexture(img->texture);
448
+ img->texture = NULL;
449
+ }
450
+ img->surface = new_surface;
451
+
452
+ obj_set_int(obj, id_orig_width, new_surface->w);
453
+ obj_set_int(obj, id_orig_height, new_surface->h);
454
+ obj_set_bool(obj, id_clipped, false);
455
+ obj_set_float(obj, id_clip_x, 0.0);
456
+ obj_set_float(obj, id_clip_y, 0.0);
457
+ obj_set_int(obj, id_clip_width, new_surface->w);
458
+ obj_set_int(obj, id_clip_height, new_surface->h);
459
+ obj_set_int(obj, id_source_width, new_surface->w);
460
+ obj_set_int(obj, id_source_height, new_surface->h);
461
+ obj_set_int(obj, id_trim_x, 0);
462
+ obj_set_int(obj, id_trim_y, 0);
463
+
464
+ return R_TRUE;
465
+ }
466
+
467
+
468
+ /*
469
+ * Free the memory and resources associated with an R2D_Image object
470
+ */
471
+ static void R2D_Image_free(void *p) {
472
+ if (!p) return;
473
+ R2D_Image *img = (R2D_Image *)p;
474
+ if (img->surface) {
475
+ SDL_DestroySurface(img->surface);
476
+ img->surface = NULL;
477
+ }
478
+ if (img->texture) {
479
+ if (R2D_RendererAlive()) SDL_DestroyTexture(img->texture);
480
+ img->texture = NULL;
57
481
  }
482
+ xfree(img);
58
483
  }