mp_obj_t py_imlib_save_template(mp_obj_t image_obj, mp_obj_t rectangle_obj, mp_obj_t path_obj) { struct image t; struct image *image = NULL; struct rectangle r; mp_obj_t *array; const char *path = mp_obj_str_get_str(path_obj); array = mp_obj_get_array_fixed_n(rectangle_obj, 4); r.x = mp_obj_get_int(array[0]); r.y = mp_obj_get_int(array[1]); r.w = mp_obj_get_int(array[2]); r.h = mp_obj_get_int(array[3]); /* get C image pointer */ image = py_image_cobj(image_obj); t.w = r.w; t.h = r.h; t.data = malloc(sizeof(*t.data)*t.w*t.h); imlib_subimage(image, &t, r.x, r.y); int res = imlib_save_template(&t, path); free(t.data); if (res != FR_OK) { nlr_jump(mp_obj_new_exception_msg(qstr_from_str("Imlib"), ffs_strerror(res))); } return mp_const_true; }
static mp_obj_t py_image_scale(mp_obj_t image_obj, mp_obj_t size_obj) { int w,h; mp_obj_t *array; image_t *src_image = NULL; /* get C image pointer */ src_image = py_image_cobj(image_obj); /* get x,y */ mp_obj_get_array_fixed_n(size_obj, 2, &array); w = mp_obj_get_int(array[0]); h = mp_obj_get_int(array[1]); image_t dst_image = { .w=w, .h=h, .bpp=src_image->bpp, .pixels=xalloc(w*h*src_image->bpp) }; imlib_scale(src_image, &dst_image, INTERP_BILINEAR); *src_image = dst_image; return image_obj; } static mp_obj_t py_image_scaled(mp_obj_t image_obj, mp_obj_t size_obj) { int w,h; mp_obj_t *array; image_t *src_image = NULL; /* get C image pointer */ src_image = py_image_cobj(image_obj); /* get x,y */ mp_obj_get_array_fixed_n(size_obj, 2, &array); w = mp_obj_get_int(array[0]); h = mp_obj_get_int(array[1]); image_t dst_image = { .w=w, .h=h, .bpp=src_image->bpp, .pixels=xalloc(w*h*src_image->bpp) }; imlib_scale(src_image, &dst_image, INTERP_NEAREST); return py_image_from_struct(&dst_image); } static mp_obj_t py_image_subimg(mp_obj_t image_obj, mp_obj_t subimg_obj) { rectangle_t r; image_t *image; mp_obj_t *array; /* image pointer */ image = py_image_cobj(image_obj); /* sub image */ mp_obj_get_array_fixed_n(subimg_obj, 4, &array); r.x = mp_obj_get_int(array[0]); r.y = mp_obj_get_int(array[1]); r.w = mp_obj_get_int(array[2]); r.h = mp_obj_get_int(array[3]); image_t subimg = { .w=r.w, .h=r.h, .bpp=image->bpp, .pixels=xalloc(r.w*r.h*image->bpp) }; imlib_subimage(image, &subimg, r.x, r.y); return py_image_from_struct(&subimg); } static mp_obj_t py_image_blit(mp_obj_t dst_image_obj, mp_obj_t src_image_obj, mp_obj_t offset_obj) { int x,y; image_t *src_image = NULL; image_t *dst_image = NULL; /* get C image pointer */ src_image = py_image_cobj(src_image_obj); dst_image = py_image_cobj(dst_image_obj); /* get x,y */ mp_obj_t *array; mp_obj_get_array_fixed_n(offset_obj, 2, &array); x = mp_obj_get_int(array[0]); y = mp_obj_get_int(array[1]); if ((src_image->w+x)>dst_image->w || (src_image->h+y)>dst_image->h) { printf("src image > dst image\n"); return mp_const_none; } imlib_blit(src_image, dst_image, x, y); return mp_const_none; }