From 7d557354dadfb075cf63de5ed5802f8b29cf9bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=9A=93?= Date: Thu, 20 Mar 2025 22:38:05 -0400 Subject: [PATCH] Implement flashable and viewport element bindings for libretro builds --- binding-sandbox/plane-binding.h | 22 +++++++++++++++++ binding-sandbox/sprite-binding.h | 39 ++++++++++++++++++++++++++++++ binding-sandbox/viewport-binding.h | 18 ++++++++++++++ binding-sandbox/wasm-rt.cpp | 2 +- binding-sandbox/window-binding.h | 21 ++++++++++++++++ 5 files changed, 101 insertions(+), 1 deletion(-) diff --git a/binding-sandbox/plane-binding.h b/binding-sandbox/plane-binding.h index be082d18..95c4c497 100644 --- a/binding-sandbox/plane-binding.h +++ b/binding-sandbox/plane-binding.h @@ -61,6 +61,7 @@ namespace mkxp_sandbox { GFX_LOCK plane = new Plane(viewport); + SANDBOX_AWAIT(rb_iv_set, self, "viewport", viewport_obj); set_private_data(self, plane); @@ -101,6 +102,25 @@ namespace mkxp_sandbox { return plane == NULL || plane->isDisposed() ? SANDBOX_TRUE : SANDBOX_FALSE; } + static VALUE get_viewport(VALUE self) { + return sb()->bind()()(self, "viewport"); + } + + static VALUE set_viewport(VALUE self, VALUE value) { + SANDBOX_COROUTINE(coro, + VALUE operator()(VALUE self, VALUE value) { + BOOST_ASIO_CORO_REENTER (this) { + GFX_GUARD_EXC(get_private_data(self)->setViewport(get_private_data(value))); + SANDBOX_AWAIT(rb_iv_set, self, "viewport", value); + } + + return value; + } + ) + + return sb()->bind()()(self, value); + } + static VALUE get_bitmap(VALUE self) { return sb()->bind()()(self, "bitmap"); } @@ -322,6 +342,8 @@ namespace mkxp_sandbox { SANDBOX_AWAIT(rb_define_method, klass, "initialize", (VALUE (*)(ANYARGS))initialize, -1); SANDBOX_AWAIT(rb_define_method, klass, "dispose", (VALUE (*)(ANYARGS))dispose, 0); SANDBOX_AWAIT(rb_define_method, klass, "disposed?", (VALUE (*)(ANYARGS))disposed, 0); + SANDBOX_AWAIT(rb_define_method, klass, "viewport", (VALUE (*)(ANYARGS))get_viewport, 0); + SANDBOX_AWAIT(rb_define_method, klass, "viewport=", (VALUE (*)(ANYARGS))set_viewport, 1); SANDBOX_AWAIT(rb_define_method, klass, "bitmap", (VALUE (*)(ANYARGS))get_bitmap, 0); SANDBOX_AWAIT(rb_define_method, klass, "bitmap=", (VALUE (*)(ANYARGS))set_bitmap, 1); SANDBOX_AWAIT(rb_define_method, klass, "color", (VALUE (*)(ANYARGS))get_color, 0); diff --git a/binding-sandbox/sprite-binding.h b/binding-sandbox/sprite-binding.h index 6a8efe7e..9e2ddaf5 100644 --- a/binding-sandbox/sprite-binding.h +++ b/binding-sandbox/sprite-binding.h @@ -102,6 +102,23 @@ namespace mkxp_sandbox { return sprite == NULL || sprite->isDisposed() ? SANDBOX_TRUE : SANDBOX_FALSE; } + static VALUE flash(VALUE self, VALUE obj, VALUE value) { + SANDBOX_COROUTINE(coro, + int duration; + + VALUE operator()(VALUE self, VALUE obj, VALUE value) { + BOOST_ASIO_CORO_REENTER (this) { + SANDBOX_AWAIT_AND_SET(duration, rb_num2int, value); + get_private_data(self)->flash(obj == SANDBOX_NIL ? NULL : &get_private_data(obj)->norm, duration); + } + + return SANDBOX_NIL; + } + ) + + return sb()->bind()()(self, obj, value); + } + static VALUE update(VALUE self) { GFX_LOCK; get_private_data(self)->update(); @@ -109,6 +126,25 @@ namespace mkxp_sandbox { return SANDBOX_NIL; } + static VALUE get_viewport(VALUE self) { + return sb()->bind()()(self, "viewport"); + } + + static VALUE set_viewport(VALUE self, VALUE value) { + SANDBOX_COROUTINE(coro, + VALUE operator()(VALUE self, VALUE value) { + BOOST_ASIO_CORO_REENTER (this) { + GFX_GUARD_EXC(get_private_data(self)->setViewport(get_private_data(value))); + SANDBOX_AWAIT(rb_iv_set, self, "viewport", value); + } + + return value; + } + ) + + return sb()->bind()()(self, value); + } + static VALUE get_bitmap(VALUE self) { return sb()->bind()()(self, "bitmap"); } @@ -462,7 +498,10 @@ namespace mkxp_sandbox { SANDBOX_AWAIT(rb_define_method, klass, "initialize", (VALUE (*)(ANYARGS))initialize, -1); SANDBOX_AWAIT(rb_define_method, klass, "dispose", (VALUE (*)(ANYARGS))dispose, 0); SANDBOX_AWAIT(rb_define_method, klass, "disposed?", (VALUE (*)(ANYARGS))disposed, 0); + SANDBOX_AWAIT(rb_define_method, klass, "flash", (VALUE (*)(ANYARGS))update, 2); SANDBOX_AWAIT(rb_define_method, klass, "update", (VALUE (*)(ANYARGS))update, 0); + SANDBOX_AWAIT(rb_define_method, klass, "viewport", (VALUE (*)(ANYARGS))get_viewport, 0); + SANDBOX_AWAIT(rb_define_method, klass, "viewport=", (VALUE (*)(ANYARGS))set_viewport, 1); SANDBOX_AWAIT(rb_define_method, klass, "bitmap", (VALUE (*)(ANYARGS))get_bitmap, 0); SANDBOX_AWAIT(rb_define_method, klass, "bitmap=", (VALUE (*)(ANYARGS))set_bitmap, 1); SANDBOX_AWAIT(rb_define_method, klass, "src_rect", (VALUE (*)(ANYARGS))get_src_rect, 0); diff --git a/binding-sandbox/viewport-binding.h b/binding-sandbox/viewport-binding.h index b0b9a6a1..1e786761 100644 --- a/binding-sandbox/viewport-binding.h +++ b/binding-sandbox/viewport-binding.h @@ -104,6 +104,23 @@ namespace mkxp_sandbox { return viewport == NULL || viewport->isDisposed() ? SANDBOX_TRUE : SANDBOX_FALSE; } + static VALUE flash(VALUE self, VALUE obj, VALUE value) { + SANDBOX_COROUTINE(coro, + int duration; + + VALUE operator()(VALUE self, VALUE obj, VALUE value) { + BOOST_ASIO_CORO_REENTER (this) { + SANDBOX_AWAIT_AND_SET(duration, rb_num2int, value); + get_private_data(self)->flash(obj == SANDBOX_NIL ? NULL : &get_private_data(obj)->norm, duration); + } + + return SANDBOX_NIL; + } + ) + + return sb()->bind()()(self, obj, value); + } + static VALUE update(VALUE self) { GFX_LOCK; get_private_data(self)->update(); @@ -238,6 +255,7 @@ namespace mkxp_sandbox { SANDBOX_AWAIT(rb_define_method, klass, "initialize", (VALUE (*)(ANYARGS))initialize, -1); SANDBOX_AWAIT(rb_define_method, klass, "dispose", (VALUE (*)(ANYARGS))dispose, 0); SANDBOX_AWAIT(rb_define_method, klass, "disposed?", (VALUE (*)(ANYARGS))disposed, 0); + SANDBOX_AWAIT(rb_define_method, klass, "flash", (VALUE (*)(ANYARGS))update, 2); SANDBOX_AWAIT(rb_define_method, klass, "update", (VALUE (*)(ANYARGS))update, 0); SANDBOX_AWAIT(rb_define_method, klass, "rect", (VALUE (*)(ANYARGS))get_rect, 0); SANDBOX_AWAIT(rb_define_method, klass, "rect=", (VALUE (*)(ANYARGS))set_rect, 1); diff --git a/binding-sandbox/wasm-rt.cpp b/binding-sandbox/wasm-rt.cpp index 86d5ad20..7617dec4 100644 --- a/binding-sandbox/wasm-rt.cpp +++ b/binding-sandbox/wasm-rt.cpp @@ -27,7 +27,7 @@ #define WASM_PAGE_SIZE ((uint64_t)65536U) -#define WASM_MIN_PAGES ((uint32_t)1536U) +#define WASM_MIN_PAGES ((uint32_t)2048U) extern "C" bool wasm_rt_is_initialized(void) { return true; diff --git a/binding-sandbox/window-binding.h b/binding-sandbox/window-binding.h index e61bd1de..63aff1d1 100644 --- a/binding-sandbox/window-binding.h +++ b/binding-sandbox/window-binding.h @@ -106,6 +106,25 @@ namespace mkxp_sandbox { return SANDBOX_NIL; } + static VALUE get_viewport(VALUE self) { + return sb()->bind()()(self, "viewport"); + } + + static VALUE set_viewport(VALUE self, VALUE value) { + SANDBOX_COROUTINE(coro, + VALUE operator()(VALUE self, VALUE value) { + BOOST_ASIO_CORO_REENTER (this) { + GFX_GUARD_EXC(get_private_data(self)->setViewport(get_private_data(value))); + SANDBOX_AWAIT(rb_iv_set, self, "viewport", value); + } + + return value; + } + ) + + return sb()->bind()()(self, value); + } + static VALUE get_windowskin(VALUE self) { return sb()->bind()()(self, "windowskin"); } @@ -419,6 +438,8 @@ namespace mkxp_sandbox { SANDBOX_AWAIT(rb_define_method, klass, "update", (VALUE (*)(ANYARGS))update, 0); SANDBOX_AWAIT(rb_define_method, klass, "dispose", (VALUE (*)(ANYARGS))dispose, 0); SANDBOX_AWAIT(rb_define_method, klass, "disposed?", (VALUE (*)(ANYARGS))disposed, 0); + SANDBOX_AWAIT(rb_define_method, klass, "viewport", (VALUE (*)(ANYARGS))get_viewport, 0); + SANDBOX_AWAIT(rb_define_method, klass, "viewport=", (VALUE (*)(ANYARGS))set_viewport, 1); SANDBOX_AWAIT(rb_define_method, klass, "windowskin", (VALUE (*)(ANYARGS))get_windowskin, 0); SANDBOX_AWAIT(rb_define_method, klass, "windowskin=", (VALUE (*)(ANYARGS))set_windowskin, 1); SANDBOX_AWAIT(rb_define_method, klass, "contents", (VALUE (*)(ANYARGS))get_contents, 0);