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.
- checksums.yaml +4 -4
- data/LICENSE.md +7 -0
- data/README.md +141 -0
- data/USAGE.md +2435 -0
- data/assets/Rakefile +637 -0
- data/assets/build_support/CMakeLists.txt +94 -0
- data/assets/build_support/mruby/build_config.rb +34 -0
- data/assets/build_support/mruby/build_config_wasm.rb +30 -0
- data/assets/build_support/sdl_test.c +174 -0
- data/assets/deps.yaml +16 -0
- data/assets/platform/include/SDL3/SDL.h +91 -0
- data/assets/platform/include/SDL3/SDL_assert.h +705 -0
- data/assets/platform/include/SDL3/SDL_asyncio.h +550 -0
- data/assets/platform/include/SDL3/SDL_atomic.h +692 -0
- data/assets/platform/include/SDL3/SDL_audio.h +2370 -0
- data/assets/platform/include/SDL3/SDL_begin_code.h +553 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_bits.h +47 -27
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_blendmode.h +59 -55
- data/assets/platform/include/SDL3/SDL_camera.h +535 -0
- data/assets/platform/include/SDL3/SDL_clipboard.h +331 -0
- data/assets/{include/SDL2/close_code.h → platform/include/SDL3/SDL_close_code.h} +9 -8
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_copying.h +3 -1
- data/assets/platform/include/SDL3/SDL_cpuinfo.h +374 -0
- data/assets/platform/include/SDL3/SDL_dialog.h +343 -0
- data/assets/platform/include/SDL3/SDL_dlopennote.h +234 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_egl.h +11 -8
- data/assets/platform/include/SDL3/SDL_endian.h +645 -0
- data/assets/platform/include/SDL3/SDL_error.h +226 -0
- data/assets/platform/include/SDL3/SDL_events.h +1645 -0
- data/assets/platform/include/SDL3/SDL_filesystem.h +537 -0
- data/assets/platform/include/SDL3/SDL_gamepad.h +1656 -0
- data/assets/platform/include/SDL3/SDL_gpu.h +4608 -0
- data/assets/platform/include/SDL3/SDL_guid.h +106 -0
- data/assets/platform/include/SDL3/SDL_haptic.h +1461 -0
- data/assets/platform/include/SDL3/SDL_hidapi.h +571 -0
- data/assets/platform/include/SDL3/SDL_hints.h +5001 -0
- data/assets/platform/include/SDL3/SDL_init.h +507 -0
- data/assets/platform/include/SDL3/SDL_intrin.h +410 -0
- data/assets/platform/include/SDL3/SDL_iostream.h +1379 -0
- data/assets/platform/include/SDL3/SDL_joystick.h +1385 -0
- data/assets/platform/include/SDL3/SDL_keyboard.h +608 -0
- data/assets/platform/include/SDL3/SDL_keycode.h +347 -0
- data/assets/platform/include/SDL3/SDL_loadso.h +145 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_locale.h +40 -24
- data/assets/platform/include/SDL3/SDL_log.h +541 -0
- data/assets/platform/include/SDL3/SDL_main.h +704 -0
- data/assets/platform/include/SDL3/SDL_main_impl.h +151 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_messagebox.h +85 -48
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_metal.h +29 -29
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_misc.h +13 -12
- data/assets/platform/include/SDL3/SDL_mouse.h +813 -0
- data/assets/platform/include/SDL3/SDL_mutex.h +1117 -0
- data/assets/platform/include/SDL3/SDL_oldnames.h +1339 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl.h +1247 -278
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengl_glext.h +5 -1
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles.h +6 -7
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2.h +10 -11
- data/assets/platform/include/SDL3/SDL_pen.h +198 -0
- data/assets/platform/include/SDL3/SDL_pixels.h +1441 -0
- data/assets/{include/SDL2/SDL_test_log.h → platform/include/SDL3/SDL_platform.h} +25 -26
- data/assets/platform/include/SDL3/SDL_platform_defines.h +497 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_power.h +40 -20
- data/assets/platform/include/SDL3/SDL_process.h +441 -0
- data/assets/platform/include/SDL3/SDL_properties.h +572 -0
- data/assets/platform/include/SDL3/SDL_rect.h +528 -0
- data/assets/platform/include/SDL3/SDL_render.h +3028 -0
- data/assets/platform/include/SDL3/SDL_revision.h +59 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_scancode.h +59 -68
- data/assets/platform/include/SDL3/SDL_sensor.h +321 -0
- data/assets/platform/include/SDL3/SDL_stdinc.h +6186 -0
- data/assets/platform/include/SDL3/SDL_storage.h +686 -0
- data/assets/platform/include/SDL3/SDL_surface.h +1769 -0
- data/assets/platform/include/SDL3/SDL_system.h +840 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test.h +16 -22
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_assert.h +27 -34
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_common.h +109 -52
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_compare.h +22 -14
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_crc32.h +27 -30
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_font.h +50 -49
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_fuzzer.h +64 -79
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_harness.h +47 -30
- data/assets/platform/include/SDL3/SDL_test_log.h +83 -0
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_md5.h +21 -28
- data/assets/{include/SDL2 → platform/include/SDL3}/SDL_test_memory.h +19 -16
- data/assets/platform/include/SDL3/SDL_thread.h +602 -0
- data/assets/platform/include/SDL3/SDL_time.h +249 -0
- data/assets/platform/include/SDL3/SDL_timer.h +454 -0
- data/assets/platform/include/SDL3/SDL_touch.h +184 -0
- data/assets/platform/include/SDL3/SDL_tray.h +544 -0
- data/assets/platform/include/SDL3/SDL_version.h +198 -0
- data/assets/platform/include/SDL3/SDL_video.h +3497 -0
- data/assets/platform/include/SDL3/SDL_vulkan.h +287 -0
- data/assets/platform/include/SDL3_image/SDL_image.h +3328 -0
- data/assets/platform/include/SDL3_mixer/SDL_mixer.h +3369 -0
- data/assets/platform/include/SDL3_ttf/SDL_textengine.h +181 -0
- data/assets/platform/include/SDL3_ttf/SDL_ttf.h +2833 -0
- data/assets/{include → platform/include}/mrbconf.h +42 -31
- data/assets/{include → platform/include}/mruby/array.h +3 -4
- data/assets/{include → platform/include}/mruby/boxing_nan.h +10 -0
- data/assets/platform/include/mruby/boxing_no.h +59 -0
- data/assets/{include → platform/include}/mruby/boxing_word.h +72 -26
- data/assets/platform/include/mruby/class.h +157 -0
- data/assets/{include → platform/include}/mruby/common.h +30 -1
- data/assets/{include → platform/include}/mruby/compile.h +52 -74
- data/assets/{include → platform/include}/mruby/data.h +2 -2
- data/assets/{include → platform/include}/mruby/debug.h +12 -5
- data/assets/{include → platform/include}/mruby/dump.h +7 -9
- data/assets/{include → platform/include}/mruby/endian.h +1 -1
- data/assets/platform/include/mruby/error.h +173 -0
- data/assets/platform/include/mruby/gc.h +79 -0
- data/assets/{include → platform/include}/mruby/hash.h +1 -7
- data/assets/platform/include/mruby/internal.h +282 -0
- data/assets/platform/include/mruby/irep.h +143 -0
- data/assets/{include → platform/include}/mruby/istruct.h +1 -1
- data/assets/platform/include/mruby/khash.h +455 -0
- data/assets/platform/include/mruby/mempool.h +19 -0
- data/assets/{include → platform/include}/mruby/numeric.h +7 -10
- data/assets/platform/include/mruby/object.h +51 -0
- data/assets/{include → platform/include}/mruby/opcode.h +5 -5
- data/assets/{include → platform/include}/mruby/ops.h +19 -6
- data/assets/platform/include/mruby/presym/id.h +1447 -0
- data/assets/{include → platform/include}/mruby/presym/scanning.h +10 -7
- data/assets/platform/include/mruby/presym/table.h +2893 -0
- data/assets/platform/include/mruby/presym.h +65 -0
- data/assets/platform/include/mruby/proc.h +184 -0
- data/assets/{include → platform/include}/mruby/range.h +0 -2
- data/assets/{include → platform/include}/mruby/string.h +33 -53
- data/assets/platform/include/mruby/throw.h +81 -0
- data/assets/{include → platform/include}/mruby/value.h +64 -29
- data/assets/{include → platform/include}/mruby/variable.h +6 -23
- data/assets/{include → platform/include}/mruby/version.h +7 -7
- data/assets/{include → platform/include}/mruby.h +238 -116
- data/assets/platform/macos-arm64/bin/mrbc +0 -0
- data/assets/platform/macos-arm64/lib/libSDL3.a +0 -0
- data/assets/platform/macos-arm64/lib/libSDL3_image.a +0 -0
- data/assets/platform/macos-arm64/lib/libSDL3_mixer.a +0 -0
- data/assets/platform/macos-arm64/lib/libSDL3_ttf.a +0 -0
- data/assets/platform/macos-arm64/lib/libmruby.a +0 -0
- data/assets/platform/wasm/lib/libFLAC.a +0 -0
- data/assets/platform/wasm/lib/libSDL3.a +0 -0
- data/assets/platform/wasm/lib/libSDL3_image.a +0 -0
- data/assets/platform/wasm/lib/libSDL3_mixer.a +0 -0
- data/assets/platform/wasm/lib/libSDL3_ttf.a +0 -0
- data/assets/platform/wasm/lib/libfreetype.a +0 -0
- data/assets/platform/wasm/lib/libharfbuzz.a +0 -0
- data/assets/platform/wasm/lib/libmruby.a +0 -0
- data/assets/platform/wasm/lib/libogg.a +0 -0
- data/assets/platform/wasm/lib/libplutosvg.a +0 -0
- data/assets/platform/wasm/lib/libplutovg.a +0 -0
- data/assets/platform/wasm/lib/libpng.a +0 -0
- data/assets/platform/wasm/lib/libpng16.a +0 -0
- data/assets/platform/wasm/lib/libvorbis.a +0 -0
- data/assets/platform/wasm/lib/libvorbisfile.a +0 -0
- data/assets/platform/wasm/lib/libzlibstatic.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/bin/mrbc.exe +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_image.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
- data/assets/platform/windows-arm64-mingw-ucrt/lib/libmruby.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/bin/mrbc.exe +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_image.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_mixer.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libSDL3_ttf.a +0 -0
- data/assets/platform/windows-x86_64-mingw-ucrt/lib/libmruby.a +0 -0
- data/assets/resources/fonts/outfit/OFL.txt +93 -0
- data/assets/resources/fonts/outfit/outfit.ttf +0 -0
- data/assets/resources/fonts/roboto_mono/OFL.txt +91 -0
- data/assets/resources/fonts/roboto_mono/roboto_mono.ttf +0 -0
- data/assets/resources/icons/icon.icns +0 -0
- data/assets/resources/icons/icon.png +0 -0
- data/assets/resources/spritesheets/License.txt +28 -0
- data/assets/resources/spritesheets/spritesheet-backgrounds.png +0 -0
- data/assets/resources/spritesheets/spritesheet-backgrounds.xml +16 -0
- data/assets/resources/spritesheets/spritesheet-characters.png +0 -0
- data/assets/resources/spritesheets/spritesheet-characters.xml +47 -0
- data/assets/resources/spritesheets/spritesheet-enemies.png +0 -0
- data/assets/resources/spritesheets/spritesheet-enemies.xml +62 -0
- data/assets/resources/spritesheets/spritesheet-tiles.png +0 -0
- data/assets/resources/spritesheets/spritesheet-tiles.xml +316 -0
- data/assets/{wasm → resources/web}/template.html +1 -1
- data/assets/target.rb +131 -0
- data/bin/ruby2d +281 -82
- data/examples/astar.rb +269 -0
- data/examples/asteroids.rb +403 -0
- data/examples/bezier_editor.rb +96 -0
- data/examples/boids.rb +191 -0
- data/examples/bouncing_balls.rb +119 -0
- data/examples/breakout.rb +186 -0
- data/examples/constellations.rb +100 -0
- data/examples/dashboard.rb +133 -0
- data/examples/double_pendulum.rb +254 -0
- data/examples/falling_sand.rb +291 -0
- data/examples/fireworks.rb +110 -0
- data/examples/fluid_dynamics.rb +340 -0
- data/examples/fourier_epicycles.rb +142 -0
- data/examples/fractal_tree.rb +326 -0
- data/examples/game_of_life.rb +148 -0
- data/examples/gamepads.rb +333 -0
- data/examples/hill_driver.rb +613 -0
- data/examples/logo_animation.rb +251 -0
- data/examples/lorenz_attractor.rb +115 -0
- data/examples/mandelbrot.rb +207 -0
- data/examples/marching_squares.rb +200 -0
- data/examples/maze.rb +323 -0
- data/examples/nbody.rb +338 -0
- data/examples/outrun.rb +391 -0
- data/examples/pixel_paint.rb +313 -0
- data/examples/platformer.rb +335 -0
- data/examples/ray_casting_maze.rb +175 -0
- data/examples/shadow_casting.rb +151 -0
- data/examples/shape_recognizer.rb +908 -0
- data/examples/snake.rb +144 -0
- data/examples/sprite_sheets.rb +246 -0
- data/examples/swarm.rb +206 -0
- data/examples/tsp_annealing.rb +104 -0
- data/examples/ui_controls.rb +163 -0
- data/examples/wireframe_3d.rb +139 -0
- data/ext/ruby2d/audio.c +324 -0
- data/ext/ruby2d/canvas.c +1715 -494
- data/ext/ruby2d/ext.c +541 -0
- data/ext/ruby2d/extconf.rb +122 -145
- data/ext/ruby2d/font.c +566 -20
- data/ext/ruby2d/fps.c +92 -0
- data/ext/ruby2d/image.c +466 -41
- data/ext/ruby2d/ruby2d.c +374 -1890
- data/ext/ruby2d/ruby2d.h +840 -460
- data/ext/ruby2d/shapes.c +931 -101
- data/ext/ruby2d/text.c +586 -21
- data/ext/ruby2d/window.c +1693 -283
- data/lib/ruby2d/atlas_parser.rb +194 -0
- data/lib/ruby2d/audio.rb +73 -0
- data/lib/ruby2d/benchmark.rb +259 -0
- data/lib/ruby2d/bitmap_text.rb +155 -0
- data/lib/ruby2d/button.rb +402 -0
- data/lib/ruby2d/canvas.rb +703 -279
- data/lib/ruby2d/circle.rb +206 -29
- data/lib/ruby2d/cli/browser.rb +314 -0
- data/lib/ruby2d/cli/build.rb +471 -257
- data/lib/ruby2d/cli/colorize.rb +7 -5
- data/lib/ruby2d/cli/examples.rb +127 -0
- data/lib/ruby2d/cli/launch.rb +24 -39
- data/lib/ruby2d/cli/lib_files.rb +48 -0
- data/lib/ruby2d/cli/messages.rb +40 -0
- data/lib/ruby2d/cli/setup.rb +273 -0
- data/lib/ruby2d/cli/static_server.rb +160 -0
- data/lib/ruby2d/cli/usage.rb +255 -0
- data/lib/ruby2d/color.rb +191 -69
- data/lib/ruby2d/core.rb +37 -19
- data/lib/ruby2d/deps_help.rb +89 -0
- data/lib/ruby2d/dsl.rb +51 -12
- data/lib/ruby2d/ellipse.rb +228 -0
- data/lib/ruby2d/exceptions.rb +0 -2
- data/lib/ruby2d/font.rb +34 -74
- data/lib/ruby2d/gamepad.rb +323 -0
- data/lib/ruby2d/gem_paths.rb +19 -0
- data/lib/ruby2d/image.rb +155 -52
- data/lib/ruby2d/interactive.rb +103 -0
- data/lib/ruby2d/json_parser.rb +268 -0
- data/lib/ruby2d/line.rb +194 -85
- data/lib/ruby2d/mruby_compat.rb +12 -0
- data/lib/ruby2d/polygon.rb +297 -0
- data/lib/ruby2d/polyline.rb +368 -0
- data/lib/ruby2d/quad.rb +358 -94
- data/lib/ruby2d/rectangle.rb +77 -19
- data/lib/ruby2d/renderable.rb +411 -11
- data/lib/ruby2d/sprite.rb +471 -180
- data/lib/ruby2d/sprite_sheet.rb +64 -0
- data/lib/ruby2d/square.rb +29 -17
- data/lib/ruby2d/text.rb +196 -65
- data/lib/ruby2d/tileset.rb +139 -81
- data/lib/ruby2d/triangle.rb +324 -89
- data/lib/ruby2d/version.rb +1 -3
- data/lib/ruby2d/vertices.rb +62 -85
- data/lib/ruby2d/warnings.rb +29 -0
- data/lib/ruby2d/window/class_methods.rb +218 -0
- data/lib/ruby2d/window/gamepad_events.rb +141 -0
- data/lib/ruby2d/window/key_events.rb +74 -0
- data/lib/ruby2d/window/mouse_events.rb +171 -0
- data/lib/ruby2d/window/object_events.rb +168 -0
- data/lib/ruby2d/window.rb +632 -585
- data/lib/ruby2d.rb +14 -19
- metadata +275 -443
- data/assets/app.icns +0 -0
- data/assets/include/GL/glew.h +0 -26427
- data/assets/include/GLES2/gl2.h +0 -656
- data/assets/include/GLES2/gl2ext.h +0 -3949
- data/assets/include/GLES2/gl2ext_angle.h +0 -701
- data/assets/include/GLES2/gl2platform.h +0 -27
- data/assets/include/GLES3/gl3.h +0 -1192
- data/assets/include/GLES3/gl31.h +0 -1507
- data/assets/include/GLES3/gl32.h +0 -1808
- data/assets/include/GLES3/gl3platform.h +0 -27
- data/assets/include/KHR/khrplatform.h +0 -290
- data/assets/include/SDL2/SDL.h +0 -233
- data/assets/include/SDL2/SDL_assert.h +0 -326
- data/assets/include/SDL2/SDL_atomic.h +0 -415
- data/assets/include/SDL2/SDL_audio.h +0 -1500
- data/assets/include/SDL2/SDL_clipboard.h +0 -141
- data/assets/include/SDL2/SDL_config.h +0 -61
- data/assets/include/SDL2/SDL_config_android.h +0 -194
- data/assets/include/SDL2/SDL_config_emscripten.h +0 -218
- data/assets/include/SDL2/SDL_config_iphoneos.h +0 -217
- data/assets/include/SDL2/SDL_config_macosx.h +0 -277
- data/assets/include/SDL2/SDL_config_minimal.h +0 -95
- data/assets/include/SDL2/SDL_config_ngage.h +0 -89
- data/assets/include/SDL2/SDL_config_os2.h +0 -207
- data/assets/include/SDL2/SDL_config_pandora.h +0 -141
- data/assets/include/SDL2/SDL_config_windows.h +0 -331
- data/assets/include/SDL2/SDL_config_wingdk.h +0 -253
- data/assets/include/SDL2/SDL_config_winrt.h +0 -220
- data/assets/include/SDL2/SDL_config_xbox.h +0 -235
- data/assets/include/SDL2/SDL_cpuinfo.h +0 -594
- data/assets/include/SDL2/SDL_endian.h +0 -348
- data/assets/include/SDL2/SDL_error.h +0 -163
- data/assets/include/SDL2/SDL_events.h +0 -1166
- data/assets/include/SDL2/SDL_filesystem.h +0 -149
- data/assets/include/SDL2/SDL_gamecontroller.h +0 -1074
- data/assets/include/SDL2/SDL_gesture.h +0 -117
- data/assets/include/SDL2/SDL_guid.h +0 -100
- data/assets/include/SDL2/SDL_haptic.h +0 -1341
- data/assets/include/SDL2/SDL_hidapi.h +0 -451
- data/assets/include/SDL2/SDL_hints.h +0 -2569
- data/assets/include/SDL2/SDL_image.h +0 -2173
- data/assets/include/SDL2/SDL_joystick.h +0 -1066
- data/assets/include/SDL2/SDL_keyboard.h +0 -353
- data/assets/include/SDL2/SDL_keycode.h +0 -358
- data/assets/include/SDL2/SDL_loadso.h +0 -115
- data/assets/include/SDL2/SDL_log.h +0 -404
- data/assets/include/SDL2/SDL_main.h +0 -275
- data/assets/include/SDL2/SDL_mixer.h +0 -2784
- data/assets/include/SDL2/SDL_mouse.h +0 -465
- data/assets/include/SDL2/SDL_mutex.h +0 -471
- data/assets/include/SDL2/SDL_name.h +0 -33
- data/assets/include/SDL2/SDL_pixels.h +0 -644
- data/assets/include/SDL2/SDL_platform.h +0 -261
- data/assets/include/SDL2/SDL_quit.h +0 -58
- data/assets/include/SDL2/SDL_rect.h +0 -376
- data/assets/include/SDL2/SDL_render.h +0 -1919
- data/assets/include/SDL2/SDL_revision.h +0 -6
- data/assets/include/SDL2/SDL_rwops.h +0 -841
- data/assets/include/SDL2/SDL_sensor.h +0 -322
- data/assets/include/SDL2/SDL_shape.h +0 -155
- data/assets/include/SDL2/SDL_stdinc.h +0 -830
- data/assets/include/SDL2/SDL_surface.h +0 -997
- data/assets/include/SDL2/SDL_system.h +0 -623
- data/assets/include/SDL2/SDL_syswm.h +0 -386
- data/assets/include/SDL2/SDL_test_images.h +0 -78
- data/assets/include/SDL2/SDL_test_random.h +0 -115
- data/assets/include/SDL2/SDL_thread.h +0 -464
- data/assets/include/SDL2/SDL_timer.h +0 -222
- data/assets/include/SDL2/SDL_touch.h +0 -150
- data/assets/include/SDL2/SDL_ttf.h +0 -2316
- data/assets/include/SDL2/SDL_types.h +0 -29
- data/assets/include/SDL2/SDL_version.h +0 -204
- data/assets/include/SDL2/SDL_video.h +0 -2150
- data/assets/include/SDL2/SDL_vulkan.h +0 -215
- data/assets/include/SDL2/begin_code.h +0 -187
- data/assets/include/mruby/boxing_no.h +0 -58
- data/assets/include/mruby/class.h +0 -108
- data/assets/include/mruby/error.h +0 -147
- data/assets/include/mruby/gc.h +0 -94
- data/assets/include/mruby/irep.h +0 -147
- data/assets/include/mruby/khash.h +0 -284
- data/assets/include/mruby/object.h +0 -43
- data/assets/include/mruby/presym/disable.h +0 -70
- data/assets/include/mruby/presym/enable.h +0 -37
- data/assets/include/mruby/presym.h +0 -40
- data/assets/include/mruby/proc.h +0 -211
- data/assets/include/mruby/throw.h +0 -66
- data/assets/macos/universal/bin/mrbc +0 -0
- data/assets/macos/universal/lib/libFLAC.a +0 -0
- data/assets/macos/universal/lib/libSDL2.a +0 -0
- data/assets/macos/universal/lib/libSDL2_image.a +0 -0
- data/assets/macos/universal/lib/libSDL2_mixer.a +0 -0
- data/assets/macos/universal/lib/libSDL2_ttf.a +0 -0
- data/assets/macos/universal/lib/libavif.a +0 -0
- data/assets/macos/universal/lib/libbrotlicommon-static.a +0 -0
- data/assets/macos/universal/lib/libbrotlidec-static.a +0 -0
- data/assets/macos/universal/lib/libfreetype.a +0 -0
- data/assets/macos/universal/lib/libgraphite2.a +0 -0
- data/assets/macos/universal/lib/libharfbuzz.a +0 -0
- data/assets/macos/universal/lib/libhwy.a +0 -0
- data/assets/macos/universal/lib/libjpeg.a +0 -0
- data/assets/macos/universal/lib/libjxl.a +0 -0
- data/assets/macos/universal/lib/libmodplug.a +0 -0
- data/assets/macos/universal/lib/libmpg123.a +0 -0
- data/assets/macos/universal/lib/libmruby.a +0 -0
- data/assets/macos/universal/lib/libogg.a +0 -0
- data/assets/macos/universal/lib/libpng.a +0 -0
- data/assets/macos/universal/lib/libtiff.a +0 -0
- data/assets/macos/universal/lib/libvorbis.a +0 -0
- data/assets/macos/universal/lib/libvorbisfile.a +0 -0
- data/assets/macos/universal/lib/libwebp.a +0 -0
- data/assets/macos/universal/lib/libzstd.a +0 -0
- data/assets/test_media/README.md +0 -3
- data/assets/test_media/bitstream_vera/COPYRIGHT.txt +0 -124
- data/assets/test_media/bitstream_vera/vera.ttf +0 -0
- data/assets/test_media/boom.png +0 -0
- data/assets/test_media/coin.png +0 -0
- data/assets/test_media/colors.png +0 -0
- data/assets/test_media/controller.png +0 -0
- data/assets/test_media/dial.wav +0 -0
- data/assets/test_media/hero.png +0 -0
- data/assets/test_media/image.bmp +0 -0
- data/assets/test_media/image.jpg +0 -0
- data/assets/test_media/image.png +0 -0
- data/assets/test_media/music.flac +0 -0
- data/assets/test_media/music.mp3 +0 -0
- data/assets/test_media/music.ogg +0 -0
- data/assets/test_media/music.wav +0 -0
- data/assets/test_media/originals/boom.pxm +0 -0
- data/assets/test_media/originals/coin.pxm +0 -0
- data/assets/test_media/originals/controller.sketch +0 -0
- data/assets/test_media/originals/hero.pxm +0 -0
- data/assets/test_media/originals/image.pxm +0 -0
- data/assets/test_media/originals/music.caf +0 -0
- data/assets/test_media/originals/texture_atlas.pxm +0 -0
- data/assets/test_media/rondo_alla_turka.ogg +0 -0
- data/assets/test_media/sound.flac +0 -0
- data/assets/test_media/sound.mp3 +0 -0
- data/assets/test_media/sound.ogg +0 -0
- data/assets/test_media/sound.wav +0 -0
- data/assets/test_media/sprite_sheet.png +0 -0
- data/assets/test_media/texture_atlas.png +0 -0
- data/assets/wasm/libmruby.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/bin/mrbc.exe +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libFLAC.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libLerc.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_image.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_mixer.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_ttf.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlicommon.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlidec.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbz2.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libdeflate.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libfreetype.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libglew32.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libgraphite2.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libharfbuzz.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libhwy.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjbig.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjpeg.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjxl.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/liblzma.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmodplug.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmpg123.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmruby.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libogg.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopus.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopusfile.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libpng.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libsndfile.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libssp.a +0 -1
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libstdc++.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libtiff.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbis.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbisfile.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libwebp.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libz.a +0 -0
- data/assets/windows/mingw-w64-ucrt-x86_64/lib/libzstd.a +0 -0
- data/assets/windows/mingw-w64-x86_64/bin/mrbc.exe +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libFLAC.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libLerc.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libSDL2.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libSDL2_image.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libSDL2_mixer.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libSDL2_ttf.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libbrotlicommon.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libbrotlidec.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libbz2.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libdeflate.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libfreetype.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libglew32.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libgraphite2.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libharfbuzz.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libhwy.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libjbig.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libjpeg.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libjxl.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/liblzma.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libmodplug.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libmpg123.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libmruby.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libogg.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libopus.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libopusfile.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libpng.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libsndfile.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libssp.a +0 -1
- data/assets/windows/mingw-w64-x86_64/lib/libstdc++.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libtiff.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libvorbis.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libvorbisfile.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libwebp.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libz.a +0 -0
- data/assets/windows/mingw-w64-x86_64/lib/libzstd.a +0 -0
- data/assets/xcode/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
- data/assets/xcode/ios/Assets.xcassets/Contents.json +0 -6
- data/assets/xcode/ios/Base.lproj/LaunchScreen.storyboard +0 -27
- data/assets/xcode/ios/Info.plist +0 -43
- data/assets/xcode/ios/MRuby.framework/Headers/mrbconf.h +0 -143
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/array.h +0 -280
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/class.h +0 -97
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/common.h +0 -77
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/compile.h +0 -195
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/data.h +0 -75
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/debug.h +0 -67
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/dump.h +0 -196
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/error.h +0 -75
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/gc.h +0 -91
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/hash.h +0 -215
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/irep.h +0 -75
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/istruct.h +0 -47
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/khash.h +0 -274
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/numeric.h +0 -161
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/object.h +0 -44
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/opcode.h +0 -69
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/ops.h +0 -117
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/proc.h +0 -131
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/range.h +0 -49
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/re.h +0 -16
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/string.h +0 -444
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/throw.h +0 -55
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/value.h +0 -309
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/variable.h +0 -136
- data/assets/xcode/ios/MRuby.framework/Headers/mruby/version.h +0 -110
- data/assets/xcode/ios/MRuby.framework/Headers/mruby.h +0 -1282
- data/assets/xcode/ios/MRuby.framework/Info.plist +0 -20
- data/assets/xcode/ios/MRuby.framework/MRuby +0 -0
- data/assets/xcode/ios/MyApp.xcodeproj/project.pbxproj +0 -368
- data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- data/assets/xcode/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
- data/assets/xcode/ios/main.c +0 -1
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +0 -17
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +0 -17
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +0 -32
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +0 -16
- data/assets/xcode/tvos/Assets.xcassets/Contents.json +0 -6
- data/assets/xcode/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +0 -22
- data/assets/xcode/tvos/Info.plist +0 -30
- data/assets/xcode/tvos/MRuby.framework/Headers/mrbconf.h +0 -143
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/array.h +0 -280
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_nan.h +0 -102
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_no.h +0 -56
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/boxing_word.h +0 -144
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/class.h +0 -97
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/common.h +0 -77
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/compile.h +0 -195
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/data.h +0 -75
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/debug.h +0 -67
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/dump.h +0 -196
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/error.h +0 -75
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/gc.h +0 -91
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/hash.h +0 -215
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/irep.h +0 -75
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/istruct.h +0 -47
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/khash.h +0 -274
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/numeric.h +0 -161
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/object.h +0 -44
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/opcode.h +0 -69
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/ops.h +0 -117
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/proc.h +0 -131
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/range.h +0 -49
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/re.h +0 -16
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/string.h +0 -444
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/throw.h +0 -55
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/value.h +0 -309
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/variable.h +0 -136
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby/version.h +0 -110
- data/assets/xcode/tvos/MRuby.framework/Headers/mruby.h +0 -1282
- data/assets/xcode/tvos/MRuby.framework/Info.plist +0 -20
- data/assets/xcode/tvos/MRuby.framework/MRuby +0 -0
- data/assets/xcode/tvos/MyApp.xcodeproj/project.pbxproj +0 -350
- data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- data/assets/xcode/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +0 -30
- data/assets/xcode/tvos/main.c +0 -1
- data/ext/ruby2d/common.c +0 -185
- data/ext/ruby2d/controllers.c +0 -110
- data/ext/ruby2d/gl.c +0 -398
- data/ext/ruby2d/gl2.c +0 -86
- data/ext/ruby2d/gl3.c +0 -304
- data/ext/ruby2d/gles.c +0 -302
- data/ext/ruby2d/input.c +0 -48
- data/ext/ruby2d/music.c +0 -127
- data/ext/ruby2d/sound.c +0 -132
- data/lib/ruby2d/cli/console.rb +0 -65
- data/lib/ruby2d/cli/enable_console.rb +0 -7
- data/lib/ruby2d/cli/platform.rb +0 -17
- data/lib/ruby2d/music.rb +0 -77
- data/lib/ruby2d/pixel.rb +0 -18
- data/lib/ruby2d/pixmap.rb +0 -39
- data/lib/ruby2d/pixmap_atlas.rb +0 -56
- data/lib/ruby2d/sound.rb +0 -61
- data/lib/ruby2d/texture.rb +0 -38
- /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2.h +0 -0
- /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2ext.h +0 -0
- /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_gl2platform.h +0 -0
- /data/assets/{include/SDL2 → platform/include/SDL3}/SDL_opengles2_khrplatform.h +0 -0
- /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
|
-
|
|
7
|
-
|
|
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
|
-
|
|
12
|
-
return
|
|
73
|
+
r_error("Image file `%s` not found", path);
|
|
74
|
+
return R_NIL;
|
|
13
75
|
}
|
|
14
76
|
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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 2× 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
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
+
¢er,
|
|
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
|
}
|