luat_lib_lvgl_canvas_ex.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. /*
  2. @module lvgl
  3. @summary LVGL图像库
  4. @version 1.0
  5. @date 2021.06.01
  6. */
  7. #include "luat_base.h"
  8. #include "lvgl.h"
  9. #include "luat_lvgl.h"
  10. #include "luat_malloc.h"
  11. #include "luat_zbuff.h"
  12. static lv_res_t _canvas_gc(struct _lv_obj_t * obj, lv_signal_t sign, void * param) {
  13. if (sign == LV_SIGNAL_CLEANUP) {
  14. lv_canvas_ext_t * ext = lv_obj_get_ext_attr(obj);
  15. if (ext != NULL && ext->dsc.data != NULL) {
  16. luat_heap_free(ext->dsc.data);
  17. }
  18. }
  19. return LV_RES_OK;
  20. }
  21. int luat_lv_canvas_set_buffer(lua_State *L) {
  22. LV_DEBUG("CALL lv_canvas_set_buffer");
  23. lv_obj_t* canvas = (lv_obj_t*)lua_touserdata(L, 1);
  24. void *buf = NULL;
  25. lv_coord_t w = (lv_coord_t)luaL_checknumber(L, 3);
  26. lv_coord_t h = (lv_coord_t)luaL_checknumber(L, 4);
  27. lv_img_cf_t cf = (lv_img_cf_t)luaL_checkinteger(L, 5);
  28. buf = luat_heap_malloc((lv_img_cf_get_px_size(cf) * w * h) / 8);
  29. if (buf == NULL)
  30. return 0;
  31. lv_canvas_set_buffer(canvas ,buf ,w ,h ,cf);
  32. lv_obj_set_signal_cb(canvas, _canvas_gc);
  33. return 0;
  34. }