From f4e7e8dac7bdadb6e13bc5c054f00b7c21058c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=9A=93?= Date: Thu, 27 Feb 2025 14:58:50 -0500 Subject: [PATCH] Add windowskin methods to binding-sandbox window binding --- binding-sandbox/window-binding.h | 80 +++++++++++++++++++++++--------- src/display/window.cpp | 2 - 2 files changed, 57 insertions(+), 25 deletions(-) diff --git a/binding-sandbox/window-binding.h b/binding-sandbox/window-binding.h index 4c446000..a4256624 100644 --- a/binding-sandbox/window-binding.h +++ b/binding-sandbox/window-binding.h @@ -39,7 +39,7 @@ namespace mkxp_sandbox { VALUE viewport_obj; Viewport *viewport; VALUE klass; - VALUE cursor_obj; + VALUE obj; ID id; VALUE operator()(int32_t argc, wasm_ptr_t argv, VALUE self) { @@ -59,11 +59,25 @@ namespace mkxp_sandbox { SANDBOX_AWAIT(set_private_data, self, window); window->initDynAttribs(); + + SANDBOX_AWAIT_AND_SET(id, rb_intern, "Bitmap"); + SANDBOX_AWAIT_AND_SET(klass, rb_const_get, sb()->rb_cObject(), id); + SANDBOX_AWAIT_AND_SET(obj, rb_obj_alloc, klass); + SANDBOX_AWAIT(set_private_data, obj, window->getWindowskin()); + SANDBOX_AWAIT(rb_iv_set, self, "windowskin", obj); + + SANDBOX_AWAIT_AND_SET(id, rb_intern, "Bitmap"); + SANDBOX_AWAIT_AND_SET(klass, rb_const_get, sb()->rb_cObject(), id); + SANDBOX_AWAIT_AND_SET(obj, rb_obj_alloc, klass); + SANDBOX_AWAIT(set_private_data, obj, window->getContents()); + SANDBOX_AWAIT(rb_iv_set, self, "contents", obj); + SANDBOX_AWAIT_AND_SET(id, rb_intern, "Rect"); SANDBOX_AWAIT_AND_SET(klass, rb_const_get, sb()->rb_cObject(), id); - SANDBOX_AWAIT_AND_SET(cursor_obj, rb_obj_alloc, klass); - SANDBOX_AWAIT(set_private_data, cursor_obj, &window->getCursorRect()); - SANDBOX_AWAIT(rb_iv_set, self, "cursor_rect", cursor_obj); + SANDBOX_AWAIT_AND_SET(obj, rb_obj_alloc, klass); + SANDBOX_AWAIT(set_private_data, obj, &window->getCursorRect()); + SANDBOX_AWAIT(rb_iv_set, self, "cursor_rect", obj); + GFX_UNLOCK } @@ -84,7 +98,7 @@ namespace mkxp_sandbox { static VALUE disposed(VALUE self) { Window *window = get_private_data(self); - return window == NULL || window->isDisposed() ? SANDBOX_TRUE : SANDBOX_FALSE; + return SANDBOX_BOOL_TO_VALUE(window == NULL || window->isDisposed()); } static VALUE update(VALUE self) { @@ -92,6 +106,25 @@ namespace mkxp_sandbox { return SANDBOX_NIL; } + static VALUE get_windowskin(VALUE self) { + return sb()->bind()()(self, "windowskin"); + } + + static VALUE set_windowskin(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)->setWindowskin(value == SANDBOX_NIL ? NULL : get_private_data(value))); + SANDBOX_AWAIT(rb_iv_set, self, "windowskin", value); + } + + return value; + } + ) + + return sb()->bind()()(self, value); + } + static VALUE get_contents(VALUE self) { return sb()->bind()()(self, "contents"); } @@ -111,15 +144,6 @@ namespace mkxp_sandbox { return sb()->bind()()(self, value); } - static VALUE get_stretch(VALUE self) { - return get_private_data(self)->getStretch() ? SANDBOX_TRUE : SANDBOX_FALSE; - } - - static VALUE set_stretch(VALUE self, VALUE value) { - GFX_GUARD_EXC(get_private_data(self)->setStretch(value != SANDBOX_FALSE && value != SANDBOX_NIL);) - return value; - } - static VALUE get_cursor_rect(VALUE self) { return sb()->bind()()(self, "cursor_rect"); } @@ -138,30 +162,39 @@ namespace mkxp_sandbox { return sb()->bind()()(self, value); } + static VALUE get_stretch(VALUE self) { + return SANDBOX_BOOL_TO_VALUE(get_private_data(self)->getStretch()); + } + + static VALUE set_stretch(VALUE self, VALUE value) { + GFX_GUARD_EXC(get_private_data(self)->setStretch(SANDBOX_VALUE_TO_BOOL(value));) + return value; + } + static VALUE get_active(VALUE self) { - return get_private_data(self)->getActive() ? SANDBOX_TRUE : SANDBOX_FALSE; + return SANDBOX_BOOL_TO_VALUE(get_private_data(self)->getActive()); } static VALUE set_active(VALUE self, VALUE value) { - GFX_GUARD_EXC(get_private_data(self)->setActive(value != SANDBOX_FALSE && value != SANDBOX_NIL);) + GFX_GUARD_EXC(get_private_data(self)->setActive(SANDBOX_VALUE_TO_BOOL(value));) return value; } static VALUE get_visible(VALUE self) { - return get_private_data(self)->getVisible() ? SANDBOX_TRUE : SANDBOX_FALSE; + return SANDBOX_BOOL_TO_VALUE(get_private_data(self)->getVisible()); } static VALUE set_visible(VALUE self, VALUE value) { - GFX_GUARD_EXC(get_private_data(self)->setVisible(value != SANDBOX_FALSE && value != SANDBOX_NIL)); + GFX_GUARD_EXC(get_private_data(self)->setVisible(SANDBOX_VALUE_TO_BOOL(value))); return value; } static VALUE get_pause(VALUE self) { - return get_private_data(self)->getPause() ? SANDBOX_TRUE : SANDBOX_FALSE; + return SANDBOX_BOOL_TO_VALUE(get_private_data(self)->getPause()); } static VALUE set_pause(VALUE self, VALUE value) { - GFX_GUARD_EXC(get_private_data(self)->setPause(value != SANDBOX_FALSE && value != SANDBOX_NIL)); + GFX_GUARD_EXC(get_private_data(self)->setPause(SANDBOX_VALUE_TO_BOOL(value))); return value; } @@ -390,13 +423,14 @@ 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, "windowskin=", (VALUE (*)(ANYARGS))todo, -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); SANDBOX_AWAIT(rb_define_method, klass, "contents=", (VALUE (*)(ANYARGS))set_contents, 1); - SANDBOX_AWAIT(rb_define_method, klass, "stretch", (VALUE (*)(ANYARGS))get_stretch, 0); - SANDBOX_AWAIT(rb_define_method, klass, "stretch=", (VALUE (*)(ANYARGS))set_stretch, 1); SANDBOX_AWAIT(rb_define_method, klass, "cursor_rect", (VALUE (*)(ANYARGS))get_cursor_rect, 0); SANDBOX_AWAIT(rb_define_method, klass, "cursor_rect=", (VALUE (*)(ANYARGS))set_cursor_rect, 1); + SANDBOX_AWAIT(rb_define_method, klass, "stretch", (VALUE (*)(ANYARGS))get_stretch, 0); + SANDBOX_AWAIT(rb_define_method, klass, "stretch=", (VALUE (*)(ANYARGS))set_stretch, 1); SANDBOX_AWAIT(rb_define_method, klass, "active", (VALUE (*)(ANYARGS))get_active, 0); SANDBOX_AWAIT(rb_define_method, klass, "active=", (VALUE (*)(ANYARGS))set_active, 1); SANDBOX_AWAIT(rb_define_method, klass, "visible", (VALUE (*)(ANYARGS))get_visible, 0); diff --git a/src/display/window.cpp b/src/display/window.cpp index 9320aed7..8d35670e 100644 --- a/src/display/window.cpp +++ b/src/display/window.cpp @@ -451,9 +451,7 @@ struct WindowPrivate FBO::clear(); /* Repaint base */ -#ifndef MKXPZ_RETRO // TODO windowskin->bindTex(shader); -#endif // MKXPZ_RETRO TEX::setSmooth(true); /* We need to blit the background without blending,