Fork of Tangara with customizations
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tangara-fw/lib/luavgl/src/widgets/img.c

197 lines
4.4 KiB

#include "luavgl.h"
#include "private.h"
static int luavgl_img_create(lua_State *L)
{
return luavgl_obj_create_helper(L, lv_img_create);
}
static void _lv_img_set_pivot(void *obj, lua_State *L)
{
if (!lua_istable(L, -1)) {
luaL_argerror(L, -1, "should be table.");
debug("para should be table.");
return;
}
lua_getfield(L, -1, "x");
lv_coord_t x = lua_tointeger(L, -1);
lua_pop(L, 1);
lua_getfield(L, -1, "y");
lv_coord_t y = lua_tointeger(L, -1);
lua_pop(L, 1);
lv_img_set_pivot(obj, x, y);
}
static const luavgl_value_setter_t img_property_table[] = {
{"src",
SETTER_TYPE_IMGSRC, {.setter_pointer = (setter_pointer_t)lv_img_set_src}},
{"offset_x", 0, {.setter = (setter_int_t)lv_img_set_offset_x} },
{"offset_y", 0, {.setter = (setter_int_t)lv_img_set_offset_y} },
{"angle", 0, {.setter = (setter_int_t)lv_img_set_angle} },
{"zoom", 0, {.setter = (setter_int_t)lv_img_set_zoom} },
{"antialias", 0, {.setter = (setter_int_t)lv_img_set_antialias} },
{"pivot", SETTER_TYPE_STACK, {.setter_stack = _lv_img_set_pivot} },
};
LUALIB_API int luavgl_img_set_property_kv(lua_State *L, void *data)
{
lv_obj_t *obj = data;
int ret = luavgl_set_property(L, obj, img_property_table);
if (ret == 0) {
return 0;
}
/* a base obj property? */
ret = luavgl_obj_set_property_kv(L, obj);
if (ret != 0) {
debug("unkown property for image.\n");
}
return ret;
}
static int luavgl_img_set(lua_State *L)
{
lv_obj_t *obj = luavgl_to_obj(L, 1);
if (!lua_istable(L, -1)) {
luaL_error(L, "expect a table on 2nd para.");
return 0;
}
/* lvgl requires img src should be set firstly */
lua_getfield(L, -1, "src");
if (!lua_isnoneornil(L, -1)) {
const char *src = NULL;
if (lua_isuserdata(L, -1)) {
src = lua_touserdata(L, -1);
debug("set img src to user data: %p\n", src);
} else {
src = lua_tostring(L, -1);
}
lv_img_set_src(obj, src);
}
lua_pop(L, 1);
luavgl_iterate(L, -1, luavgl_img_set_property_kv, obj);
return 0;
}
/**
* img.set_src(img, "path")
*/
static int luavgl_img_set_src(lua_State *L)
{
lv_obj_t *obj = luavgl_to_obj(L, 1);
const char *src = luavgl_toimgsrc(L, 2);
if (src != NULL) {
lv_img_set_src(obj, src);
}
return 0;
}
/**
* img:set_offset({x=10})
* img:set_offset({x=10})
* img:set_offset({x=10, y=100})
*/
static int luavgl_img_set_offset(lua_State *L)
{
lv_obj_t *obj = luavgl_to_obj(L, 1);
if (!lua_istable(L, -1)) {
luaL_argerror(L, -1, "should be table {x=0,y=0,anim=true}");
}
lv_coord_t v;
lua_getfield(L, -1, "x");
if (!lua_isnil(L, -1)) {
v = lua_tointeger(L, -1);
lua_pop(L, 1);
lv_img_set_offset_x(obj, v);
}
lua_getfield(L, -1, "y");
if (!lua_isnil(L, -1)) {
v = lua_tointeger(L, -1);
lua_pop(L, 1);
lv_img_set_offset_y(obj, v);
}
return 0;
}
/**
* img:set_pivot({x=10, y=100})
*/
static int luavgl_img_set_pivot(lua_State *L)
{
lv_obj_t *obj = luavgl_to_obj(L, 1);
if (!lua_istable(L, -1)) {
luaL_argerror(L, -1, "should be table {x=0,y=0,anim=true}");
}
lv_coord_t x = 0, y = 0;
lua_getfield(L, -1, "x");
x = lua_tointeger(L, -1);
lua_getfield(L, -1, "y");
y = lua_tointeger(L, -1);
lv_img_set_pivot(obj, x, y);
return 0;
}
/**
* return image size w, h
* img:get_img_size() -- get size of this image
* img:get_img_size("src") -- get size of img "src"
*/
static int luavgl_get_img_size(lua_State *L)
{
lv_obj_t *obj = luavgl_to_obj(L, 1);
const void *src = NULL;
if (lua_isnoneornil(L, 2)) {
src = lv_img_get_src(obj);
} else {
src = luavgl_toimgsrc(L, 2);
}
lv_img_header_t header;
if (src == NULL || lv_img_decoder_get_info(src, &header) != LV_RES_OK) {
lua_pushnil(L);
lua_pushnil(L);
} else {
lua_pushinteger(L, header.w);
lua_pushinteger(L, header.h);
}
return 2;
}
static const luaL_Reg luavgl_img_methods[] = {
{"set", luavgl_img_set },
{"set_src", luavgl_img_set_src },
{"set_offset", luavgl_img_set_offset},
{"set_pivot", luavgl_img_set_pivot },
{"get_img_size", luavgl_get_img_size },
{NULL, NULL },
};
static void luavgl_img_init(lua_State *L)
{
luavgl_obj_newmetatable(L, &lv_img_class, "lv_img", luavgl_img_methods);
lua_pop(L, 1);
}