diff options
Diffstat (limited to 'src/sysbin/lx')
-rw-r--r-- | src/sysbin/lx/lxdrawlib.c | 178 |
1 files changed, 167 insertions, 11 deletions
diff --git a/src/sysbin/lx/lxdrawlib.c b/src/sysbin/lx/lxdrawlib.c index 71c9819..91bf07f 100644 --- a/src/sysbin/lx/lxdrawlib.c +++ b/src/sysbin/lx/lxdrawlib.c @@ -1,5 +1,5 @@ /* -** Lua eXtended ioctl library +** Lua eXtended draw library */ #define lxdrawlib_c @@ -25,6 +25,12 @@ typedef struct { + font_t *font; +} drawlib_font; + +#define FONT "lx.draw.font" + +typedef struct { fb_t *fb; fb_region_t subregion; bool has_subregion; @@ -32,6 +38,57 @@ typedef struct { #define SURFACE "lx.draw.surface" +// ==================================================================== +// FONTS + +static int draw_loadfont(lua_State *L) { + const char* name = luaL_checkstring(L, 1); + font_t *f = g_load_font(name); + if (f == NULL) { + lua_pushnil(L); + return 1; + } + + drawlib_font *ff = (drawlib_font*)lua_newuserdata(L, sizeof(drawlib_font)); + luaL_getmetatable(L, FONT); + lua_setmetatable(L, -2); + + ff->font = f; + + return 1; +} + +static int font_gc(lua_State *L) { + drawlib_font *f = (drawlib_font*)luaL_checkudata(L, 1, FONT); + + if(f->font == NULL) { + luaL_error(L, "f->font == NULL ?"); + } + g_decref_font(f->font); + f->font = NULL; + + return 0; +} + +static int font_text_width(lua_State *L) { + drawlib_font *f = (drawlib_font*)luaL_checkudata(L, 1, FONT); + const char* txt = luaL_checkstring(L, 2); + + lua_pushinteger(L, g_text_width(f->font, txt)); + return 1; +} + +static int font_text_height(lua_State *L) { + drawlib_font *f = (drawlib_font*)luaL_checkudata(L, 1, FONT); + const char* txt = luaL_checkstring(L, 2); + + lua_pushinteger(L, g_text_height(f->font, txt)); + return 1; +} + +// ==================================================================== +// SURFACES + static int draw_from_fd(lua_State *L) { int fd = luaL_checkinteger(L, 1); luaL_checktype(L, 2, LUA_TTABLE); @@ -43,20 +100,22 @@ static int draw_from_fd(lua_State *L) { geom.pitch = getintfield(L, 2, "pitch"); geom.memory_model = getintfield(L, 2, "memory_model"); + fb_t *fb = g_fb_from_file(fd, &geom); + if (fb == NULL) { + lua_pushnil(L); + return 1; + } + drawlib_surface *s = (drawlib_surface*)lua_newuserdata(L, sizeof(drawlib_surface)); luaL_getmetatable(L, SURFACE); lua_setmetatable(L, -2); - s->fb = g_fb_from_file(fd, &geom); - if (s->fb == NULL) { - lua_pop(L, 1); - lua_pushnil(L); - } else { - s->subregion.x = s->subregion.y = 0; - s->subregion.w = geom.width; - s->subregion.h = geom.height; - s->has_subregion = false; - } + s->fb = fb; + s->subregion.x = s->subregion.y = 0; + s->subregion.w = geom.width; + s->subregion.h = geom.height; + s->has_subregion = false; + return 1; } @@ -124,14 +183,92 @@ static int surface_plot(lua_State *L) { int y = luaL_checkinteger(L, 3); color_t c = (color_t)lx_checklightudata(L, 4); + // TODO: relative to subregion! g_plot(s->fb, x, y, c); return 0; } +static int surface_hline(lua_State *L) { + drawlib_surface *s = (drawlib_surface*)luaL_checkudata(L, 1, SURFACE); + int x = luaL_checkinteger(L, 2); + int y = luaL_checkinteger(L, 3); + int w = luaL_checkinteger(L, 4); + color_t c = (color_t)lx_checklightudata(L, 5); + + // TODO: relative to subregion! + g_hline(s->fb, x, y, w, c); + return 0; +} + +static int surface_vline(lua_State *L) { + drawlib_surface *s = (drawlib_surface*)luaL_checkudata(L, 1, SURFACE); + int x = luaL_checkinteger(L, 2); + int y = luaL_checkinteger(L, 3); + int h = luaL_checkinteger(L, 4); + color_t c = (color_t)lx_checklightudata(L, 5); + + // TODO: relative to subregion! + g_vline(s->fb, x, y, h, c); + return 0; +} + +static int surface_line(lua_State *L) { + drawlib_surface *s = (drawlib_surface*)luaL_checkudata(L, 1, SURFACE); + int x = luaL_checkinteger(L, 2); + int y = luaL_checkinteger(L, 3); + int x2 = luaL_checkinteger(L, 4); + int y2 = luaL_checkinteger(L, 5); + color_t c = (color_t)lx_checklightudata(L, 6); + + // TODO: relative to subregion! + g_line(s->fb, x, y, x2, y2, c); + return 0; +} + +static int surface_rect(lua_State *L) { + drawlib_surface *s = (drawlib_surface*)luaL_checkudata(L, 1, SURFACE); + int x = luaL_checkinteger(L, 2); + int y = luaL_checkinteger(L, 3); + int w = luaL_checkinteger(L, 4); + int h = luaL_checkinteger(L, 5); + color_t c = (color_t)lx_checklightudata(L, 6); + + // TODO: relative to subregion! + g_rect(s->fb, x, y, w, h, c); + return 0; +} + +static int surface_fillrect(lua_State *L) { + drawlib_surface *s = (drawlib_surface*)luaL_checkudata(L, 1, SURFACE); + int x = luaL_checkinteger(L, 2); + int y = luaL_checkinteger(L, 3); + int w = luaL_checkinteger(L, 4); + int h = luaL_checkinteger(L, 5); + color_t c = (color_t)lx_checklightudata(L, 6); + + // TODO: relative to subregion! + g_fillrect(s->fb, x, y, w, h, c); + return 0; +} + +static int surface_write(lua_State *L) { + drawlib_surface *s = (drawlib_surface*)luaL_checkudata(L, 1, SURFACE); + int x = luaL_checkinteger(L, 2); + int y = luaL_checkinteger(L, 3); + const char *text = luaL_checkstring(L, 4); + drawlib_font *f = (drawlib_font*)luaL_checkudata(L, 5, FONT); + color_t c = (color_t)lx_checklightudata(L, 6); + + // TODO: relative to subregion! + g_write(s->fb, x, y, text, f->font, c); + return 0; +} + /* }====================================================== */ static const luaL_Reg drawlib[] = { {"from_fd", draw_from_fd}, + {"load_font", draw_loadfont}, {NULL, NULL} }; @@ -139,10 +276,23 @@ static const luaL_Reg surface_meta[] = { {"sub", surface_sub}, {"rgb", surface_rgb}, {"plot", surface_plot}, + {"hline", surface_hline}, + {"vline", surface_vline}, + {"line", surface_line}, + {"rect", surface_rect}, + {"fillrect", surface_fillrect}, + {"write", surface_write}, {"__gc", surface_gc}, {NULL, NULL} }; +static const luaL_Reg font_meta[] = { + {"text_width", font_text_width}, + {"text_height", font_text_height}, + {"__gc", font_gc}, + {NULL, NULL} +}; + LUAMOD_API int lx_open_draw (lua_State *L) { luaL_newlib(L, drawlib); @@ -153,6 +303,12 @@ LUAMOD_API int lx_open_draw (lua_State *L) { lua_setfield(L, -2, "__index"); lua_pop(L, 1); + luaL_newmetatable(L, FONT); + luaL_setfuncs(L, font_meta, 0); + lua_pushvalue(L, -1); + lua_setfield(L, -2, "__index"); + lua_pop(L, 1); + return 1; } |