ruby2d 0.12.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 -428
- data/assets/app.icns +0 -0
- 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/lib/ruby2d/circle.rb
CHANGED
|
@@ -1,58 +1,235 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
# Ruby2D::Circle
|
|
4
2
|
|
|
5
3
|
module Ruby2D
|
|
6
|
-
#
|
|
7
|
-
# Create a circle using +Circle.new+
|
|
8
|
-
#
|
|
4
|
+
# A circle
|
|
9
5
|
class Circle
|
|
10
6
|
include Renderable
|
|
11
7
|
|
|
12
|
-
attr_accessor :
|
|
8
|
+
attr_accessor :radius, :sectors, :rotate, :fill, :stroke_width
|
|
9
|
+
attr_reader :x, :y, :stroke_color
|
|
10
|
+
alias_method :stroke_colour, :stroke_color
|
|
11
|
+
|
|
12
|
+
# Set the x position (the center). Pass a symbol (`:left`, `:center`,
|
|
13
|
+
# `:right`) to set alignment intent — resolved at draw time against the
|
|
14
|
+
# window, with the circle's bounding box hugging the chosen edge.
|
|
15
|
+
def x=(value)
|
|
16
|
+
return self.x_align = value if value.is_a?(Symbol)
|
|
17
|
+
@x_align = nil unless @_resolving_alignment
|
|
18
|
+
@x = value
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Set the y position (the center). Pass a symbol (`:top`, `:center`,
|
|
22
|
+
# `:bottom`) to set alignment intent.
|
|
23
|
+
def y=(value)
|
|
24
|
+
return self.y_align = value if value.is_a?(Symbol)
|
|
25
|
+
@y_align = nil unless @_resolving_alignment
|
|
26
|
+
@y = value
|
|
27
|
+
end
|
|
13
28
|
|
|
14
29
|
# Create a circle
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
30
|
+
def initialize(x: 0, y: 0, z: 0, radius: 50, sectors: 30,
|
|
31
|
+
rotate: 0, rx: nil, ry: nil,
|
|
32
|
+
color: nil, colour: nil, opacity: nil,
|
|
33
|
+
fill: true, stroke_width: 0, stroke_color: nil, stroke_colour: nil,
|
|
34
|
+
add: true, visible: true,
|
|
35
|
+
padding: nil, padding_top: nil, padding_right: nil,
|
|
36
|
+
padding_bottom: nil, padding_left: nil)
|
|
37
|
+
x, y = _extract_alignment(x, y)
|
|
38
|
+
_apply_padding(padding, padding_top, padding_right, padding_bottom, padding_left)
|
|
39
|
+
_validate_dimensions(radius: radius)
|
|
25
40
|
@x = x
|
|
26
41
|
@y = y
|
|
27
42
|
@z = z
|
|
28
43
|
@radius = radius
|
|
29
44
|
@sectors = sectors
|
|
45
|
+
@rotate = rotate
|
|
46
|
+
@_user_rx = rx
|
|
47
|
+
@_user_ry = ry
|
|
30
48
|
self.color = color || colour || 'white'
|
|
31
|
-
self.
|
|
32
|
-
|
|
49
|
+
self.opacity = opacity unless opacity.nil?
|
|
50
|
+
@fill = fill
|
|
51
|
+
@stroke_width = stroke_width
|
|
52
|
+
self.stroke_color = stroke_color || stroke_colour || (color || colour)
|
|
53
|
+
self.stroke_color.opacity = opacity unless opacity.nil?
|
|
54
|
+
@visible = visible
|
|
55
|
+
self.add if add
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Set the stroke color. Single-color only — a per-vertex array is rejected.
|
|
59
|
+
def stroke_color=(c)
|
|
60
|
+
resolved = c.nil? ? nil : Color.set(c)
|
|
61
|
+
if resolved.is_a?(Color::Set)
|
|
62
|
+
raise ArgumentError, "`#{self.class}` does not support per-vertex stroke colors; pass a single color"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
@stroke_color = resolved || Color.new('white')
|
|
66
|
+
@_stroke_cc = nil
|
|
67
|
+
end
|
|
68
|
+
alias_method :stroke_colour=, :stroke_color=
|
|
69
|
+
|
|
70
|
+
# Get the rotation center x coordinate
|
|
71
|
+
def rx
|
|
72
|
+
@_user_rx.nil? ? @x : @_user_rx
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Get the rotation center y coordinate
|
|
76
|
+
def ry
|
|
77
|
+
@_user_ry.nil? ? @y : @_user_ry
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Set the rotation center x coordinate
|
|
81
|
+
def rx=(val)
|
|
82
|
+
@_user_rx = val
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Set the rotation center y coordinate
|
|
86
|
+
def ry=(val)
|
|
87
|
+
@_user_ry = val
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Bounding-box width and height (the diameter)
|
|
91
|
+
def width
|
|
92
|
+
@radius * 2
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def height
|
|
96
|
+
@radius * 2
|
|
33
97
|
end
|
|
34
98
|
|
|
35
|
-
#
|
|
99
|
+
# Set the color value. Single-color only — a per-vertex color array is
|
|
100
|
+
# rejected with a clear message rather than a generic "not a valid color".
|
|
101
|
+
def color=(color)
|
|
102
|
+
c = Color.set(color)
|
|
103
|
+
if c.is_a?(Color::Set)
|
|
104
|
+
raise ArgumentError, "`#{self.class}` does not support per-vertex colors; pass a single color"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
@color = c
|
|
108
|
+
@_cc = nil # invalidate cached color components
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Check if the circle contains the given point. Compares squared distance
|
|
112
|
+
# to squared radius to skip the square root on this per-event hit path. A
|
|
113
|
+
# negative radius (reachable via the unguarded runtime setter) contains
|
|
114
|
+
# nothing, matching the old `sqrt(...) <= @radius` behavior the squared form
|
|
115
|
+
# would otherwise lose.
|
|
36
116
|
def contains?(x, y)
|
|
37
|
-
|
|
117
|
+
return false if @radius.negative?
|
|
118
|
+
x, y = _unrotate(x, y) if @rotate != 0
|
|
119
|
+
dx = x - @x
|
|
120
|
+
dy = y - @y
|
|
121
|
+
dx * dx + dy * dy <= @radius * @radius
|
|
38
122
|
end
|
|
39
123
|
|
|
40
|
-
|
|
124
|
+
# Render a circle without creating an instance
|
|
125
|
+
def self.render(x: 0, y: 0, radius: 50, sectors: 30, rotate: 0,
|
|
126
|
+
rx: nil, ry: nil, color: nil, colour: nil, opacity: nil,
|
|
127
|
+
fill: true, stroke_width: 0, stroke_color: nil, stroke_colour: nil)
|
|
128
|
+
fill_input = color || colour
|
|
129
|
+
explicit_stroke = stroke_color || stroke_colour
|
|
130
|
+
stroke_input = explicit_stroke || fill_input
|
|
131
|
+
# Reject a per-vertex stroke color, matching the instance setter — circles
|
|
132
|
+
# have a single stroke color. Only check when the stroke is drawn or an
|
|
133
|
+
# explicit stroke color was given, so an invalid one still raises.
|
|
134
|
+
if (stroke_width > 0 || !explicit_stroke.nil?) && !stroke_input.nil? &&
|
|
135
|
+
Color.set(stroke_input).is_a?(Color::Set)
|
|
136
|
+
raise ArgumentError, "`#{self}` does not support per-vertex stroke colors; pass a single color"
|
|
137
|
+
end
|
|
138
|
+
|
|
41
139
|
Window.render_ready_check
|
|
140
|
+
# Resolve the fill color once (as Quad#draw_immediate does). The common
|
|
141
|
+
# case — a single Color with scalar opacity — reads the resolved
|
|
142
|
+
# channels directly; only a `Color::Set` or per-vertex opacity array
|
|
143
|
+
# pays for the flattened array (and gets the arity errors it raises).
|
|
144
|
+
# `for_render` returns a shared cached instance — read-only here.
|
|
145
|
+
resolved = Color.for_render(fill_input.nil? ? 'white' : fill_input)
|
|
146
|
+
uniform = !resolved.is_a?(Color::Set) && !opacity.is_a?(Array)
|
|
147
|
+
c = uniform ? nil : Renderable.flatten_resolved_color(resolved, 1, opacity, label: self)
|
|
42
148
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
149
|
+
if rotate != 0
|
|
150
|
+
cx = rx || x
|
|
151
|
+
cy = ry || y
|
|
152
|
+
rad = rotate * Math::PI / 180.0
|
|
153
|
+
sa = Math.sin(rad); ca = Math.cos(rad)
|
|
154
|
+
dx = x - cx; dy = y - cy
|
|
155
|
+
x = dx * ca - dy * sa + cx
|
|
156
|
+
y = dx * sa + dy * ca + cy
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
if fill
|
|
160
|
+
if uniform
|
|
161
|
+
Ext.draw_circle(x, y, radius, sectors,
|
|
162
|
+
resolved.r, resolved.g, resolved.b, opacity || resolved.a)
|
|
163
|
+
else
|
|
164
|
+
Ext.draw_circle(x, y, radius, sectors, c[0], c[1], c[2], c[3])
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
# Resolve the stroke color only when actually stroking.
|
|
168
|
+
if stroke_width > 0
|
|
169
|
+
sc = Renderable.resolve_single_color(stroke_input) || Color.new('white')
|
|
170
|
+
sc = Color.new(sc)
|
|
171
|
+
sc.opacity = opacity if opacity
|
|
172
|
+
Ext.stroke_circle(x, y, radius, sectors, stroke_width, sc.r, sc.g, sc.b, sc.a)
|
|
173
|
+
end
|
|
47
174
|
end
|
|
48
175
|
|
|
49
176
|
private
|
|
50
177
|
|
|
178
|
+
# Circle is center-anchored, so shift the alignment resolver's bounding-box
|
|
179
|
+
# top-left result by the radius to land on the center.
|
|
180
|
+
def _alignment_anchor_dx
|
|
181
|
+
@radius
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def _alignment_anchor_dy
|
|
185
|
+
@radius
|
|
186
|
+
end
|
|
187
|
+
|
|
51
188
|
def render
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
189
|
+
_resolve_alignment
|
|
190
|
+
ensure_cc
|
|
191
|
+
ensure_scc if @stroke_width && @stroke_width > 0
|
|
192
|
+
|
|
193
|
+
x = @x; y = @y
|
|
194
|
+
|
|
195
|
+
if @rotate != 0
|
|
196
|
+
cx = rx; cy = ry
|
|
197
|
+
rad = @rotate * Math::PI / 180.0
|
|
198
|
+
sa = Math.sin(rad); ca = Math.cos(rad)
|
|
199
|
+
dx = x - cx; dy = y - cy
|
|
200
|
+
x = dx * ca - dy * sa + cx
|
|
201
|
+
y = dx * sa + dy * ca + cy
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
if @fill
|
|
205
|
+
cc = @_cc
|
|
206
|
+
Ext.draw_circle(x, y, @radius, @sectors, cc[0], cc[1], cc[2], cc[3])
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
if @stroke_width && @stroke_width > 0
|
|
210
|
+
scc = @_stroke_cc
|
|
211
|
+
Ext.stroke_circle(x, y, @radius, @sectors, @stroke_width, scc[0], scc[1], scc[2], scc[3])
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Scene-graph draw hook (see Renderable#_render_scene). Circle's `render` is
|
|
216
|
+
# already zero-arg, so the hook is the same method under the scene name.
|
|
217
|
+
alias_method :_render_scene, :render
|
|
218
|
+
public :_render_scene
|
|
219
|
+
|
|
220
|
+
# Build/rebuild flat color cache for the native extension
|
|
221
|
+
def ensure_cc
|
|
222
|
+
if @_cc.nil? || @_cc[0] != @color.r || @_cc[1] != @color.g || @_cc[2] != @color.b || @_cc[3] != @color.a
|
|
223
|
+
@_cc = [@color.r, @color.g, @color.b, @color.a]
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# Build/rebuild flat stroke color cache for the native extension
|
|
228
|
+
def ensure_scc
|
|
229
|
+
c = @stroke_color
|
|
230
|
+
if @_stroke_cc.nil? || @_stroke_cc[0] != c.r || @_stroke_cc[1] != c.g || @_stroke_cc[2] != c.b || @_stroke_cc[3] != c.a
|
|
231
|
+
@_stroke_cc = [c.r, c.g, c.b, c.a]
|
|
232
|
+
end
|
|
56
233
|
end
|
|
57
234
|
end
|
|
58
235
|
end
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
require 'io/console'
|
|
2
|
+
require_relative 'colorize'
|
|
3
|
+
|
|
4
|
+
module Ruby2D
|
|
5
|
+
module CLI
|
|
6
|
+
# Generic interactive arrow-key TUI for browsing a list of items. Used by
|
|
7
|
+
# both `ruby2d examples` and `ruby2d usage`. Items are hashes with at least
|
|
8
|
+
# `:title` (shown in the list) and `:description` (shown beneath the list).
|
|
9
|
+
module Browser
|
|
10
|
+
|
|
11
|
+
RED = "\e[38;2;246;60;56m"
|
|
12
|
+
RESET = "\e[0m"
|
|
13
|
+
BOLD = "\e[1m"
|
|
14
|
+
DIM = "\e[2m"
|
|
15
|
+
|
|
16
|
+
# Native-Windows Ruby (RubyInstaller) needs its own input handling: on some
|
|
17
|
+
# builds `IO.console.raw` doesn't drop line/echo input, and even in raw
|
|
18
|
+
# mode the console won't emit arrow keys as bytes unless virtual-terminal
|
|
19
|
+
# input is on. `WinConsole` sets both directly; `read_key` then parses the
|
|
20
|
+
# `\e[A`-style sequences that result. POSIX terminals are untouched.
|
|
21
|
+
WINDOWS = Gem.win_platform?
|
|
22
|
+
|
|
23
|
+
# Drives the Win32 console input mode through `SetConsoleMode`, because
|
|
24
|
+
# native-Windows Ruby's `io/console` `raw` is unreliable here (confirmed on
|
|
25
|
+
# `aarch64-mingw-ucrt`: `raw` left LINE/ECHO input enabled). Enabling
|
|
26
|
+
# `VIRTUAL_TERMINAL_INPUT` is what makes arrow keys arrive as `\e[A`
|
|
27
|
+
# sequences instead of being swallowed. All Fiddle use is lazy and
|
|
28
|
+
# failure-tolerant: any problem returns nil and the caller falls back to
|
|
29
|
+
# the plain `io/console` path.
|
|
30
|
+
module WinConsole
|
|
31
|
+
STD_INPUT_HANDLE = -10
|
|
32
|
+
PROCESSED_INPUT = 0x0001
|
|
33
|
+
LINE_INPUT = 0x0002
|
|
34
|
+
ECHO_INPUT = 0x0004
|
|
35
|
+
VT_INPUT = 0x0200
|
|
36
|
+
|
|
37
|
+
# Lazily resolve the three kernel32 calls we need; memoize the result
|
|
38
|
+
# (nil if Fiddle or the console API is unavailable).
|
|
39
|
+
def self.api
|
|
40
|
+
unless @resolved
|
|
41
|
+
@resolved = true
|
|
42
|
+
@api =
|
|
43
|
+
begin
|
|
44
|
+
require 'fiddle'
|
|
45
|
+
k32 = Fiddle.dlopen('kernel32')
|
|
46
|
+
{
|
|
47
|
+
get_handle: Fiddle::Function.new(k32['GetStdHandle'], [Fiddle::TYPE_LONG], Fiddle::TYPE_VOIDP),
|
|
48
|
+
get_mode: Fiddle::Function.new(k32['GetConsoleMode'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT),
|
|
49
|
+
set_mode: Fiddle::Function.new(k32['SetConsoleMode'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG], Fiddle::TYPE_INT)
|
|
50
|
+
}
|
|
51
|
+
rescue LoadError, StandardError
|
|
52
|
+
nil
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
@api
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Switch the console to raw + virtual-terminal input. Returns the prior
|
|
59
|
+
# mode (to hand back to `restore`), or nil when there's no console to set
|
|
60
|
+
# (Fiddle missing, stdin redirected, `GetConsoleMode` failed).
|
|
61
|
+
def self.enable_raw
|
|
62
|
+
fns = api or return nil
|
|
63
|
+
handle = fns[:get_handle].call(STD_INPUT_HANDLE)
|
|
64
|
+
buf = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT, Fiddle::RUBY_FREE)
|
|
65
|
+
return nil if fns[:get_mode].call(handle, buf) == 0
|
|
66
|
+
prev = buf[0, Fiddle::SIZEOF_INT].unpack1('L')
|
|
67
|
+
fns[:set_mode].call(handle, (prev & ~(LINE_INPUT | ECHO_INPUT | PROCESSED_INPUT)) | VT_INPUT)
|
|
68
|
+
prev
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Re-apply raw + VT without disturbing the saved prior mode — used after
|
|
72
|
+
# a child example returns, in case it left the shared console mode
|
|
73
|
+
# changed.
|
|
74
|
+
def self.reassert_raw
|
|
75
|
+
enable_raw
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def self.restore(prev)
|
|
79
|
+
return if prev.nil?
|
|
80
|
+
fns = api or return
|
|
81
|
+
fns[:set_mode].call(fns[:get_handle].call(STD_INPUT_HANDLE), prev)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Run the interactive browser.
|
|
86
|
+
# list array of item hashes with :title and :description
|
|
87
|
+
# label header label, e.g. 'Examples' or 'Usage Guide'
|
|
88
|
+
# footer_action verb after 'Enter to', e.g. 'run' or 'view'
|
|
89
|
+
# fallback called when there is no usable TTY
|
|
90
|
+
# block invoked with the selected item when Enter is pressed
|
|
91
|
+
def self.run(list:, label:, footer_action:, fallback: nil, &on_select)
|
|
92
|
+
return if list.empty?
|
|
93
|
+
|
|
94
|
+
unless $stdout.tty? && IO.console
|
|
95
|
+
fallback&.call
|
|
96
|
+
return
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
selected = 0
|
|
100
|
+
prev_mode = nil
|
|
101
|
+
begin
|
|
102
|
+
enter_alt_screen
|
|
103
|
+
# On Windows, take over the console mode ourselves; `managed` is true
|
|
104
|
+
# only when that succeeded (otherwise fall back to `io/console` raw).
|
|
105
|
+
prev_mode = WinConsole.enable_raw if WINDOWS
|
|
106
|
+
managed = !prev_mode.nil?
|
|
107
|
+
# Managed mode reads IO.console directly; binmode stops Windows CRLF
|
|
108
|
+
# read-translation from stalling Enter (it holds the CR of CR+LF
|
|
109
|
+
# waiting to see whether an LF follows).
|
|
110
|
+
IO.console.binmode if managed
|
|
111
|
+
loop do
|
|
112
|
+
render(list, selected, label, footer_action)
|
|
113
|
+
case read_key(managed)
|
|
114
|
+
when :up then selected = (selected - 1) % list.length
|
|
115
|
+
when :down then selected = (selected + 1) % list.length
|
|
116
|
+
when :pgup then selected = [selected - 10, 0].max
|
|
117
|
+
when :pgdn then selected = [selected + 10, list.length - 1].min
|
|
118
|
+
when :home then selected = 0
|
|
119
|
+
when :last then selected = list.length - 1
|
|
120
|
+
when :enter
|
|
121
|
+
print "\e[2J\e[H\e[?25h\e[?1000l\e[?1006l"
|
|
122
|
+
on_select.call(list[selected])
|
|
123
|
+
# The example shared this console; re-assert our mode and drop
|
|
124
|
+
# anything typed while it ran so stray keys (e.g. a queued Enter)
|
|
125
|
+
# don't fire actions back in the picker.
|
|
126
|
+
WinConsole.reassert_raw if managed
|
|
127
|
+
IO.console.iflush if IO.console.respond_to?(:iflush)
|
|
128
|
+
print "\e[?25l\e[?1000h\e[?1006h"
|
|
129
|
+
when :quit
|
|
130
|
+
break
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
ensure
|
|
134
|
+
WinConsole.restore(prev_mode) if WINDOWS
|
|
135
|
+
leave_alt_screen
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Enabling mouse-event reporting (1000 + 1006/SGR) stops most terminals
|
|
140
|
+
# from translating the scroll wheel into arrow keys while the alt screen
|
|
141
|
+
# is active. Mouse sequences are ignored in `read_key`.
|
|
142
|
+
def self.enter_alt_screen
|
|
143
|
+
print "\e[?1049h\e[?25l\e[?1000h\e[?1006h"
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def self.leave_alt_screen
|
|
147
|
+
print "\e[?1006l\e[?1000l\e[?1049l\e[?25h"
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Block for one keypress and map it to an action.
|
|
151
|
+
# `managed` is true when `WinConsole` already put the console in raw + VT
|
|
152
|
+
# input mode, so we read `IO.console` directly. Otherwise (POSIX, or
|
|
153
|
+
# Windows without a settable console) we go through `io/console`'s `raw`.
|
|
154
|
+
def self.read_key(managed = false)
|
|
155
|
+
if managed
|
|
156
|
+
read_console(IO.console)
|
|
157
|
+
else
|
|
158
|
+
IO.console.raw { |io| read_console(io) }
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Classify one keypress from an already-raw stream. Windows and POSIX share
|
|
163
|
+
# the single-byte keys and diverge only on how escape sequences are read:
|
|
164
|
+
# POSIX's `read_escape_sequence` uses `IO.select`/`read_nonblock` (fine on
|
|
165
|
+
# a pty), which native-Windows Ruby can't use on a console handle.
|
|
166
|
+
def self.read_console(io)
|
|
167
|
+
c = io.getc
|
|
168
|
+
if c.nil? then :quit
|
|
169
|
+
elsif WINDOWS && c == "\n" then nil # LF half of CR+LF; the CR already fired :enter
|
|
170
|
+
elsif (action = classify_char(c)) then action
|
|
171
|
+
elsif WINDOWS && (c == "\x00" || c == "\xE0") then classify_scancode(io.getc)
|
|
172
|
+
elsif c == "\e"
|
|
173
|
+
classify_escape(WINDOWS ? read_escape_windows(io) : read_escape_sequence(io))
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Single-byte keys, identical on every platform.
|
|
178
|
+
def self.classify_char(c)
|
|
179
|
+
case c
|
|
180
|
+
when "\r", "\n" then :enter
|
|
181
|
+
when 'q', 'Q', "\x03", "\x04" then :quit
|
|
182
|
+
when 'k' then :up
|
|
183
|
+
when 'j' then :down
|
|
184
|
+
when 'g' then :home
|
|
185
|
+
when 'G' then :last
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Legacy (non-VT) Windows consoles report arrows and navigation keys as two
|
|
190
|
+
# bytes: a `\x00` or `\xE0` prefix, consumed by `read_console`, then the
|
|
191
|
+
# scan code mapped here. With `VIRTUAL_TERMINAL_INPUT` on they arrive as
|
|
192
|
+
# `\e[A` sequences instead, but this keeps the fallback working too.
|
|
193
|
+
# (Left/Right are unused and fall through.)
|
|
194
|
+
def self.classify_scancode(c)
|
|
195
|
+
case c
|
|
196
|
+
when 'H' then :up # 0x48
|
|
197
|
+
when 'P' then :down # 0x50
|
|
198
|
+
when 'I' then :pgup # 0x49
|
|
199
|
+
when 'Q' then :pgdn # 0x51
|
|
200
|
+
when 'G' then :home # 0x47
|
|
201
|
+
when 'O' then :last # 0x4F (End)
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Read a CSI/SS3 escape sequence on Windows without `IO.select` or
|
|
206
|
+
# `read_nonblock` (unsupported on a console handle). An arrow key's whole
|
|
207
|
+
# sequence lands in the input buffer at once, so a blocking `getc` returns
|
|
208
|
+
# each following byte right away. A lone ESC has no follow-on byte and
|
|
209
|
+
# would block here, so on Windows we quit with `q`, not ESC. If the byte
|
|
210
|
+
# after ESC isn't a CSI/SS3 introducer we stop at once, swallowing nothing
|
|
211
|
+
# extra.
|
|
212
|
+
def self.read_escape_windows(io)
|
|
213
|
+
seq = io.getc.to_s
|
|
214
|
+
return seq unless seq == '[' || seq == 'O'
|
|
215
|
+
14.times do
|
|
216
|
+
c = io.getc
|
|
217
|
+
break if c.nil?
|
|
218
|
+
seq << c
|
|
219
|
+
break if c.match?(/[A-Za-z~]/)
|
|
220
|
+
end
|
|
221
|
+
seq
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# Read one CSI/SS3 escape sequence after the leading ESC. Waits briefly
|
|
225
|
+
# for each byte so chunked delivery doesn't cut us short, and stops at
|
|
226
|
+
# the first byte in the CSI final-byte range (0x40-0x7E).
|
|
227
|
+
def self.read_escape_sequence(io)
|
|
228
|
+
seq = ''
|
|
229
|
+
32.times do
|
|
230
|
+
break unless IO.select([io], nil, nil, 0.01)
|
|
231
|
+
c = io.read_nonblock(1, exception: false)
|
|
232
|
+
break if c.nil? || c == :wait_readable
|
|
233
|
+
seq << c
|
|
234
|
+
break if seq.length >= 2 && c.match?(/[A-Za-z~]/)
|
|
235
|
+
end
|
|
236
|
+
seq
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def self.classify_escape(seq)
|
|
240
|
+
return nil if seq.start_with?('[<') && seq.end_with?('M', 'm') # SGR mouse
|
|
241
|
+
return nil if seq.start_with?('[M') # X10 mouse
|
|
242
|
+
case seq
|
|
243
|
+
when '' then :quit # bare ESC
|
|
244
|
+
when '[A', 'OA' then :up
|
|
245
|
+
when '[B', 'OB' then :down
|
|
246
|
+
when '[H', '[1~', '[7~', 'OH' then :home
|
|
247
|
+
when '[F', '[4~', '[8~', 'OF' then :last
|
|
248
|
+
when '[5~' then :pgup
|
|
249
|
+
when '[6~' then :pgdn
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def self.wrap(text, width)
|
|
254
|
+
return [] if text.nil? || text.empty? || width <= 0
|
|
255
|
+
lines = []
|
|
256
|
+
current = ''
|
|
257
|
+
text.split(' ').each do |word|
|
|
258
|
+
if current.empty?
|
|
259
|
+
current = word
|
|
260
|
+
elsif current.length + 1 + word.length <= width
|
|
261
|
+
current << ' ' << word
|
|
262
|
+
else
|
|
263
|
+
lines << current
|
|
264
|
+
current = word
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
lines << current unless current.empty?
|
|
268
|
+
lines
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def self.render(list, selected, label, footer_action)
|
|
272
|
+
rows, cols = IO.console.winsize
|
|
273
|
+
rows = 24 if rows.nil? || rows < 10
|
|
274
|
+
cols = 80 if cols.nil? || cols < 40
|
|
275
|
+
|
|
276
|
+
print "\e[2J\e[H"
|
|
277
|
+
|
|
278
|
+
title = " #{'Ruby 2D'.ruby2d_red.bold} — #{label} #{"(#{selected + 1}/#{list.length})".dim}"
|
|
279
|
+
footer = " #{"↑/↓ navigate · Enter to #{footer_action} · q to quit".dim}"
|
|
280
|
+
desc_height = 3
|
|
281
|
+
desc_lines = wrap(list[selected][:description], cols - 4)[0, desc_height]
|
|
282
|
+
|
|
283
|
+
# 1 (blank) + title + 1 + viewport + 1 + desc_height + 1 + footer = rows
|
|
284
|
+
viewport = rows - (5 + desc_height)
|
|
285
|
+
viewport = [viewport, 5].max
|
|
286
|
+
viewport = [viewport, list.length].min
|
|
287
|
+
|
|
288
|
+
start = [selected - viewport / 2, 0].max
|
|
289
|
+
start = [start, list.length - viewport].min
|
|
290
|
+
start = 0 if start.negative?
|
|
291
|
+
|
|
292
|
+
width = list.length.to_s.length
|
|
293
|
+
|
|
294
|
+
puts
|
|
295
|
+
puts title
|
|
296
|
+
puts
|
|
297
|
+
viewport.times do |i|
|
|
298
|
+
idx = start + i
|
|
299
|
+
item = list[idx]
|
|
300
|
+
num = (idx + 1).to_s.rjust(width)
|
|
301
|
+
if idx == selected
|
|
302
|
+
puts " #{RED}◆ #{BOLD}#{num}#{RESET} #{RED}#{BOLD}#{item[:title]}#{RESET}"
|
|
303
|
+
else
|
|
304
|
+
puts " #{DIM}#{num}#{RESET} #{item[:title]}"
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
puts
|
|
308
|
+
desc_height.times { |i| puts " #{DIM}#{desc_lines[i] || ''}#{RESET}" }
|
|
309
|
+
puts
|
|
310
|
+
print footer
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
end
|