diff options
Diffstat (limited to 'apps/plugins/lua')
-rw-r--r-- | apps/plugins/lua/rocklib_img.c | 130 |
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 */ |
722 | static int custom_transform(lua_State *L, | 722 | static 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 */ |
771 | static int blit_transform(lua_State *L, | 776 | static 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 | ||
856 | static int invert_transform(lua_State *L, | 860 | static 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 | ||
873 | static int clear_transform(lua_State *L, | 875 | static 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 */ | ||
1228 | static 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 | |||
1231 | RB_WRAP(lcd_mono_bitmap_part) | 1237 | RB_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) | |||
1247 | RB_WRAP(lcd_mono_bitmap) | 1250 | RB_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) | |||
1277 | RB_WRAP(lcd_bitmap) | 1274 | RB_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) | |||
1319 | RB_WRAP(lcd_bitmap_transparent) | 1310 | RB_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; |