From c51e0d27013ac3a819f40cd2a7526ac81f51670e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=9A=93?= Date: Mon, 28 Apr 2025 16:15:11 -0400 Subject: [PATCH] Complete the bitmap bindings in libretro builds --- binding-sandbox/bitmap-binding.h | 134 +++++++++++++++++++++++++++++-- 1 file changed, 128 insertions(+), 6 deletions(-) diff --git a/binding-sandbox/bitmap-binding.h b/binding-sandbox/bitmap-binding.h index 90850f57..0dacc31c 100644 --- a/binding-sandbox/bitmap-binding.h +++ b/binding-sandbox/bitmap-binding.h @@ -502,18 +502,18 @@ namespace mkxp_sandbox { return sb()->bind()()(self, value); } - static VALUE snap_to_bitmap(VALUE self, VALUE position) { + static VALUE snap_to_bitmap(int32_t argc, wasm_ptr_t argv, VALUE self) { SANDBOX_COROUTINE(coro, Bitmap *bitmap; VALUE obj; int32_t pos; - VALUE operator()(VALUE self, VALUE position) { + VALUE operator()(int32_t argc, wasm_ptr_t argv, VALUE self) { BOOST_ASIO_CORO_REENTER (this) { - if (position == SANDBOX_NIL) { + if (argc < 1) { pos = -1; } else { - SANDBOX_AWAIT_AND_SET(pos, rb_num2int, position); + SANDBOX_AWAIT_AND_SET(pos, rb_num2int, ((VALUE *)(**sb() + argv))[0]); } GFX_GUARD_EXC(bitmap = new Bitmap(*get_private_data(self), pos);); @@ -528,7 +528,7 @@ namespace mkxp_sandbox { } ) - return sb()->bind()()(self, position); + return sb()->bind()()(argc, argv, self); } static VALUE gradient_fill_rect(int32_t argc, wasm_ptr_t argv, VALUE self) { @@ -699,6 +699,118 @@ namespace mkxp_sandbox { return sb()->bind()()(self, value); } + static VALUE frame_count(VALUE self) { + return sb()->bind()()(get_private_data(self)->numFrames()); + } + + static VALUE current_frame(VALUE self) { + return sb()->bind()()(get_private_data(self)->currentFrameI()); + } + + static VALUE add_frame(int32_t argc, wasm_ptr_t argv, VALUE self) { + SANDBOX_COROUTINE(coro, + VALUE value; + int32_t pos; + + VALUE operator()(int32_t argc, wasm_ptr_t argv, VALUE self) { + BOOST_ASIO_CORO_REENTER (this) { + // TODO: require at least 1 argument + if (argc < 2) { + pos = -1; + } else { + SANDBOX_AWAIT_AND_SET(pos, rb_num2int, ((VALUE *)(**sb() + argv))[1]); + if (pos < 0) { + pos = 0; + } + } + if (argc >= 1) { + Bitmap *src = get_private_data(((VALUE *)(**sb() + argv))[0]); + Bitmap *b = get_private_data(self); + GFX_GUARD_EXC(pos = b->addFrame(*src, pos);); + } + SANDBOX_AWAIT_AND_SET(value, rb_ll2inum, pos); + } + + return value; + } + ) + + return sb()->bind()()(argc, argv, self); + } + + static VALUE remove_frame(int32_t argc, wasm_ptr_t argv, VALUE self) { + SANDBOX_COROUTINE(coro, + int32_t pos; + + VALUE operator()(int32_t argc, wasm_ptr_t argv, VALUE self) { + BOOST_ASIO_CORO_REENTER (this) { + if (argc < 2) { + pos = -1; + } else { + SANDBOX_AWAIT_AND_SET(pos, rb_num2int, ((VALUE *)(**sb() + argv))[0]); + if (pos < 0) { + pos = 0; + } + } + Bitmap *b = get_private_data(self); + GFX_GUARD_EXC(b->removeFrame(pos);); + } + + return SANDBOX_NIL; + } + ) + + return sb()->bind()()(argc, argv, self); + } + + static VALUE next_frame(VALUE self) { + Bitmap *b = get_private_data(self); + GFX_GUARD_EXC(b->nextFrame()); + return sb()->bind()()(b->currentFrameI()); + } + + static VALUE previous_frame(VALUE self) { + Bitmap *b = get_private_data(self); + GFX_GUARD_EXC(b->previousFrame()); + return sb()->bind()()(b->currentFrameI()); + } + + static VALUE get_frame_rate(VALUE self) { + Bitmap *b = get_private_data(self); + float frame_rate; + GFX_GUARD_EXC(frame_rate = b->getAnimationFPS()); + return sb()->bind()()(frame_rate); + } + + static VALUE set_frame_rate(VALUE self, VALUE value) { + SANDBOX_COROUTINE(coro, + float frame_rate; + + VALUE operator()(VALUE self, VALUE value) { + BOOST_ASIO_CORO_REENTER (this) { + SANDBOX_AWAIT_AND_SET(frame_rate, rb_num2dbl, value); + Bitmap *bitmap = get_private_data(self); + GFX_GUARD_EXC(bitmap->setAnimationFPS(frame_rate);); + } + + return SANDBOX_NIL; + } + ) + + return sb()->bind()()(self, value); + } + + static VALUE get_looping(VALUE self) { + Bitmap *bitmap = get_private_data(self); + return SANDBOX_BOOL_TO_VALUE(bitmap->getLooping()); + } + + static VALUE set_looping(VALUE self, VALUE value) { + Bitmap *bitmap = get_private_data(self); + GFX_GUARD_EXC(bitmap->setLooping(SANDBOX_VALUE_TO_BOOL(value))); + return value; + } + static VALUE get_font(VALUE self) { return sb()->bind()()(self, "font"); } @@ -790,7 +902,17 @@ namespace mkxp_sandbox { SANDBOX_AWAIT(rb_define_method, bitmap_class, "stop", (VALUE (*)(ANYARGS))stop, 0); SANDBOX_AWAIT(rb_define_method, bitmap_class, "goto_and_play", (VALUE (*)(ANYARGS))goto_and_play, 1); SANDBOX_AWAIT(rb_define_method, bitmap_class, "goto_and_stop", (VALUE (*)(ANYARGS))goto_and_stop, 1); - SANDBOX_AWAIT(rb_define_method, bitmap_class, "snap_to_bitmap", (VALUE (*)(ANYARGS))snap_to_bitmap, 1); + SANDBOX_AWAIT(rb_define_method, bitmap_class, "frame_count", (VALUE (*)(ANYARGS))frame_count, 0); + SANDBOX_AWAIT(rb_define_method, bitmap_class, "current_frame", (VALUE (*)(ANYARGS))current_frame, 0); + SANDBOX_AWAIT(rb_define_method, bitmap_class, "add_frame", (VALUE (*)(ANYARGS))add_frame, -1); + SANDBOX_AWAIT(rb_define_method, bitmap_class, "remove_frame", (VALUE (*)(ANYARGS))remove_frame, -1); + SANDBOX_AWAIT(rb_define_method, bitmap_class, "next_frame", (VALUE (*)(ANYARGS))next_frame, 0); + SANDBOX_AWAIT(rb_define_method, bitmap_class, "previous_frame", (VALUE (*)(ANYARGS))previous_frame, 0); + SANDBOX_AWAIT(rb_define_method, bitmap_class, "frame_rate", (VALUE (*)(ANYARGS))get_frame_rate, 0); + SANDBOX_AWAIT(rb_define_method, bitmap_class, "frame_rate=", (VALUE (*)(ANYARGS))set_frame_rate, 1); + SANDBOX_AWAIT(rb_define_method, bitmap_class, "looping", (VALUE (*)(ANYARGS))get_looping, 0); + SANDBOX_AWAIT(rb_define_method, bitmap_class, "looping=", (VALUE (*)(ANYARGS))set_looping, 1); + SANDBOX_AWAIT(rb_define_method, bitmap_class, "snap_to_bitmap", (VALUE (*)(ANYARGS))snap_to_bitmap, -1); SANDBOX_AWAIT(rb_define_method, bitmap_class, "font", (VALUE (*)(ANYARGS))get_font, 0); SANDBOX_AWAIT(rb_define_method, bitmap_class, "font=", (VALUE (*)(ANYARGS))set_font, 1);