summaryrefslogtreecommitdiff
path: root/apps/plugins/lua
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/lua')
-rw-r--r--apps/plugins/lua/rocklib.c73
1 files changed, 72 insertions, 1 deletions
diff --git a/apps/plugins/lua/rocklib.c b/apps/plugins/lua/rocklib.c
index 4dc7081711..506fc6163d 100644
--- a/apps/plugins/lua/rocklib.c
+++ b/apps/plugins/lua/rocklib.c
@@ -181,6 +181,73 @@ static inline void rli_init(lua_State *L)
181 181
182#define RB_WRAP(M) static int rock_##M(lua_State *L) 182#define RB_WRAP(M) static int rock_##M(lua_State *L)
183 183
184/* Helper function for opt_viewport */
185static void check_tablevalue(lua_State *L, const char* key, int tablepos, void* res, bool unsigned_val)
186{
187 lua_pushstring(L, key); /* Push the key on the stack */
188 lua_gettable(L, tablepos); /* Find table[key] (pops key off the stack) */
189
190 if(!lua_isnoneornil(L, -1))
191 {
192 if(unsigned_val)
193 *(unsigned*)res = luaL_checkint(L, -1);
194 else
195 *(int*)res = luaL_checkint(L, -1);
196 }
197
198 lua_pop(L, 1); /* Pop the value off the stack */
199}
200
201static struct viewport* opt_viewport(lua_State *L, int narg, struct viewport* alt)
202{
203 if(lua_isnoneornil(L, narg))
204 return alt;
205
206 int tablepos = lua_gettop(L);
207
208 lua_pushliteral(L, "vp"); /* push 'vp' on the stack */
209 struct viewport *vp = (struct viewport*)lua_newuserdata(L, sizeof(struct viewport)); /* allocate memory and push it as udata on the stack */
210 memset(vp, 0, sizeof(struct viewport)); /* Init viewport values to 0 */
211 lua_settable(L, tablepos); /* table['vp'] = vp (pops key & value off the stack) */
212
213 luaL_checktype(L, narg, LUA_TTABLE);
214
215 check_tablevalue(L, "x", tablepos, &vp->x, false);
216 check_tablevalue(L, "y", tablepos, &vp->y, false);
217 check_tablevalue(L, "width", tablepos, &vp->width, false);
218 check_tablevalue(L, "height", tablepos, &vp->height, false);
219#ifdef HAVE_LCD_BITMAP
220 check_tablevalue(L, "font", tablepos, &vp->font, false);
221 check_tablevalue(L, "drawmode", tablepos, &vp->drawmode, false);
222#endif
223#if LCD_DEPTH > 1
224 check_tablevalue(L, "fg_pattern", tablepos, &vp->fg_pattern, true);
225 check_tablevalue(L, "bg_pattern", tablepos, &vp->bg_pattern, true);
226#ifdef HAVE_LCD_COLOR
227 check_tablevalue(L, "lss_pattern", tablepos, &vp->lss_pattern, true);
228 check_tablevalue(L, "lse_pattern", tablepos, &vp->lse_pattern, true);
229 check_tablevalue(L, "lst_pattern", tablepos, &vp->lse_pattern, true);
230#endif
231#endif
232
233 return vp;
234}
235
236RB_WRAP(set_viewport)
237{
238 struct viewport *vp = opt_viewport(L, 1, NULL);
239 int screen = luaL_optint(L, 2, SCREEN_MAIN);
240 rb->screens[screen]->set_viewport(vp);
241 return 0;
242}
243
244RB_WRAP(clear_viewport)
245{
246 int screen = luaL_optint(L, 2, SCREEN_MAIN);
247 rb->screens[screen]->clear_viewport();
248 return 0;
249}
250
184RB_WRAP(splash) 251RB_WRAP(splash)
185{ 252{
186 int ticks = luaL_checkint(L, 1); 253 int ticks = luaL_checkint(L, 1);
@@ -837,6 +904,8 @@ static const luaL_Reg rocklib[] =
837 904
838 R(font_getstringsize), 905 R(font_getstringsize),
839 R(read_bmp_file), 906 R(read_bmp_file),
907 R(set_viewport),
908 R(clear_viewport),
840 909
841 {"new_image", rli_new}, 910 {"new_image", rli_new},
842 911
@@ -866,9 +935,11 @@ LUALIB_API int luaopen_rock(lua_State *L)
866 RB_CONSTANT(SEEK_SET); 935 RB_CONSTANT(SEEK_SET);
867 RB_CONSTANT(SEEK_CUR); 936 RB_CONSTANT(SEEK_CUR);
868 RB_CONSTANT(SEEK_END); 937 RB_CONSTANT(SEEK_END);
938
939 RB_CONSTANT(FONT_SYSFIXED);
940 RB_CONSTANT(FONT_UI);
869 941
870 rli_init(L); 942 rli_init(L);
871 943
872 return 1; 944 return 1;
873} 945}
874