Implement flashable and viewport element bindings for libretro builds

This commit is contained in:
刘皓 2025-03-20 22:38:05 -04:00
parent eb9a5a467e
commit 7d557354da
No known key found for this signature in database
GPG key ID: 7901753DB465B711
5 changed files with 101 additions and 1 deletions

View file

@ -61,6 +61,7 @@ namespace mkxp_sandbox {
GFX_LOCK GFX_LOCK
plane = new Plane(viewport); plane = new Plane(viewport);
SANDBOX_AWAIT(rb_iv_set, self, "viewport", viewport_obj);
set_private_data(self, plane); set_private_data(self, plane);
@ -101,6 +102,25 @@ namespace mkxp_sandbox {
return plane == NULL || plane->isDisposed() ? SANDBOX_TRUE : SANDBOX_FALSE; return plane == NULL || plane->isDisposed() ? SANDBOX_TRUE : SANDBOX_FALSE;
} }
static VALUE get_viewport(VALUE self) {
return sb()->bind<struct rb_iv_get>()()(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<Plane>(self)->setViewport(get_private_data<Viewport>(value)));
SANDBOX_AWAIT(rb_iv_set, self, "viewport", value);
}
return value;
}
)
return sb()->bind<struct coro>()()(self, value);
}
static VALUE get_bitmap(VALUE self) { static VALUE get_bitmap(VALUE self) {
return sb()->bind<struct rb_iv_get>()()(self, "bitmap"); return sb()->bind<struct rb_iv_get>()()(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, "initialize", (VALUE (*)(ANYARGS))initialize, -1);
SANDBOX_AWAIT(rb_define_method, klass, "dispose", (VALUE (*)(ANYARGS))dispose, 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, "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))get_bitmap, 0);
SANDBOX_AWAIT(rb_define_method, klass, "bitmap=", (VALUE (*)(ANYARGS))set_bitmap, 1); SANDBOX_AWAIT(rb_define_method, klass, "bitmap=", (VALUE (*)(ANYARGS))set_bitmap, 1);
SANDBOX_AWAIT(rb_define_method, klass, "color", (VALUE (*)(ANYARGS))get_color, 0); SANDBOX_AWAIT(rb_define_method, klass, "color", (VALUE (*)(ANYARGS))get_color, 0);

View file

@ -102,6 +102,23 @@ namespace mkxp_sandbox {
return sprite == NULL || sprite->isDisposed() ? SANDBOX_TRUE : SANDBOX_FALSE; 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<Sprite>(self)->flash(obj == SANDBOX_NIL ? NULL : &get_private_data<Color>(obj)->norm, duration);
}
return SANDBOX_NIL;
}
)
return sb()->bind<struct coro>()()(self, obj, value);
}
static VALUE update(VALUE self) { static VALUE update(VALUE self) {
GFX_LOCK; GFX_LOCK;
get_private_data<Sprite>(self)->update(); get_private_data<Sprite>(self)->update();
@ -109,6 +126,25 @@ namespace mkxp_sandbox {
return SANDBOX_NIL; return SANDBOX_NIL;
} }
static VALUE get_viewport(VALUE self) {
return sb()->bind<struct rb_iv_get>()()(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<Sprite>(self)->setViewport(get_private_data<Viewport>(value)));
SANDBOX_AWAIT(rb_iv_set, self, "viewport", value);
}
return value;
}
)
return sb()->bind<struct coro>()()(self, value);
}
static VALUE get_bitmap(VALUE self) { static VALUE get_bitmap(VALUE self) {
return sb()->bind<struct rb_iv_get>()()(self, "bitmap"); return sb()->bind<struct rb_iv_get>()()(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, "initialize", (VALUE (*)(ANYARGS))initialize, -1);
SANDBOX_AWAIT(rb_define_method, klass, "dispose", (VALUE (*)(ANYARGS))dispose, 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, "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, "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))get_bitmap, 0);
SANDBOX_AWAIT(rb_define_method, klass, "bitmap=", (VALUE (*)(ANYARGS))set_bitmap, 1); 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); SANDBOX_AWAIT(rb_define_method, klass, "src_rect", (VALUE (*)(ANYARGS))get_src_rect, 0);

View file

@ -104,6 +104,23 @@ namespace mkxp_sandbox {
return viewport == NULL || viewport->isDisposed() ? SANDBOX_TRUE : SANDBOX_FALSE; 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<Viewport>(self)->flash(obj == SANDBOX_NIL ? NULL : &get_private_data<Color>(obj)->norm, duration);
}
return SANDBOX_NIL;
}
)
return sb()->bind<struct coro>()()(self, obj, value);
}
static VALUE update(VALUE self) { static VALUE update(VALUE self) {
GFX_LOCK; GFX_LOCK;
get_private_data<Viewport>(self)->update(); get_private_data<Viewport>(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, "initialize", (VALUE (*)(ANYARGS))initialize, -1);
SANDBOX_AWAIT(rb_define_method, klass, "dispose", (VALUE (*)(ANYARGS))dispose, 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, "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, "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))get_rect, 0);
SANDBOX_AWAIT(rb_define_method, klass, "rect=", (VALUE (*)(ANYARGS))set_rect, 1); SANDBOX_AWAIT(rb_define_method, klass, "rect=", (VALUE (*)(ANYARGS))set_rect, 1);

View file

@ -27,7 +27,7 @@
#define WASM_PAGE_SIZE ((uint64_t)65536U) #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) { extern "C" bool wasm_rt_is_initialized(void) {
return true; return true;

View file

@ -106,6 +106,25 @@ namespace mkxp_sandbox {
return SANDBOX_NIL; return SANDBOX_NIL;
} }
static VALUE get_viewport(VALUE self) {
return sb()->bind<struct rb_iv_get>()()(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<Window>(self)->setViewport(get_private_data<Viewport>(value)));
SANDBOX_AWAIT(rb_iv_set, self, "viewport", value);
}
return value;
}
)
return sb()->bind<struct coro>()()(self, value);
}
static VALUE get_windowskin(VALUE self) { static VALUE get_windowskin(VALUE self) {
return sb()->bind<struct rb_iv_get>()()(self, "windowskin"); return sb()->bind<struct rb_iv_get>()()(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, "update", (VALUE (*)(ANYARGS))update, 0);
SANDBOX_AWAIT(rb_define_method, klass, "dispose", (VALUE (*)(ANYARGS))dispose, 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, "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))get_windowskin, 0);
SANDBOX_AWAIT(rb_define_method, klass, "windowskin=", (VALUE (*)(ANYARGS))set_windowskin, 1); SANDBOX_AWAIT(rb_define_method, klass, "windowskin=", (VALUE (*)(ANYARGS))set_windowskin, 1);
SANDBOX_AWAIT(rb_define_method, klass, "contents", (VALUE (*)(ANYARGS))get_contents, 0); SANDBOX_AWAIT(rb_define_method, klass, "contents", (VALUE (*)(ANYARGS))get_contents, 0);