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/font.c
CHANGED
|
@@ -1,35 +1,581 @@
|
|
|
1
|
-
// font.c
|
|
1
|
+
// font.c — Internal bitmap font for diagnostic overlays
|
|
2
|
+
//
|
|
3
|
+
// Provides a reusable 5x7 bitmap font covering printable ASCII (0x20–0x7E).
|
|
4
|
+
// Text is rendered to a cached SDL_Texture at physical-pixel resolution so it
|
|
5
|
+
// stays crisp on HiDPI displays, then drawn at logical coordinates.
|
|
2
6
|
|
|
3
7
|
#include "ruby2d.h"
|
|
4
8
|
|
|
5
9
|
|
|
10
|
+
// Glyph Data //////////////////////////////////////////////////////////////////
|
|
11
|
+
//
|
|
12
|
+
// 95 glyphs for printable ASCII (space 0x20 through tilde 0x7E).
|
|
13
|
+
// Each glyph is 7 rows of uint8_t. Bits 4..0 encode columns left-to-right
|
|
14
|
+
// (bit 4 = leftmost, bit 0 = rightmost).
|
|
15
|
+
|
|
16
|
+
static const uint8_t r2d_font_glyphs[R2D_FONT_NUM_GLYPHS][R2D_FONT_GLYPH_HEIGHT] = {
|
|
17
|
+
// 0x20 ' ' (space)
|
|
18
|
+
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
|
19
|
+
// 0x21 '!'
|
|
20
|
+
{ 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x04 },
|
|
21
|
+
// 0x22 '"'
|
|
22
|
+
{ 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00 },
|
|
23
|
+
// 0x23 '#'
|
|
24
|
+
{ 0x0A, 0x0A, 0x1F, 0x0A, 0x1F, 0x0A, 0x0A },
|
|
25
|
+
// 0x24 '$'
|
|
26
|
+
{ 0x04, 0x0F, 0x14, 0x0E, 0x05, 0x1E, 0x04 },
|
|
27
|
+
// 0x25 '%'
|
|
28
|
+
{ 0x18, 0x19, 0x02, 0x04, 0x08, 0x13, 0x03 },
|
|
29
|
+
// 0x26 '&'
|
|
30
|
+
{ 0x0C, 0x12, 0x14, 0x08, 0x15, 0x12, 0x0D },
|
|
31
|
+
// 0x27 '''
|
|
32
|
+
{ 0x0C, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00 },
|
|
33
|
+
// 0x28 '('
|
|
34
|
+
{ 0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x02 },
|
|
35
|
+
// 0x29 ')'
|
|
36
|
+
{ 0x08, 0x04, 0x02, 0x02, 0x02, 0x04, 0x08 },
|
|
37
|
+
// 0x2A '*'
|
|
38
|
+
{ 0x00, 0x04, 0x15, 0x0E, 0x15, 0x04, 0x00 },
|
|
39
|
+
// 0x2B '+'
|
|
40
|
+
{ 0x00, 0x04, 0x04, 0x1F, 0x04, 0x04, 0x00 },
|
|
41
|
+
// 0x2C ','
|
|
42
|
+
{ 0x00, 0x00, 0x00, 0x00, 0x0C, 0x04, 0x08 },
|
|
43
|
+
// 0x2D '-'
|
|
44
|
+
{ 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00 },
|
|
45
|
+
// 0x2E '.'
|
|
46
|
+
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C },
|
|
47
|
+
// 0x2F '/'
|
|
48
|
+
{ 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00 },
|
|
49
|
+
// 0x30 '0'
|
|
50
|
+
{ 0x0E, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0E },
|
|
51
|
+
// 0x31 '1'
|
|
52
|
+
{ 0x04, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x0E },
|
|
53
|
+
// 0x32 '2'
|
|
54
|
+
{ 0x0E, 0x11, 0x01, 0x02, 0x04, 0x08, 0x1F },
|
|
55
|
+
// 0x33 '3'
|
|
56
|
+
{ 0x1F, 0x02, 0x04, 0x02, 0x01, 0x11, 0x0E },
|
|
57
|
+
// 0x34 '4'
|
|
58
|
+
{ 0x02, 0x06, 0x0A, 0x12, 0x1F, 0x02, 0x02 },
|
|
59
|
+
// 0x35 '5'
|
|
60
|
+
{ 0x1F, 0x10, 0x1E, 0x01, 0x01, 0x11, 0x0E },
|
|
61
|
+
// 0x36 '6'
|
|
62
|
+
{ 0x06, 0x08, 0x10, 0x1E, 0x11, 0x11, 0x0E },
|
|
63
|
+
// 0x37 '7'
|
|
64
|
+
{ 0x1F, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08 },
|
|
65
|
+
// 0x38 '8'
|
|
66
|
+
{ 0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E },
|
|
67
|
+
// 0x39 '9'
|
|
68
|
+
{ 0x0E, 0x11, 0x11, 0x0F, 0x01, 0x02, 0x0C },
|
|
69
|
+
// 0x3A ':'
|
|
70
|
+
{ 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00 },
|
|
71
|
+
// 0x3B ';'
|
|
72
|
+
{ 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x04, 0x08 },
|
|
73
|
+
// 0x3C '<'
|
|
74
|
+
{ 0x02, 0x04, 0x08, 0x10, 0x08, 0x04, 0x02 },
|
|
75
|
+
// 0x3D '='
|
|
76
|
+
{ 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00 },
|
|
77
|
+
// 0x3E '>'
|
|
78
|
+
{ 0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08 },
|
|
79
|
+
// 0x3F '?'
|
|
80
|
+
{ 0x0E, 0x11, 0x01, 0x02, 0x04, 0x00, 0x04 },
|
|
81
|
+
// 0x40 '@'
|
|
82
|
+
{ 0x0E, 0x11, 0x17, 0x15, 0x17, 0x10, 0x0E },
|
|
83
|
+
// 0x41 'A'
|
|
84
|
+
{ 0x0E, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11 },
|
|
85
|
+
// 0x42 'B'
|
|
86
|
+
{ 0x1E, 0x11, 0x11, 0x1E, 0x11, 0x11, 0x1E },
|
|
87
|
+
// 0x43 'C'
|
|
88
|
+
{ 0x0E, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0E },
|
|
89
|
+
// 0x44 'D'
|
|
90
|
+
{ 0x1C, 0x12, 0x11, 0x11, 0x11, 0x12, 0x1C },
|
|
91
|
+
// 0x45 'E'
|
|
92
|
+
{ 0x1F, 0x10, 0x10, 0x1E, 0x10, 0x10, 0x1F },
|
|
93
|
+
// 0x46 'F'
|
|
94
|
+
{ 0x1F, 0x10, 0x10, 0x1E, 0x10, 0x10, 0x10 },
|
|
95
|
+
// 0x47 'G'
|
|
96
|
+
{ 0x0E, 0x11, 0x10, 0x17, 0x11, 0x11, 0x0F },
|
|
97
|
+
// 0x48 'H'
|
|
98
|
+
{ 0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11 },
|
|
99
|
+
// 0x49 'I'
|
|
100
|
+
{ 0x0E, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0E },
|
|
101
|
+
// 0x4A 'J'
|
|
102
|
+
{ 0x07, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0C },
|
|
103
|
+
// 0x4B 'K'
|
|
104
|
+
{ 0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11 },
|
|
105
|
+
// 0x4C 'L'
|
|
106
|
+
{ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F },
|
|
107
|
+
// 0x4D 'M'
|
|
108
|
+
{ 0x11, 0x1B, 0x15, 0x15, 0x11, 0x11, 0x11 },
|
|
109
|
+
// 0x4E 'N'
|
|
110
|
+
{ 0x11, 0x11, 0x19, 0x15, 0x13, 0x11, 0x11 },
|
|
111
|
+
// 0x4F 'O'
|
|
112
|
+
{ 0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E },
|
|
113
|
+
// 0x50 'P'
|
|
114
|
+
{ 0x1E, 0x11, 0x11, 0x1E, 0x10, 0x10, 0x10 },
|
|
115
|
+
// 0x51 'Q'
|
|
116
|
+
{ 0x0E, 0x11, 0x11, 0x11, 0x15, 0x12, 0x0D },
|
|
117
|
+
// 0x52 'R'
|
|
118
|
+
{ 0x1E, 0x11, 0x11, 0x1E, 0x14, 0x12, 0x11 },
|
|
119
|
+
// 0x53 'S'
|
|
120
|
+
{ 0x0F, 0x10, 0x10, 0x0E, 0x01, 0x01, 0x1E },
|
|
121
|
+
// 0x54 'T'
|
|
122
|
+
{ 0x1F, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04 },
|
|
123
|
+
// 0x55 'U'
|
|
124
|
+
{ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E },
|
|
125
|
+
// 0x56 'V'
|
|
126
|
+
{ 0x11, 0x11, 0x11, 0x11, 0x11, 0x0A, 0x04 },
|
|
127
|
+
// 0x57 'W'
|
|
128
|
+
{ 0x11, 0x11, 0x11, 0x15, 0x15, 0x1B, 0x11 },
|
|
129
|
+
// 0x58 'X'
|
|
130
|
+
{ 0x11, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x11 },
|
|
131
|
+
// 0x59 'Y'
|
|
132
|
+
{ 0x11, 0x11, 0x0A, 0x04, 0x04, 0x04, 0x04 },
|
|
133
|
+
// 0x5A 'Z'
|
|
134
|
+
{ 0x1F, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1F },
|
|
135
|
+
// 0x5B '['
|
|
136
|
+
{ 0x0E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0E },
|
|
137
|
+
// 0x5C '\'
|
|
138
|
+
{ 0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00 },
|
|
139
|
+
// 0x5D ']'
|
|
140
|
+
{ 0x0E, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0E },
|
|
141
|
+
// 0x5E '^'
|
|
142
|
+
{ 0x04, 0x0A, 0x11, 0x00, 0x00, 0x00, 0x00 },
|
|
143
|
+
// 0x5F '_'
|
|
144
|
+
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F },
|
|
145
|
+
// 0x60 '`'
|
|
146
|
+
{ 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00 },
|
|
147
|
+
// 0x61 'a'
|
|
148
|
+
{ 0x00, 0x00, 0x0E, 0x01, 0x0F, 0x11, 0x0F },
|
|
149
|
+
// 0x62 'b'
|
|
150
|
+
{ 0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x1E },
|
|
151
|
+
// 0x63 'c'
|
|
152
|
+
{ 0x00, 0x00, 0x0E, 0x10, 0x10, 0x11, 0x0E },
|
|
153
|
+
// 0x64 'd'
|
|
154
|
+
{ 0x01, 0x01, 0x0D, 0x13, 0x11, 0x11, 0x0F },
|
|
155
|
+
// 0x65 'e'
|
|
156
|
+
{ 0x00, 0x00, 0x0E, 0x11, 0x1F, 0x10, 0x0E },
|
|
157
|
+
// 0x66 'f'
|
|
158
|
+
{ 0x06, 0x09, 0x08, 0x1C, 0x08, 0x08, 0x08 },
|
|
159
|
+
// 0x67 'g'
|
|
160
|
+
{ 0x00, 0x0F, 0x11, 0x11, 0x0F, 0x01, 0x0E },
|
|
161
|
+
// 0x68 'h'
|
|
162
|
+
{ 0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x11 },
|
|
163
|
+
// 0x69 'i'
|
|
164
|
+
{ 0x04, 0x00, 0x0C, 0x04, 0x04, 0x04, 0x0E },
|
|
165
|
+
// 0x6A 'j'
|
|
166
|
+
{ 0x02, 0x00, 0x06, 0x02, 0x02, 0x12, 0x0C },
|
|
167
|
+
// 0x6B 'k'
|
|
168
|
+
{ 0x10, 0x10, 0x12, 0x14, 0x18, 0x14, 0x12 },
|
|
169
|
+
// 0x6C 'l'
|
|
170
|
+
{ 0x0C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0E },
|
|
171
|
+
// 0x6D 'm'
|
|
172
|
+
{ 0x00, 0x00, 0x1A, 0x15, 0x15, 0x11, 0x11 },
|
|
173
|
+
// 0x6E 'n'
|
|
174
|
+
{ 0x00, 0x00, 0x16, 0x19, 0x11, 0x11, 0x11 },
|
|
175
|
+
// 0x6F 'o'
|
|
176
|
+
{ 0x00, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E },
|
|
177
|
+
// 0x70 'p'
|
|
178
|
+
{ 0x00, 0x00, 0x1E, 0x11, 0x1E, 0x10, 0x10 },
|
|
179
|
+
// 0x71 'q'
|
|
180
|
+
{ 0x00, 0x00, 0x0D, 0x13, 0x0F, 0x01, 0x01 },
|
|
181
|
+
// 0x72 'r'
|
|
182
|
+
{ 0x00, 0x00, 0x16, 0x19, 0x10, 0x10, 0x10 },
|
|
183
|
+
// 0x73 's'
|
|
184
|
+
{ 0x00, 0x00, 0x0E, 0x10, 0x0E, 0x01, 0x1E },
|
|
185
|
+
// 0x74 't'
|
|
186
|
+
{ 0x08, 0x08, 0x1C, 0x08, 0x08, 0x09, 0x06 },
|
|
187
|
+
// 0x75 'u'
|
|
188
|
+
{ 0x00, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0D },
|
|
189
|
+
// 0x76 'v'
|
|
190
|
+
{ 0x00, 0x00, 0x11, 0x11, 0x11, 0x0A, 0x04 },
|
|
191
|
+
// 0x77 'w'
|
|
192
|
+
{ 0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0A },
|
|
193
|
+
// 0x78 'x'
|
|
194
|
+
{ 0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11 },
|
|
195
|
+
// 0x79 'y'
|
|
196
|
+
{ 0x00, 0x00, 0x11, 0x11, 0x0F, 0x01, 0x0E },
|
|
197
|
+
// 0x7A 'z'
|
|
198
|
+
{ 0x00, 0x00, 0x1F, 0x02, 0x04, 0x08, 0x1F },
|
|
199
|
+
// 0x7B '{'
|
|
200
|
+
{ 0x02, 0x04, 0x04, 0x08, 0x04, 0x04, 0x02 },
|
|
201
|
+
// 0x7C '|'
|
|
202
|
+
{ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04 },
|
|
203
|
+
// 0x7D '}'
|
|
204
|
+
{ 0x08, 0x04, 0x04, 0x02, 0x04, 0x04, 0x08 },
|
|
205
|
+
// 0x7E '~'
|
|
206
|
+
{ 0x00, 0x00, 0x08, 0x15, 0x02, 0x00, 0x00 },
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
// Padding inside the semi-transparent background (in logical pixels)
|
|
211
|
+
#define R2D_FONT_PADDING_H 8
|
|
212
|
+
#define R2D_FONT_PADDING_V 10
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
// Bitmap Text API /////////////////////////////////////////////////////////////
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
/*
|
|
219
|
+
* Allocate a new bitmap text handle. All fields are zeroed so the first call
|
|
220
|
+
* to R2D_UpdateBitmapText will create the texture.
|
|
221
|
+
*/
|
|
222
|
+
R2D_BitmapText *R2D_CreateBitmapText(void) {
|
|
223
|
+
R2D_BitmapText *bt = (R2D_BitmapText *)calloc(1, sizeof(R2D_BitmapText));
|
|
224
|
+
return bt;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
|
|
6
228
|
/*
|
|
7
|
-
*
|
|
229
|
+
* Free a bitmap text handle and its cached resources.
|
|
8
230
|
*/
|
|
9
|
-
|
|
231
|
+
void R2D_FreeBitmapText(R2D_BitmapText *bt) {
|
|
232
|
+
if (!bt) return;
|
|
233
|
+
if (bt->texture) SDL_DestroyTexture(bt->texture);
|
|
234
|
+
free(bt->text);
|
|
235
|
+
free(bt);
|
|
236
|
+
}
|
|
237
|
+
|
|
10
238
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
239
|
+
// Drop the cached texture and rendered string so the next draw rebuilds them.
|
|
240
|
+
// Used for full re-inits (ext_create reuse, teardown) — content changes go
|
|
241
|
+
// through R2D_UpdateBitmapText, which keeps the texture and uploads in place.
|
|
242
|
+
static void R2D_InvalidateBitmapText(R2D_BitmapText *bt) {
|
|
243
|
+
if (bt->texture) {
|
|
244
|
+
SDL_DestroyTexture(bt->texture);
|
|
245
|
+
bt->texture = NULL;
|
|
15
246
|
}
|
|
247
|
+
bt->tex_w = 0;
|
|
248
|
+
bt->tex_h = 0;
|
|
249
|
+
bt->content_w = 0;
|
|
250
|
+
bt->content_h = 0;
|
|
251
|
+
free(bt->text);
|
|
252
|
+
bt->text = NULL;
|
|
253
|
+
}
|
|
16
254
|
|
|
17
|
-
TTF_Font *font = TTF_OpenFont(path, size);
|
|
18
255
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
256
|
+
/*
|
|
257
|
+
* Render a string to a cached texture. If the string is identical to the
|
|
258
|
+
* previously rendered one, this is a no-op (cache hit). Otherwise the old
|
|
259
|
+
* texture is destroyed and a new one is built at physical-pixel resolution
|
|
260
|
+
* for HiDPI crispness.
|
|
261
|
+
*
|
|
262
|
+
* Parameters:
|
|
263
|
+
* bt Bitmap text handle (from R2D_CreateBitmapText)
|
|
264
|
+
* renderer The SDL renderer to create the texture on
|
|
265
|
+
* text The string to render (printable ASCII only)
|
|
266
|
+
* scale Logical pixel multiplier per glyph pixel (e.g. 3)
|
|
267
|
+
*/
|
|
268
|
+
void R2D_UpdateBitmapText(R2D_BitmapText *bt, SDL_Renderer *renderer,
|
|
269
|
+
const char *text, int scale) {
|
|
270
|
+
if (!bt || !text) return;
|
|
271
|
+
|
|
272
|
+
// Cache hit — string and scale unchanged
|
|
273
|
+
if (bt->text && strcmp(text, bt->text) == 0 && bt->scale == scale) return;
|
|
274
|
+
|
|
275
|
+
// Drop only the cache key; the texture persists as a grow-only allocation
|
|
276
|
+
// and the new string is uploaded into it below.
|
|
277
|
+
free(bt->text);
|
|
278
|
+
bt->text = NULL;
|
|
279
|
+
|
|
280
|
+
// Each byte renders one glyph cell — a real glyph for printable ASCII, or a
|
|
281
|
+
// placeholder for anything out of range (non-ASCII, control chars). Counting
|
|
282
|
+
// bytes (not just printable ones) keeps the width consistent with ext_create
|
|
283
|
+
// and makes unsupported characters visible instead of silently vanishing.
|
|
284
|
+
int len = (int)strlen(text);
|
|
285
|
+
if (len == 0) {
|
|
286
|
+
// Nothing to render: cache the empty key and zero the content dims so the
|
|
287
|
+
// draw paths skip the (still-allocated) texture with its stale pixels.
|
|
288
|
+
bt->text = strdup(text);
|
|
289
|
+
bt->scale = scale;
|
|
290
|
+
bt->content_w = 0;
|
|
291
|
+
bt->content_h = 0;
|
|
292
|
+
bt->logical_w = 0.0f;
|
|
293
|
+
bt->logical_h = 0.0f;
|
|
294
|
+
return;
|
|
22
295
|
}
|
|
23
296
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
297
|
+
// Build surface at physical-pixel resolution for HiDPI crispness
|
|
298
|
+
float ds = R2D_GetDisplayScale();
|
|
299
|
+
int surface_scale = (int)(scale * ds);
|
|
300
|
+
if (surface_scale < scale) surface_scale = scale;
|
|
301
|
+
|
|
302
|
+
int glyph_w = R2D_FONT_GLYPH_WIDTH * surface_scale;
|
|
303
|
+
int glyph_h = R2D_FONT_GLYPH_HEIGHT * surface_scale;
|
|
304
|
+
int char_spacing = surface_scale;
|
|
305
|
+
int pad_h = bt->background ? (int)(R2D_FONT_PADDING_H * ds) : 0;
|
|
306
|
+
int pad_v = bt->background ? (int)(R2D_FONT_PADDING_V * ds) : 0;
|
|
307
|
+
int surface_w = len * glyph_w + (len - 1) * char_spacing + pad_h;
|
|
308
|
+
int surface_h = glyph_h + pad_v;
|
|
309
|
+
|
|
310
|
+
SDL_Surface *surface = SDL_CreateSurface(surface_w, surface_h, SDL_PIXELFORMAT_RGBA32);
|
|
311
|
+
if (!surface) return;
|
|
312
|
+
|
|
313
|
+
// Semi-transparent black background, or fully transparent when disabled
|
|
314
|
+
Uint8 bg_alpha = bt->background ? 180 : 0;
|
|
315
|
+
SDL_FillSurfaceRect(surface, NULL,
|
|
316
|
+
SDL_MapRGBA(SDL_GetPixelFormatDetails(surface->format), NULL, 0, 0, 0, bg_alpha));
|
|
317
|
+
|
|
318
|
+
int x_offset = bt->background ? (int)(R2D_FONT_PADDING_H * 0.5f * ds) : 0;
|
|
319
|
+
int y_offset = bt->background ? (int)(R2D_FONT_PADDING_V * 0.5f * ds) : 0;
|
|
320
|
+
uint32_t white = SDL_MapRGBA(SDL_GetPixelFormatDetails(surface->format), NULL, 255, 255, 255, 255);
|
|
321
|
+
|
|
322
|
+
for (const char *p = text; *p; p++) {
|
|
323
|
+
unsigned char ch = (unsigned char)*p;
|
|
324
|
+
// Substitute a visible placeholder for unsupported bytes (the font only
|
|
325
|
+
// covers printable ASCII), so dropped characters are noticeable.
|
|
326
|
+
if (ch < R2D_FONT_FIRST_CHAR || ch > R2D_FONT_LAST_CHAR) ch = '?';
|
|
327
|
+
|
|
328
|
+
int glyph_idx = ch - R2D_FONT_FIRST_CHAR;
|
|
329
|
+
const uint8_t *glyph = r2d_font_glyphs[glyph_idx];
|
|
330
|
+
|
|
331
|
+
for (int row = 0; row < R2D_FONT_GLYPH_HEIGHT; row++) {
|
|
332
|
+
for (int col = 0; col < R2D_FONT_GLYPH_WIDTH; col++) {
|
|
333
|
+
if (glyph[row] & (1 << (R2D_FONT_GLYPH_WIDTH - 1 - col))) {
|
|
334
|
+
SDL_Rect pixel = {
|
|
335
|
+
x_offset + col * surface_scale,
|
|
336
|
+
y_offset + row * surface_scale,
|
|
337
|
+
surface_scale,
|
|
338
|
+
surface_scale
|
|
339
|
+
};
|
|
340
|
+
SDL_FillSurfaceRect(surface, &pixel, white);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
x_offset += glyph_w + char_spacing;
|
|
32
346
|
}
|
|
33
347
|
|
|
34
|
-
|
|
348
|
+
/* Refresh the GPU texture — platform-split exactly like text.c's ext_draw
|
|
349
|
+
(see the comment there for the measurements): the web build updates a
|
|
350
|
+
persistent grow-only texture in place, native recreates from the surface
|
|
351
|
+
each change because Metal is faster at create-fresh. */
|
|
352
|
+
#ifdef __EMSCRIPTEN__
|
|
353
|
+
if (bt->texture == NULL || surface_w > bt->tex_w || surface_h > bt->tex_h) {
|
|
354
|
+
int new_w = surface_w > bt->tex_w ? surface_w : bt->tex_w;
|
|
355
|
+
int new_h = surface_h > bt->tex_h ? surface_h : bt->tex_h;
|
|
356
|
+
if (bt->texture) SDL_DestroyTexture(bt->texture);
|
|
357
|
+
bt->texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA32,
|
|
358
|
+
SDL_TEXTUREACCESS_STREAMING, new_w, new_h);
|
|
359
|
+
R2D_CheckSDL(bt->texture != NULL, "SDL_CreateTexture");
|
|
360
|
+
if (bt->texture) {
|
|
361
|
+
SDL_SetTextureBlendMode(bt->texture, SDL_BLENDMODE_BLEND);
|
|
362
|
+
bt->tex_w = new_w;
|
|
363
|
+
bt->tex_h = new_h;
|
|
364
|
+
} else {
|
|
365
|
+
bt->tex_w = 0;
|
|
366
|
+
bt->tex_h = 0;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
if (bt->texture) {
|
|
370
|
+
SDL_Rect upload_rect = { 0, 0, surface_w, surface_h };
|
|
371
|
+
R2D_CheckSDL(SDL_UpdateTexture(bt->texture, &upload_rect, surface->pixels, surface->pitch),
|
|
372
|
+
"SDL_UpdateTexture");
|
|
373
|
+
bt->content_w = surface_w;
|
|
374
|
+
bt->content_h = surface_h;
|
|
375
|
+
}
|
|
376
|
+
#else
|
|
377
|
+
if (bt->texture) SDL_DestroyTexture(bt->texture);
|
|
378
|
+
bt->texture = SDL_CreateTextureFromSurface(renderer, surface);
|
|
379
|
+
R2D_CheckSDL(bt->texture != NULL, "SDL_CreateTextureFromSurface");
|
|
380
|
+
if (bt->texture) {
|
|
381
|
+
bt->content_w = surface_w;
|
|
382
|
+
bt->content_h = surface_h;
|
|
383
|
+
}
|
|
384
|
+
#endif
|
|
385
|
+
SDL_DestroySurface(surface);
|
|
386
|
+
|
|
387
|
+
// If texture creation failed (R2D_CheckSDL only logs), leave the cache key
|
|
388
|
+
// (bt->text / bt->scale) unset so the next draw retries, rather than
|
|
389
|
+
// committing a permanently blank glyph via the cache-hit short-circuit above.
|
|
390
|
+
if (!bt->texture) return;
|
|
391
|
+
|
|
392
|
+
// Compute the logical (window-coordinate) size for rendering
|
|
393
|
+
int logical_glyph_w = R2D_FONT_GLYPH_WIDTH * scale;
|
|
394
|
+
int logical_glyph_h = R2D_FONT_GLYPH_HEIGHT * scale;
|
|
395
|
+
int logical_spacing = scale;
|
|
396
|
+
int logical_pad_h = bt->background ? R2D_FONT_PADDING_H : 0;
|
|
397
|
+
int logical_pad_v = bt->background ? R2D_FONT_PADDING_V : 0;
|
|
398
|
+
bt->logical_w = (float)(len * logical_glyph_w + (len - 1) * logical_spacing + logical_pad_h);
|
|
399
|
+
bt->logical_h = (float)(logical_glyph_h + logical_pad_v);
|
|
400
|
+
|
|
401
|
+
bt->text = strdup(text);
|
|
402
|
+
bt->scale = scale;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
/*
|
|
407
|
+
* Draw the cached bitmap text texture at the given logical coordinates.
|
|
408
|
+
*/
|
|
409
|
+
void R2D_DrawBitmapText(R2D_BitmapText *bt, SDL_Renderer *renderer,
|
|
410
|
+
float x, float y) {
|
|
411
|
+
if (!bt || !bt->texture || bt->content_w <= 0) return;
|
|
412
|
+
|
|
413
|
+
#ifdef __EMSCRIPTEN__
|
|
414
|
+
// Clip to the content within the (possibly larger) persistent texture;
|
|
415
|
+
// native textures are content-sized, so NULL is equivalent (see text.c).
|
|
416
|
+
SDL_FRect src = { 0, 0, (float)bt->content_w, (float)bt->content_h };
|
|
417
|
+
const SDL_FRect *src_p = &src;
|
|
418
|
+
#else
|
|
419
|
+
const SDL_FRect *src_p = NULL;
|
|
420
|
+
#endif
|
|
421
|
+
SDL_FRect dst = { x, y, bt->logical_w, bt->logical_h };
|
|
422
|
+
R2D_CheckSDL(SDL_RenderTexture(renderer, bt->texture, src_p, &dst),
|
|
423
|
+
"SDL_RenderTexture");
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
// Ruby Bindings ///////////////////////////////////////////////////////////////
|
|
428
|
+
|
|
429
|
+
R2D_DEFINE_DATA_TYPE(R2D_BitmapText);
|
|
430
|
+
|
|
431
|
+
// BitmapText-specific ivar IDs. Shared ivar IDs live in ext.c.
|
|
432
|
+
static R_ID id_bt_scale, id_bt_ext;
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
/*
|
|
436
|
+
* Initialize Ruby2D::BitmapText native bindings
|
|
437
|
+
*/
|
|
438
|
+
void R2D_BitmapText_Init() {
|
|
439
|
+
id_bt_scale = r_id("@scale");
|
|
440
|
+
id_bt_ext = r_id("@ext_bitmap_text");
|
|
441
|
+
|
|
442
|
+
r_define_class_method(ruby2d_ext_module, "bitmap_text_create", ruby2d_ext_bitmap_text_create, r_args_variadic);
|
|
443
|
+
r_define_class_method(ruby2d_ext_module, "bitmap_text_draw", ruby2d_ext_bitmap_text_draw, r_args_variadic);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
/*
|
|
448
|
+
* Ruby2D::BitmapText#ext_create
|
|
449
|
+
*
|
|
450
|
+
* Allocates (or reuses) the internal R2D_BitmapText struct and computes the
|
|
451
|
+
* logical width/height from the string length and scale. No renderer is
|
|
452
|
+
* needed — the texture is built lazily in ext_draw.
|
|
453
|
+
*/
|
|
454
|
+
R_VAL ruby2d_ext_bitmap_text_create(RUBY2D_METHOD_ARGS_VARIADIC) {
|
|
455
|
+
RUBY2D_EXTRACT_VARIADIC;
|
|
456
|
+
if (argc != 1) r_raise("Ruby2D::Ext.bitmap_text_create expects 1 arg (text), got %d", (int)argc);
|
|
457
|
+
R_VAL obj = argv[0];
|
|
458
|
+
R2D_Init();
|
|
459
|
+
|
|
460
|
+
const char *msg = obj_str(obj, id_content);
|
|
461
|
+
int scale = obj_int(obj, id_bt_scale);
|
|
462
|
+
|
|
463
|
+
// Check for existing struct — reuse it if present, otherwise allocate new
|
|
464
|
+
R2D_BitmapText *bt = NULL;
|
|
465
|
+
bool is_new = false;
|
|
466
|
+
R_VAL existing = r_iv_get(obj, "@ext_bitmap_text");
|
|
467
|
+
if (r_test(existing)) {
|
|
468
|
+
obj_struct(obj, id_bt_ext, R2D_BitmapText, bt);
|
|
469
|
+
if (bt) {
|
|
470
|
+
R2D_InvalidateBitmapText(bt);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// Allocate new struct only if we don't have one to reuse
|
|
475
|
+
if (!bt) {
|
|
476
|
+
bt = ALLOC(R2D_BitmapText);
|
|
477
|
+
memset(bt, 0, sizeof(R2D_BitmapText));
|
|
478
|
+
is_new = true;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
// One glyph cell per byte (out-of-range bytes draw a placeholder at draw
|
|
482
|
+
// time), matching R2D_UpdateBitmapText so the reported width agrees with
|
|
483
|
+
// what's rendered.
|
|
484
|
+
int len = (msg == NULL) ? 0 : (int)strlen(msg);
|
|
485
|
+
|
|
486
|
+
// Compute logical dimensions (no background padding for user-facing text).
|
|
487
|
+
// Empty content reports a zero-width box at the glyph height — the draw path
|
|
488
|
+
// already no-ops on empty, so no texture is built.
|
|
489
|
+
int logical_w = (len == 0) ? 0
|
|
490
|
+
: len * (R2D_FONT_GLYPH_WIDTH * scale) + (len - 1) * scale;
|
|
491
|
+
int logical_h = R2D_FONT_GLYPH_HEIGHT * scale;
|
|
492
|
+
|
|
493
|
+
// Only set the struct on the Ruby object if we allocated new
|
|
494
|
+
if (is_new) {
|
|
495
|
+
obj_set_struct(obj, id_bt_ext, R2D_BitmapText, bt);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
obj_set_int(obj, id_width, logical_w);
|
|
499
|
+
obj_set_int(obj, id_height, logical_h);
|
|
500
|
+
|
|
501
|
+
return R_TRUE;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
|
|
505
|
+
/*
|
|
506
|
+
* Ruby2D::BitmapText#ext_draw
|
|
507
|
+
*
|
|
508
|
+
* Unwraps the struct, lazily builds/caches the texture via
|
|
509
|
+
* R2D_UpdateBitmapText, applies color and alpha modulation, and draws.
|
|
510
|
+
*/
|
|
511
|
+
R_VAL ruby2d_ext_bitmap_text_draw(RUBY2D_METHOD_ARGS_VARIADIC) {
|
|
512
|
+
RUBY2D_EXTRACT_VARIADIC;
|
|
513
|
+
if (argc != 3) r_raise("Ruby2D::Ext.bitmap_text_draw expects 3 args (text, rx, ry), got %d", (int)argc);
|
|
514
|
+
R_VAL obj = argv[0];
|
|
515
|
+
float crx = NUM2DBL(argv[1]);
|
|
516
|
+
float cry = NUM2DBL(argv[2]);
|
|
517
|
+
R2D_BitmapText *bt;
|
|
518
|
+
obj_struct(obj, id_bt_ext, R2D_BitmapText, bt);
|
|
519
|
+
|
|
520
|
+
const char *msg = obj_str(obj, id_content);
|
|
521
|
+
int scale = obj_int(obj, id_bt_scale);
|
|
522
|
+
|
|
523
|
+
R2D_UpdateBitmapText(bt, R2D_GetRenderer(), msg, scale);
|
|
524
|
+
|
|
525
|
+
if (!bt->texture || bt->content_w <= 0) return R_NIL;
|
|
526
|
+
|
|
527
|
+
SDL_SetTextureBlendMode(bt->texture, SDL_BLENDMODE_BLEND);
|
|
528
|
+
|
|
529
|
+
// Apply color and alpha modulation
|
|
530
|
+
R_VAL color_obj = r_ivar_get(obj, id_color);
|
|
531
|
+
SDL_SetTextureColorModFloat(bt->texture,
|
|
532
|
+
NUM2DBL(r_ivar_get(color_obj, id_r)),
|
|
533
|
+
NUM2DBL(r_ivar_get(color_obj, id_g)),
|
|
534
|
+
NUM2DBL(r_ivar_get(color_obj, id_b))
|
|
535
|
+
);
|
|
536
|
+
SDL_SetTextureAlphaModFloat(bt->texture,
|
|
537
|
+
NUM2DBL(r_ivar_get(color_obj, id_a)));
|
|
538
|
+
|
|
539
|
+
// Rotate about (rx, ry), expressed relative to the texture's top-left — the
|
|
540
|
+
// same convention as Text (see text.c). Reuses the cached texture; only the
|
|
541
|
+
// blit is rotated.
|
|
542
|
+
float x = obj_float(obj, id_x);
|
|
543
|
+
float y = obj_float(obj, id_y);
|
|
544
|
+
#ifdef __EMSCRIPTEN__
|
|
545
|
+
// Clip to the content within the (possibly larger) persistent texture;
|
|
546
|
+
// native textures are content-sized, so NULL is equivalent (see text.c).
|
|
547
|
+
SDL_FRect src = { 0, 0, (float)bt->content_w, (float)bt->content_h };
|
|
548
|
+
const SDL_FRect *src_p = &src;
|
|
549
|
+
#else
|
|
550
|
+
const SDL_FRect *src_p = NULL;
|
|
551
|
+
#endif
|
|
552
|
+
SDL_FRect dst = { x, y, bt->logical_w, bt->logical_h };
|
|
553
|
+
SDL_FPoint center = { crx - x, cry - y };
|
|
554
|
+
|
|
555
|
+
R2D_CheckSDL(SDL_RenderTextureRotated(
|
|
556
|
+
R2D_GetRenderer(),
|
|
557
|
+
bt->texture,
|
|
558
|
+
src_p,
|
|
559
|
+
&dst,
|
|
560
|
+
obj_float(obj, id_rotate),
|
|
561
|
+
¢er,
|
|
562
|
+
SDL_FLIP_NONE
|
|
563
|
+
), "SDL_RenderTextureRotated");
|
|
564
|
+
|
|
565
|
+
return R_TRUE;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
/*
|
|
570
|
+
* Free the memory and resources associated with an R2D_BitmapText object
|
|
571
|
+
*/
|
|
572
|
+
static void R2D_BitmapText_free(void *p) {
|
|
573
|
+
if (!p) return;
|
|
574
|
+
R2D_BitmapText *bt = (R2D_BitmapText *)p;
|
|
575
|
+
if (bt->texture) {
|
|
576
|
+
if (R2D_RendererAlive()) SDL_DestroyTexture(bt->texture);
|
|
577
|
+
bt->texture = NULL;
|
|
578
|
+
}
|
|
579
|
+
free(bt->text);
|
|
580
|
+
xfree(bt);
|
|
35
581
|
}
|
data/ext/ruby2d/fps.c
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// fps.c
|
|
2
|
+
|
|
3
|
+
#include "ruby2d.h"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* Calculates and returns the average frames per second (FPS) over the last
|
|
8
|
+
* FPS_SAMPLE_COUNT frames. Uses a circular buffer to store frame times and
|
|
9
|
+
* computes the rolling average FPS based on the elapsed time between frames.
|
|
10
|
+
*/
|
|
11
|
+
#define FPS_SAMPLE_COUNT 60
|
|
12
|
+
static double frame_times[FPS_SAMPLE_COUNT];
|
|
13
|
+
static double running_total = 0.0; // running sum of the entries in frame_times
|
|
14
|
+
static int frame_index = 0;
|
|
15
|
+
static int frame_count = 0;
|
|
16
|
+
static SDL_Time last_time;
|
|
17
|
+
static bool fps_initialized = false;
|
|
18
|
+
|
|
19
|
+
double R2D_GetFrameRate() {
|
|
20
|
+
SDL_Time current_time;
|
|
21
|
+
double avg_fps = 0.0;
|
|
22
|
+
|
|
23
|
+
if (!SDL_GetCurrentTime(¤t_time)) {
|
|
24
|
+
return 0.0;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (!fps_initialized) {
|
|
28
|
+
// First call only seeds the timer — no delta yet, so we return 0.0
|
|
29
|
+
last_time = current_time;
|
|
30
|
+
fps_initialized = true;
|
|
31
|
+
} else {
|
|
32
|
+
// SDL_GetCurrentTime returns nanoseconds; convert to seconds
|
|
33
|
+
double delta = (current_time - last_time) / 1e9;
|
|
34
|
+
|
|
35
|
+
// Maintain a running sum instead of re-summing the whole window each frame:
|
|
36
|
+
// swap the sample being overwritten out for the new one. frame_times is
|
|
37
|
+
// zero-initialized, so the subtracted term is 0 until the window fills.
|
|
38
|
+
running_total += delta - frame_times[frame_index];
|
|
39
|
+
frame_times[frame_index] = delta;
|
|
40
|
+
frame_index = (frame_index + 1) % FPS_SAMPLE_COUNT;
|
|
41
|
+
if (frame_count < FPS_SAMPLE_COUNT) frame_count++;
|
|
42
|
+
|
|
43
|
+
// Once per full window (on wrap), resync the sum from the buffer to shed any
|
|
44
|
+
// floating-point drift the incremental add/subtract accumulates, so the
|
|
45
|
+
// average stays exactly what a full re-sum would give. O(1) amortized.
|
|
46
|
+
if (frame_index == 0) {
|
|
47
|
+
running_total = 0.0;
|
|
48
|
+
for (int i = 0; i < frame_count; i++) running_total += frame_times[i];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (running_total > 0.0) avg_fps = frame_count / running_total;
|
|
52
|
+
|
|
53
|
+
last_time = current_time;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return avg_fps;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
#define FPS_LOGICAL_SCALE 3
|
|
61
|
+
#define FPS_MARGIN 5 // Offset from the top-left corner of the window
|
|
62
|
+
|
|
63
|
+
static R2D_BitmapText *fps_text = NULL;
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
/*
|
|
67
|
+
* Draws the frame rate in the window using the internal bitmap font.
|
|
68
|
+
* Controlled at runtime by R2D_GetInit*.diagnostics or R2D_GetInit*.show_fps.
|
|
69
|
+
* The overlay texture is cached and only rebuilt when the displayed value changes.
|
|
70
|
+
*/
|
|
71
|
+
void R2D_DrawFrameRate(R2D_Window *window) {
|
|
72
|
+
char fps_str[16];
|
|
73
|
+
snprintf(fps_str, sizeof(fps_str), "%.0f", window->fps);
|
|
74
|
+
|
|
75
|
+
if (!fps_text) {
|
|
76
|
+
fps_text = R2D_CreateBitmapText();
|
|
77
|
+
fps_text->background = true;
|
|
78
|
+
}
|
|
79
|
+
R2D_UpdateBitmapText(fps_text, window->sdl_renderer, fps_str, FPS_LOGICAL_SCALE);
|
|
80
|
+
R2D_DrawBitmapText(fps_text, window->sdl_renderer, (float)FPS_MARGIN, (float)FPS_MARGIN);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
/*
|
|
85
|
+
* Free the cached FPS overlay resources. Called during window cleanup.
|
|
86
|
+
*/
|
|
87
|
+
void R2D_FreeFpsOverlay(void) {
|
|
88
|
+
if (fps_text) {
|
|
89
|
+
R2D_FreeBitmapText(fps_text);
|
|
90
|
+
fps_text = NULL;
|
|
91
|
+
}
|
|
92
|
+
}
|