From ae810eaba85db4029f2e7d6c0330f7bf09135e4c Mon Sep 17 00:00:00 2001 From: Andrew Dunai Date: Wed, 3 Apr 2024 20:20:14 +0300 Subject: [PATCH] keira: switch back to double pointers with cleaner assignments --- .../keira/src/apps/lua/lualilka_display.cpp | 4 +- .../src/apps/lua/lualilka_imageTransform.cpp | 50 ++++++++++--------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/firmware/keira/src/apps/lua/lualilka_display.cpp b/firmware/keira/src/apps/lua/lualilka_display.cpp index c7a36e80..a873407c 100644 --- a/firmware/keira/src/apps/lua/lualilka_display.cpp +++ b/firmware/keira/src/apps/lua/lualilka_display.cpp @@ -273,9 +273,9 @@ int lualilka_display_drawImageTransformed(lua_State* L) { int16_t x = luaL_checknumber(L, 2); int16_t y = luaL_checknumber(L, 3); - lilka::Transform* transform = static_cast(luaL_checkudata(L, 4, IMAGE_TRANSFORM)); + lilka::Transform** transform = static_cast(luaL_checkudata(L, 4, IMAGE_TRANSFORM)); - getDrawable(L)->drawImageTransformed(image, x, y, *transform); + getDrawable(L)->drawImageTransformed(image, x, y, **transform); return 0; } diff --git a/firmware/keira/src/apps/lua/lualilka_imageTransform.cpp b/firmware/keira/src/apps/lua/lualilka_imageTransform.cpp index 8b7c3f24..5b3152b8 100644 --- a/firmware/keira/src/apps/lua/lualilka_imageTransform.cpp +++ b/firmware/keira/src/apps/lua/lualilka_imageTransform.cpp @@ -1,68 +1,73 @@ #include "lualilka_imageTransform.h" #include "lilka/display.h" +#define TRANSFORM_PTR(x) static_cast(x) + static int lualilka_create_object_imageTransform(lua_State* L) { - lilka::Transform* userdata = static_cast(lua_newuserdata(L, sizeof(lilka::Transform))); - new (userdata) lilka::Transform(); + lilka::Transform** userdata = TRANSFORM_PTR(lua_newuserdata(L, sizeof(lilka::Transform))); + *userdata = new lilka::Transform(); luaL_setmetatable(L, IMAGE_TRANSFORM); return 1; } static int lualilka_delete_object_imageTransform(lua_State* L) { - const lilka::Transform* transformPtr = static_cast(luaL_checkudata(L, 1, IMAGE_TRANSFORM)); - transformPtr->~Transform(); + lilka::Transform** userdata = TRANSFORM_PTR(luaL_checkudata(L, 1, IMAGE_TRANSFORM)); + if (*userdata) { + delete *userdata; + *userdata = nullptr; + } return 0; } static int lualilka_imageTransform_rotate(lua_State* L) { - lilka::Transform* transformPtr = static_cast(luaL_checkudata(L, 1, IMAGE_TRANSFORM)); - lilka::Transform* rotatedTransform = static_cast(lua_newuserdata(L, sizeof(lilka::Transform))); - new (rotatedTransform) lilka::Transform(transformPtr->rotate(luaL_checknumber(L, 2))); + lilka::Transform** userdata = TRANSFORM_PTR(luaL_checkudata(L, 1, IMAGE_TRANSFORM)); + lilka::Transform** newUserdata = TRANSFORM_PTR(lua_newuserdata(L, sizeof(lilka::Transform))); + *newUserdata = new lilka::Transform((*userdata)->rotate(luaL_checknumber(L, 2))); luaL_setmetatable(L, IMAGE_TRANSFORM); return 1; } static int lualilka_imageTransform_scale(lua_State* L) { - lilka::Transform* transformPtr = static_cast(luaL_checkudata(L, 1, IMAGE_TRANSFORM)); - lilka::Transform* scaledTransform = static_cast(lua_newuserdata(L, sizeof(lilka::Transform))); - new (scaledTransform) lilka::Transform(transformPtr->scale(luaL_checknumber(L, 2), luaL_checknumber(L, 3))); + lilka::Transform** userdata = TRANSFORM_PTR(luaL_checkudata(L, 1, IMAGE_TRANSFORM)); + lilka::Transform** newUserdata = TRANSFORM_PTR(lua_newuserdata(L, sizeof(lilka::Transform))); + *newUserdata = new lilka::Transform((*userdata)->scale(luaL_checknumber(L, 2), luaL_checknumber(L, 3))); luaL_setmetatable(L, IMAGE_TRANSFORM); return 1; } static int lualilka_imageTransform_multiply(lua_State* L) { - lilka::Transform* transformPtr = static_cast(luaL_checkudata(L, 1, IMAGE_TRANSFORM)); - lilka::Transform* multipliedTransfform = - static_cast(lua_newuserdata(L, sizeof(lilka::Transform))); - new (multipliedTransfform - ) lilka::Transform(transformPtr->multiply(*static_cast(luaL_checkudata(L, 2, IMAGE_TRANSFORM)))); + lilka::Transform** userdata1 = TRANSFORM_PTR(luaL_checkudata(L, 1, IMAGE_TRANSFORM)); + lilka::Transform** userdata2 = TRANSFORM_PTR(luaL_checkudata(L, 2, IMAGE_TRANSFORM)); + lilka::Transform** newUserdata = TRANSFORM_PTR(lua_newuserdata(L, sizeof(lilka::Transform))); + *newUserdata = new lilka::Transform((*userdata1)->multiply(**userdata2)); luaL_setmetatable(L, IMAGE_TRANSFORM); return 1; } static int lualilka_imageTransform_inverse(lua_State* L) { - lilka::Transform* transformPtr = static_cast(luaL_checkudata(L, 1, IMAGE_TRANSFORM)); - lilka::Transform* inversedTransform = static_cast(lua_newuserdata(L, sizeof(lilka::Transform))); - new (inversedTransform) lilka::Transform(transformPtr->inverse()); + lilka::Transform** userdata = TRANSFORM_PTR(luaL_checkudata(L, 1, IMAGE_TRANSFORM)); + lilka::Transform** newUserdata = TRANSFORM_PTR(lua_newuserdata(L, sizeof(lilka::Transform))); + *newUserdata = new lilka::Transform((*userdata)->inverse()); luaL_setmetatable(L, IMAGE_TRANSFORM); return 1; } static int lualilka_imageTransform_vtransform(lua_State* L) { + lilka::Transform** userdata = TRANSFORM_PTR(luaL_checkudata(L, 1, IMAGE_TRANSFORM)); lilka::int_vector_t result = - (static_cast(luaL_checkudata(L, 1, IMAGE_TRANSFORM))) - ->transform(lilka::int_vector_t{.x = (int)luaL_checknumber(L, 2), .y = (int)luaL_checknumber(L, 3)}); + (*userdata)->transform(lilka::int_vector_t{.x = (int)luaL_checknumber(L, 2), .y = (int)luaL_checknumber(L, 3)}); lua_pushinteger(L, result.x); lua_pushinteger(L, result.y); return 2; } static int lualilka_imageTransform_get_matrix(lua_State* L) { + lilka::Transform** userdata = TRANSFORM_PTR(luaL_checkudata(L, 1, IMAGE_TRANSFORM)); lua_newtable(L); for (int i = 0; i < 2; ++i) { lua_newtable(L); for (int j = 0; j < 2; ++j) { - lua_pushinteger(L, (static_cast(luaL_checkudata(L, 1, IMAGE_TRANSFORM)))->matrix[i][j]); + lua_pushinteger(L, (*userdata)->matrix[i][j]); lua_rawseti(L, -2, j + 1); } lua_rawseti(L, -2, i + 1); @@ -84,8 +89,7 @@ static int lualilka_imageTransform_set_matrix(lua_State* L) { return luaL_error(L, "Element at (%d, %d) is not a number", i, j); } - (static_cast(luaL_checkudata(L, 1, IMAGE_TRANSFORM)))->matrix[i][j] = - lua_tonumber(L, -1); + (*TRANSFORM_PTR(luaL_checkudata(L, 1, IMAGE_TRANSFORM)))->matrix[i][j] = lua_tonumber(L, -1); lua_pop(L, 1); }