@@ -122,6 +122,27 @@ ImageBuffer *load_image(var_t *map) {
122122 return result;
123123}
124124
125+ ImageBuffer *load_image (const unsigned char * buffer, int32_t size) {
126+ ImageBuffer *result = NULL ;
127+ unsigned w, h;
128+ unsigned char *image;
129+ unsigned error = 0 ;
130+
131+ error = lodepng_decode32 (&image, &w, &h, buffer, size);
132+ if (!error) {
133+ result = new ImageBuffer ();
134+ result->_bid = ++nextId;
135+ result->_width = w;
136+ result->_height = h;
137+ result->_filename = NULL ;
138+ result->_image = image;
139+ cache.add (result);
140+ } else {
141+ err_throw (ERR_IMAGE_LOAD, lodepng_error_text (error));
142+ }
143+ return result;
144+ }
145+
125146ImageBuffer *load_image (dev_file_t *filep) {
126147 ImageBuffer *result = NULL ;
127148 List_each (ImageBuffer *, it, cache) {
@@ -424,14 +445,25 @@ extern "C" void v_create_image(var_p_t var) {
424445 strcpy (file.name , arg.v .p .ptr );
425446 file.type = ft_stream;
426447 image = load_image (&file);
427- } else if (arg.type == V_ARRAY && !prog_error) {
428- char **data = new char *[arg.v .a .size ];
429- for (int i = 0 ; i < arg.v .a .size ; i++) {
430- var_p_t elem = v_elem (&arg, i);
431- data[i] = elem->v .p .ptr ;
448+ } else if (arg.type == V_ARRAY && arg.v .a .size > 0 && !prog_error) {
449+ var_p_t elem0 = v_elem (&arg, 0 );
450+ if (elem0->type == V_STR) {
451+ char **data = new char *[arg.v .a .size ];
452+ for (int i = 0 ; i < arg.v .a .size ; i++) {
453+ var_p_t elem = v_elem (&arg, i);
454+ data[i] = elem->v .p .ptr ;
455+ }
456+ image = load_xpm_image (data);
457+ delete [] data;
458+ } else if (elem0->type == V_INT) {
459+ unsigned char *data = new unsigned char [arg.v .a .size ];
460+ for (int i = 0 ; i < arg.v .a .size ; i++) {
461+ var_p_t elem = v_elem (&arg, i);
462+ data[i] = (unsigned char )elem->v .i ;
463+ }
464+ image = load_image (data, arg.v .a .size );
465+ delete [] data;
432466 }
433- image = load_xpm_image (data);
434- delete [] data;
435467 } else {
436468 image = load_image (&arg);
437469 }
0 commit comments