Skip to content

Commit

Permalink
keira: switch back to double pointers with cleaner assignments
Browse files Browse the repository at this point in the history
  • Loading branch information
and3rson committed Apr 3, 2024
1 parent 62f683c commit ae810ea
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 25 deletions.
4 changes: 2 additions & 2 deletions firmware/keira/src/apps/lua/lualilka_display.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<lilka::Transform*>(luaL_checkudata(L, 4, IMAGE_TRANSFORM));
lilka::Transform** transform = static_cast<lilka::Transform**>(luaL_checkudata(L, 4, IMAGE_TRANSFORM));

getDrawable(L)->drawImageTransformed(image, x, y, *transform);
getDrawable(L)->drawImageTransformed(image, x, y, **transform);

return 0;
}
Expand Down
50 changes: 27 additions & 23 deletions firmware/keira/src/apps/lua/lualilka_imageTransform.cpp
Original file line number Diff line number Diff line change
@@ -1,68 +1,73 @@
#include "lualilka_imageTransform.h"
#include "lilka/display.h"

#define TRANSFORM_PTR(x) static_cast<lilka::Transform**>(x)

static int lualilka_create_object_imageTransform(lua_State* L) {
lilka::Transform* userdata = static_cast<lilka::Transform*>(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<lilka::Transform*>(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<lilka::Transform*>(luaL_checkudata(L, 1, IMAGE_TRANSFORM));
lilka::Transform* rotatedTransform = static_cast<lilka::Transform*>(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<lilka::Transform*>(luaL_checkudata(L, 1, IMAGE_TRANSFORM));
lilka::Transform* scaledTransform = static_cast<lilka::Transform*>(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<lilka::Transform*>(luaL_checkudata(L, 1, IMAGE_TRANSFORM));
lilka::Transform* multipliedTransfform =
static_cast<lilka::Transform*>(lua_newuserdata(L, sizeof(lilka::Transform)));
new (multipliedTransfform
) lilka::Transform(transformPtr->multiply(*static_cast<lilka::Transform*>(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<lilka::Transform*>(luaL_checkudata(L, 1, IMAGE_TRANSFORM));
lilka::Transform* inversedTransform = static_cast<lilka::Transform*>(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<lilka::Transform*>(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<lilka::Transform*>(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);
Expand All @@ -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<lilka::Transform*>(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);
}

Expand Down

0 comments on commit ae810ea

Please sign in to comment.