summaryrefslogtreecommitdiff
path: root/apps/plugins/lua
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/lua')
-rw-r--r--apps/plugins/lua/rocklib_img.c130
1 files changed, 59 insertions, 71 deletions
diff --git a/apps/plugins/lua/rocklib_img.c b/apps/plugins/lua/rocklib_img.c
index 45012ece20..6cece9c836 100644
--- a/apps/plugins/lua/rocklib_img.c
+++ b/apps/plugins/lua/rocklib_img.c
@@ -719,7 +719,7 @@ static inline int rli_pushpixel(lua_State *L, fb_data color, int x, int y)
719} 719}
720 720
721/* User defined pixel manipulations through rli_copy, rli_marshal */ 721/* User defined pixel manipulations through rli_copy, rli_marshal */
722static int custom_transform(lua_State *L, 722static void custom_transform(lua_State *L,
723 struct rli_iter_d *ds, 723 struct rli_iter_d *ds,
724 struct rli_iter_d *ss, 724 struct rli_iter_d *ss,
725 int op, 725 int op,
@@ -731,44 +731,49 @@ static int custom_transform(lua_State *L,
731 fb_data src; 731 fb_data src;
732 732
733 int params; 733 int params;
734 int ret = 0; 734 bool done = true;
735 735
736 if (!lua_isfunction(L, -1)) 736 if (true)/*(lua_isfunction(L, -1))*/
737 return ret; /* error */ 737 {
738 lua_pushvalue(L, -1); /* make a copy of the lua function */
738 739
739 lua_pushvalue(L, -1); /* make a copy of the lua function */ 740 dst = data_get(ds->elem, ds->x, ds->y);
741 params = rli_pushpixel(L, dst, ds->x, ds->y);
740 742
741 dst = data_get(ds->elem, ds->x, ds->y); 743 if(ss) /* Allows src to be omitted */
742 params = rli_pushpixel(L, dst, ds->x, ds->y); 744 {
745 src = data_get(ss->elem, ss->x, ss->y);
746 params += rli_pushpixel(L, src, ss->x, ss->y);
747 }
743 748
744 if(ss) /* Allows src to be omitted */ 749 lua_call(L, params, 2); /* call custom function w/ n-params & 2 ret */
745 {
746 src = data_get(ss->elem, ss->x, ss->y);
747 params += rli_pushpixel(L, src, ss->x, ss->y);
748 }
749 750
750 lua_call(L, params, 2); /* call custom function w/ n-params & 2 ret */ 751 if(lua_type(L, -2) == LUA_TNUMBER)
752 {
753 done = false;
754 dst = FB_SCALARPACK((unsigned) lua_tointeger(L, -2));
755 data_set(ds->elem, ds->x, ds->y, &dst);
756 }
751 757
752 if(lua_type(L, -2) == LUA_TNUMBER) 758 if(ss && (lua_type(L, -1) == LUA_TNUMBER))
753 { 759 {
754 ret |= 1; 760 done = false;
755 dst = FB_SCALARPACK((unsigned) lua_tointeger(L, -2)); 761 src = FB_SCALARPACK((unsigned) lua_tointeger(L, -1));
756 data_set(ds->elem, ds->x, ds->y, &dst); 762 data_set(ss->elem, ss->x, ss->y, &src);
763 }
764
765 lua_pop(L, 2);
757 } 766 }
758 767
759 if(ss && (lua_type(L, -1) == LUA_TNUMBER)) 768 if(done) /* signal iter to stop */
760 { 769 {
761 ret |= 2; 770 ds->dx = 0;
762 src = FB_SCALARPACK((unsigned) lua_tointeger(L, -1)); 771 ds->dy = 0;
763 data_set(ss->elem, ss->x, ss->y, &src);
764 } 772 }
765
766 lua_pop(L, 2);
767 return ret; /* 0 signals iterator to stop */
768} /* custom_transform */ 773} /* custom_transform */
769 774
770/* Pre defined pixel manipulations through rli_copy */ 775/* Pre defined pixel manipulations through rli_copy */
771static int blit_transform(lua_State *L, 776static void blit_transform(lua_State *L,
772 struct rli_iter_d *ds, 777 struct rli_iter_d *ds,
773 struct rli_iter_d *ss, 778 struct rli_iter_d *ss,
774 int op, 779 int op,
@@ -850,10 +855,9 @@ static int blit_transform(lua_State *L,
850 }/*switch op*/ 855 }/*switch op*/
851 fb_data val = FB_SCALARPACK(dst); 856 fb_data val = FB_SCALARPACK(dst);
852 data_set(ds->elem, ds->x, ds->y, &val); 857 data_set(ds->elem, ds->x, ds->y, &val);
853 return 1;
854} /* blit_transform */ 858} /* blit_transform */
855 859
856static int invert_transform(lua_State *L, 860static void invert_transform(lua_State *L,
857 struct rli_iter_d *ds, 861 struct rli_iter_d *ds,
858 struct rli_iter_d *ss, 862 struct rli_iter_d *ss,
859 int op, 863 int op,
@@ -866,11 +870,9 @@ static int invert_transform(lua_State *L,
866 870
867 fb_data val = invert_color(data_get(ds->elem, ds->x, ds->y)); 871 fb_data val = invert_color(data_get(ds->elem, ds->x, ds->y));
868 data_set(ds->elem, ds->x, ds->y, &val); 872 data_set(ds->elem, ds->x, ds->y, &val);
869
870 return 1;
871} /* invert_transform */ 873} /* invert_transform */
872 874
873static int clear_transform(lua_State *L, 875static void clear_transform(lua_State *L,
874 struct rli_iter_d *ds, 876 struct rli_iter_d *ds,
875 struct rli_iter_d *ss, 877 struct rli_iter_d *ss,
876 int op, 878 int op,
@@ -881,8 +883,6 @@ static int clear_transform(lua_State *L,
881 (void) ss; 883 (void) ss;
882 884
883 data_set(ds->elem, ds->x, ds->y, color); 885 data_set(ds->elem, ds->x, ds->y, color);
884
885 return 1;
886} /* clear_transform */ 886} /* clear_transform */
887 887
888#endif /* RLI_EXTENDED */ 888#endif /* RLI_EXTENDED */
@@ -1047,7 +1047,7 @@ RLI_LUA rli_marshal(lua_State *L) /* also invert, clear */
1047 /* (indices 1-8 are used by rli_iter_create) */ 1047 /* (indices 1-8 are used by rli_iter_create) */
1048 fb_data clr; 1048 fb_data clr;
1049 1049
1050 int (*rli_trans)(lua_State *, struct rli_iter_d *, struct rli_iter_d *, int, fb_data *); 1050 void (*rli_trans)(lua_State *, struct rli_iter_d *, struct rli_iter_d *, int, fb_data *);
1051 int ltype = lua_type (L, 9); 1051 int ltype = lua_type (L, 9);
1052 1052
1053 /* create new iter + pushed onto stack */ 1053 /* create new iter + pushed onto stack */
@@ -1068,9 +1068,7 @@ RLI_LUA rli_marshal(lua_State *L) /* also invert, clear */
1068 1068
1069 do 1069 do
1070 { 1070 {
1071 if(!(*rli_trans)(L, ds, NULL, 0, &clr)) 1071 (*rli_trans)(L, ds, NULL, 0, &clr);
1072 break; /* Custom op can quit early */
1073
1074 } while(next_rli_iter(ds)); 1072 } while(next_rli_iter(ds));
1075 1073
1076 return 0; 1074 return 0;
@@ -1112,7 +1110,7 @@ RLI_LUA rli_copy(lua_State *L)
1112 bool s_swx = false; /* src swap */ 1110 bool s_swx = false; /* src swap */
1113 bool s_swy = false; 1111 bool s_swy = false;
1114 1112
1115 int (*rli_trans)(lua_State *, struct rli_iter_d *, struct rli_iter_d *, int, fb_data *); 1113 void (*rli_trans)(lua_State *, struct rli_iter_d *, struct rli_iter_d *, int, fb_data *);
1116 1114
1117 if(!clip) /* Out of bounds is not allowed */ 1115 if(!clip) /* Out of bounds is not allowed */
1118 { 1116 {
@@ -1164,9 +1162,7 @@ RLI_LUA rli_copy(lua_State *L)
1164 1162
1165 do 1163 do
1166 { 1164 {
1167 if(!(*rli_trans)(L, &ds, &ss, op, &clr)) 1165 (*rli_trans)(L, &ds, &ss, op, &clr);
1168 break; /* Custom op can quit early */
1169
1170 } while(next_rli_iter(&ds) && next_rli_iter(&ss)); 1166 } while(next_rli_iter(&ds) && next_rli_iter(&ss));
1171 1167
1172 return 0; 1168 return 0;
@@ -1228,17 +1224,24 @@ RB_WRAP(lcd_framebuffer)
1228 return 1; 1224 return 1;
1229} 1225}
1230 1226
1227/* helper function for lcd_xxx_bitmap functions */
1228static int get_bmp_bounds(lua_State *L, int npos, int *x, int *y, int *w, int* h)
1229{
1230 *x = luaL_checkint(L, npos);
1231 *y = luaL_checkint(L, npos + 1);
1232 *w = luaL_checkint(L, npos + 2);
1233 *h = luaL_checkint(L, npos + 3);
1234 return luaL_optint(L, npos + 4, SCREEN_MAIN);
1235}
1236
1231RB_WRAP(lcd_mono_bitmap_part) 1237RB_WRAP(lcd_mono_bitmap_part)
1232{ 1238{
1233 struct rocklua_image *src = rli_checktype(L, 1); 1239 struct rocklua_image *src = rli_checktype(L, 1);
1234 int src_x = luaL_checkint(L, 2); 1240 int src_x = luaL_checkint(L, 2);
1235 int src_y = luaL_checkint(L, 3); 1241 int src_y = luaL_checkint(L, 3);
1236 int stride = luaL_checkint(L, 4); 1242 int stride = luaL_checkint(L, 4);
1237 int x = luaL_checkint(L, 5); 1243 int x, y, width, height;
1238 int y = luaL_checkint(L, 6); 1244 int screen = get_bmp_bounds(L, 5, &x, &y, &width, &height);
1239 int width = luaL_checkint(L, 7);
1240 int height = luaL_checkint(L, 8);
1241 int screen = luaL_optint(L, 9, SCREEN_MAIN);
1242 1245
1243 rb->screens[screen]->mono_bitmap_part((const unsigned char *)src->data, src_x, src_y, stride, x, y, width, height); 1246 rb->screens[screen]->mono_bitmap_part((const unsigned char *)src->data, src_x, src_y, stride, x, y, width, height);
1244 return 0; 1247 return 0;
@@ -1247,11 +1250,8 @@ RB_WRAP(lcd_mono_bitmap_part)
1247RB_WRAP(lcd_mono_bitmap) 1250RB_WRAP(lcd_mono_bitmap)
1248{ 1251{
1249 struct rocklua_image *src = rli_checktype(L, 1); 1252 struct rocklua_image *src = rli_checktype(L, 1);
1250 int x = luaL_checkint(L, 2); 1253 int x, y, width, height;
1251 int y = luaL_checkint(L, 3); 1254 int screen = get_bmp_bounds(L, 2, &x, &y, &width, &height);
1252 int width = luaL_checkint(L, 4);
1253 int height = luaL_checkint(L, 5);
1254 int screen = luaL_optint(L, 6, SCREEN_MAIN);
1255 1255
1256 rb->screens[screen]->mono_bitmap((const unsigned char *)src->data, x, y, width, height); 1256 rb->screens[screen]->mono_bitmap((const unsigned char *)src->data, x, y, width, height);
1257 return 0; 1257 return 0;
@@ -1264,11 +1264,8 @@ RB_WRAP(lcd_bitmap_part)
1264 int src_x = luaL_checkint(L, 2); 1264 int src_x = luaL_checkint(L, 2);
1265 int src_y = luaL_checkint(L, 3); 1265 int src_y = luaL_checkint(L, 3);
1266 int stride = luaL_checkint(L, 4); 1266 int stride = luaL_checkint(L, 4);
1267 int x = luaL_checkint(L, 5); 1267 int x, y, width, height;
1268 int y = luaL_checkint(L, 6); 1268 int screen = get_bmp_bounds(L, 5, &x, &y, &width, &height);
1269 int width = luaL_checkint(L, 7);
1270 int height = luaL_checkint(L, 8);
1271 int screen = luaL_optint(L, 9, SCREEN_MAIN);
1272 1269
1273 rb->screens[screen]->bitmap_part(src->data, src_x, src_y, stride, x, y, width, height); 1270 rb->screens[screen]->bitmap_part(src->data, src_x, src_y, stride, x, y, width, height);
1274 return 0; 1271 return 0;
@@ -1277,11 +1274,8 @@ RB_WRAP(lcd_bitmap_part)
1277RB_WRAP(lcd_bitmap) 1274RB_WRAP(lcd_bitmap)
1278{ 1275{
1279 struct rocklua_image *src = rli_checktype(L, 1); 1276 struct rocklua_image *src = rli_checktype(L, 1);
1280 int x = luaL_checkint(L, 2); 1277 int x, y, width, height;
1281 int y = luaL_checkint(L, 3); 1278 int screen = get_bmp_bounds(L, 2, &x, &y, &width, &height);
1282 int width = luaL_checkint(L, 4);
1283 int height = luaL_checkint(L, 5);
1284 int screen = luaL_optint(L, 6, SCREEN_MAIN);
1285 1279
1286 rb->screens[screen]->bitmap(src->data, x, y, width, height); 1280 rb->screens[screen]->bitmap(src->data, x, y, width, height);
1287 return 0; 1281 return 0;
@@ -1306,11 +1300,8 @@ RB_WRAP(lcd_bitmap_transparent_part)
1306 int src_x = luaL_checkint(L, 2); 1300 int src_x = luaL_checkint(L, 2);
1307 int src_y = luaL_checkint(L, 3); 1301 int src_y = luaL_checkint(L, 3);
1308 int stride = luaL_checkint(L, 4); 1302 int stride = luaL_checkint(L, 4);
1309 int x = luaL_checkint(L, 5); 1303 int x, y, width, height;
1310 int y = luaL_checkint(L, 6); 1304 int screen = get_bmp_bounds(L, 5, &x, &y, &width, &height);
1311 int width = luaL_checkint(L, 7);
1312 int height = luaL_checkint(L, 8);
1313 int screen = luaL_optint(L, 9, SCREEN_MAIN);
1314 1305
1315 rb->screens[screen]->transparent_bitmap_part(src->data, src_x, src_y, stride, x, y, width, height); 1306 rb->screens[screen]->transparent_bitmap_part(src->data, src_x, src_y, stride, x, y, width, height);
1316 return 0; 1307 return 0;
@@ -1319,11 +1310,8 @@ RB_WRAP(lcd_bitmap_transparent_part)
1319RB_WRAP(lcd_bitmap_transparent) 1310RB_WRAP(lcd_bitmap_transparent)
1320{ 1311{
1321 struct rocklua_image *src = rli_checktype(L, 1); 1312 struct rocklua_image *src = rli_checktype(L, 1);
1322 int x = luaL_checkint(L, 2); 1313 int x, y, width, height;
1323 int y = luaL_checkint(L, 3); 1314 int screen = get_bmp_bounds(L, 2, &x, &y, &width, &height);
1324 int width = luaL_checkint(L, 4);
1325 int height = luaL_checkint(L, 5);
1326 int screen = luaL_optint(L, 6, SCREEN_MAIN);
1327 1315
1328 rb->screens[screen]->transparent_bitmap(src->data, x, y, width, height); 1316 rb->screens[screen]->transparent_bitmap(src->data, x, y, width, height);
1329 return 0; 1317 return 0;