Changeset View
Changeset View
Standalone View
Standalone View
stand/liblua/lutils.c
Show All 29 Lines | |||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include "lua.h" | #include "lua.h" | ||||
#include "lauxlib.h" | #include "lauxlib.h" | ||||
#include "lstd.h" | #include "lstd.h" | ||||
#include "lutils.h" | #include "lutils.h" | ||||
#include "bootstrap.h" | #include "bootstrap.h" | ||||
#include <gfx_fb.h> | |||||
#include <pnglite.h> | |||||
/* | /* | ||||
* Like loader.perform, except args are passed already parsed | * Like loader.perform, except args are passed already parsed | ||||
* on the stack. | * on the stack. | ||||
*/ | */ | ||||
static int | static int | ||||
lua_command(lua_State *L) | lua_command(lua_State *L) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 295 Lines • ▼ Show 20 Lines | for (i = 0; i < nargs - 1; i++) { | ||||
if (wrsz < bufsz) | if (wrsz < bufsz) | ||||
return luaL_fileresult(L, 0, NULL); | return luaL_fileresult(L, 0, NULL); | ||||
w += wrsz; | w += wrsz; | ||||
} | } | ||||
lua_pushinteger(L, w); | lua_pushinteger(L, w); | ||||
return 1; | return 1; | ||||
} | } | ||||
/* | |||||
* put image using terminal coordinates. | |||||
*/ | |||||
static int | |||||
lua_term_putimage(lua_State *L) | |||||
{ | |||||
const char *name; | |||||
png_t png; | |||||
uint32_t x1, y1, x2, y2, f; | |||||
int nargs, ret = 0, error; | |||||
nargs = lua_gettop(L); | |||||
if (nargs != 6) { | |||||
lua_pushboolean(L, 0); | |||||
return 1; | |||||
} | |||||
name = luaL_checkstring(L, 1); | |||||
x1 = luaL_checknumber(L, 2); | |||||
y1 = luaL_checknumber(L, 3); | |||||
x2 = luaL_checknumber(L, 4); | |||||
y2 = luaL_checknumber(L, 5); | |||||
f = luaL_checknumber(L, 6); | |||||
x1 = gfx_state.tg_origin.tp_col + x1 * gfx_state.tg_font.vf_width; | |||||
y1 = gfx_state.tg_origin.tp_row + y1 * gfx_state.tg_font.vf_height; | |||||
if (x2 != 0) { | |||||
x2 = gfx_state.tg_origin.tp_col + | |||||
x2 * gfx_state.tg_font.vf_width; | |||||
} | |||||
if (y2 != 0) { | |||||
y2 = gfx_state.tg_origin.tp_row + | |||||
y2 * gfx_state.tg_font.vf_height; | |||||
} | |||||
if ((error = png_open(&png, name)) != PNG_NO_ERROR) { | |||||
if (f & FL_PUTIMAGE_DEBUG) | |||||
printf("%s\n", png_error_string(error)); | |||||
} else { | |||||
if (gfx_fb_putimage(&png, x1, y1, x2, y2, f) == 0) | |||||
ret = 1; | |||||
(void) png_close(&png); | |||||
} | |||||
lua_pushboolean(L, ret); | |||||
return 1; | |||||
} | |||||
static int | |||||
lua_fb_putimage(lua_State *L) | |||||
{ | |||||
const char *name; | |||||
png_t png; | |||||
uint32_t x1, y1, x2, y2, f; | |||||
int nargs, ret = 0, error; | |||||
nargs = lua_gettop(L); | |||||
if (nargs != 6) { | |||||
lua_pushboolean(L, 0); | |||||
return 1; | |||||
} | |||||
name = luaL_checkstring(L, 1); | |||||
x1 = luaL_checknumber(L, 2); | |||||
y1 = luaL_checknumber(L, 3); | |||||
x2 = luaL_checknumber(L, 4); | |||||
y2 = luaL_checknumber(L, 5); | |||||
f = luaL_checknumber(L, 6); | |||||
if ((error = png_open(&png, name)) != PNG_NO_ERROR) { | |||||
if (f & FL_PUTIMAGE_DEBUG) | |||||
printf("%s\n", png_error_string(error)); | |||||
} else { | |||||
if (gfx_fb_putimage(&png, x1, y1, x2, y2, f) == 0) | |||||
ret = 1; | |||||
(void) png_close(&png); | |||||
} | |||||
lua_pushboolean(L, ret); | |||||
return 1; | |||||
} | |||||
static int | |||||
lua_fb_setpixel(lua_State *L) | |||||
{ | |||||
uint32_t x, y; | |||||
int nargs; | |||||
nargs = lua_gettop(L); | |||||
if (nargs != 2) { | |||||
lua_pushnil(L); | |||||
return 1; | |||||
} | |||||
x = luaL_checknumber(L, 1); | |||||
y = luaL_checknumber(L, 2); | |||||
gfx_fb_setpixel(x, y); | |||||
return 0; | |||||
} | |||||
static int | |||||
lua_fb_line(lua_State *L) | |||||
{ | |||||
uint32_t x0, y0, x1, y1, wd; | |||||
int nargs; | |||||
nargs = lua_gettop(L); | |||||
if (nargs != 5) { | |||||
lua_pushnil(L); | |||||
return 1; | |||||
} | |||||
x0 = luaL_checknumber(L, 1); | |||||
y0 = luaL_checknumber(L, 2); | |||||
x1 = luaL_checknumber(L, 3); | |||||
y1 = luaL_checknumber(L, 4); | |||||
wd = luaL_checknumber(L, 5); | |||||
gfx_fb_line(x0, y0, x1, y1, wd); | |||||
return 0; | |||||
} | |||||
static int | |||||
lua_fb_bezier(lua_State *L) | |||||
{ | |||||
uint32_t x0, y0, x1, y1, x2, y2, width; | |||||
int nargs; | |||||
nargs = lua_gettop(L); | |||||
if (nargs != 7) { | |||||
lua_pushnil(L); | |||||
return 1; | |||||
} | |||||
x0 = luaL_checknumber(L, 1); | |||||
y0 = luaL_checknumber(L, 2); | |||||
x1 = luaL_checknumber(L, 3); | |||||
y1 = luaL_checknumber(L, 4); | |||||
x2 = luaL_checknumber(L, 5); | |||||
y2 = luaL_checknumber(L, 6); | |||||
width = luaL_checknumber(L, 7); | |||||
gfx_fb_bezier(x0, y0, x1, y1, x2, y2, width); | |||||
return 0; | |||||
} | |||||
static int | |||||
lua_fb_drawrect(lua_State *L) | |||||
{ | |||||
uint32_t x0, y0, x1, y1, fill; | |||||
int nargs; | |||||
nargs = lua_gettop(L); | |||||
if (nargs != 5) { | |||||
lua_pushnil(L); | |||||
return 1; | |||||
} | |||||
x0 = luaL_checknumber(L, 1); | |||||
y0 = luaL_checknumber(L, 2); | |||||
x1 = luaL_checknumber(L, 3); | |||||
y1 = luaL_checknumber(L, 4); | |||||
fill = luaL_checknumber(L, 5); | |||||
gfx_fb_drawrect(x0, y0, x1, y1, fill); | |||||
return 0; | |||||
} | |||||
static int | |||||
lua_term_drawrect(lua_State *L) | |||||
{ | |||||
uint32_t x0, y0, x1, y1; | |||||
int nargs; | |||||
nargs = lua_gettop(L); | |||||
if (nargs != 4) { | |||||
lua_pushnil(L); | |||||
return 1; | |||||
} | |||||
x0 = luaL_checknumber(L, 1); | |||||
y0 = luaL_checknumber(L, 2); | |||||
x1 = luaL_checknumber(L, 3); | |||||
y1 = luaL_checknumber(L, 4); | |||||
gfx_term_drawrect(x0, y0, x1, y1); | |||||
return 0; | |||||
} | |||||
#define REG_SIMPLE(n) { #n, lua_ ## n } | #define REG_SIMPLE(n) { #n, lua_ ## n } | ||||
static const struct luaL_Reg loaderlib[] = { | static const struct luaL_Reg loaderlib[] = { | ||||
REG_SIMPLE(delay), | REG_SIMPLE(delay), | ||||
REG_SIMPLE(command_error), | REG_SIMPLE(command_error), | ||||
REG_SIMPLE(command), | REG_SIMPLE(command), | ||||
REG_SIMPLE(interpret), | REG_SIMPLE(interpret), | ||||
REG_SIMPLE(parse), | REG_SIMPLE(parse), | ||||
REG_SIMPLE(getenv), | REG_SIMPLE(getenv), | ||||
REG_SIMPLE(perform), | REG_SIMPLE(perform), | ||||
/* Also registered as the global 'printc' */ | /* Also registered as the global 'printc' */ | ||||
REG_SIMPLE(printc), | REG_SIMPLE(printc), | ||||
REG_SIMPLE(setenv), | REG_SIMPLE(setenv), | ||||
REG_SIMPLE(time), | REG_SIMPLE(time), | ||||
REG_SIMPLE(unsetenv), | REG_SIMPLE(unsetenv), | ||||
REG_SIMPLE(fb_bezier), | |||||
REG_SIMPLE(fb_drawrect), | |||||
REG_SIMPLE(fb_line), | |||||
REG_SIMPLE(fb_putimage), | |||||
REG_SIMPLE(fb_setpixel), | |||||
REG_SIMPLE(term_drawrect), | |||||
REG_SIMPLE(term_putimage), | |||||
{ NULL, NULL }, | { NULL, NULL }, | ||||
}; | }; | ||||
static const struct luaL_Reg iolib[] = { | static const struct luaL_Reg iolib[] = { | ||||
{ "close", lua_closefile }, | { "close", lua_closefile }, | ||||
REG_SIMPLE(getchar), | REG_SIMPLE(getchar), | ||||
REG_SIMPLE(gets), | REG_SIMPLE(gets), | ||||
REG_SIMPLE(ischar), | REG_SIMPLE(ischar), | ||||
Show All 29 Lines |