lvgl_img_loader.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /*
  2. * Copyright (c) 2020 Actions Technology Co., Ltd
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <string.h>
  7. #include <lvgl/lvgl_img_loader.h>
  8. /**********************
  9. * STATIC PROTOTYPES
  10. **********************/
  11. static int picarray_load(lvgl_img_loader_t * loader, uint16_t index, lv_img_dsc_t * dsc, lv_point_t * offset);
  12. static uint16_t picarray_get_count(lvgl_img_loader_t *loader);
  13. static int picregion_load(lvgl_img_loader_t * loader, uint16_t index, lv_img_dsc_t * dsc, lv_point_t * offset);
  14. static void picregion_unload(lvgl_img_loader_t * loader, lv_img_dsc_t * dsc);
  15. static void picregion_preload(lvgl_img_loader_t * loader, uint16_t index);
  16. static uint16_t picregion_get_count(lvgl_img_loader_t *loader);
  17. static int picgroup_load(lvgl_img_loader_t * loader, uint16_t index, lv_img_dsc_t * dsc, lv_point_t * offset);
  18. static void picgroup_unload(lvgl_img_loader_t * loader, lv_img_dsc_t * dsc);
  19. static void picgroup_preload(lvgl_img_loader_t * loader, uint16_t index);
  20. static uint16_t picgroup_get_count(lvgl_img_loader_t * loader);
  21. /**********************
  22. * STATIC VARIABLES
  23. **********************/
  24. static const lvgl_img_loader_fn_t picarray_loader_fn = {
  25. .load = picarray_load,
  26. .get_count = picarray_get_count,
  27. };
  28. static const lvgl_img_loader_fn_t picregion_loader_fn = {
  29. .load = picregion_load,
  30. .unload = picregion_unload,
  31. .preload = picregion_preload,
  32. .get_count = picregion_get_count,
  33. };
  34. static const lvgl_img_loader_fn_t picgroup_loader_fn = {
  35. .load = picgroup_load,
  36. .unload = picgroup_unload,
  37. .preload = picgroup_preload,
  38. .get_count = picgroup_get_count,
  39. };
  40. /**********************
  41. * GLOBAL FUNCTIONS
  42. **********************/
  43. int lvgl_img_loader_set_picarray(lvgl_img_loader_t * loader,
  44. const lv_img_dsc_t * dsc, const lv_point_t * offsets, uint16_t num)
  45. {
  46. memset(loader, 0, sizeof(*loader));
  47. loader->fn = &picarray_loader_fn;
  48. loader->picarray.dsc = dsc;
  49. loader->picarray.offsets = offsets;
  50. loader->picarray.count = num;
  51. loader->last_preload_idx = -1;
  52. return 0;
  53. }
  54. int lvgl_img_loader_set_picregion(lvgl_img_loader_t * loader, uint32_t scene_id,
  55. lvgl_res_picregion_t * picregion)
  56. {
  57. memset(loader, 0, sizeof(*loader));
  58. loader->fn = &picregion_loader_fn;
  59. loader->picregion.scene_id = scene_id;
  60. loader->picregion.node = picregion;
  61. loader->last_preload_idx = -1;
  62. return 0;
  63. }
  64. int lvgl_img_loader_set_picgroup(lvgl_img_loader_t * loader, uint32_t scene_id,
  65. lvgl_res_group_t * picgroup, const uint32_t * ids, uint16_t num)
  66. {
  67. memset(loader, 0, sizeof(*loader));
  68. loader->fn = &picgroup_loader_fn;
  69. loader->picgroup.scene_id = scene_id;
  70. loader->picgroup.node = picgroup;
  71. loader->picgroup.ids = ids;
  72. loader->picgroup.count = num;
  73. loader->last_preload_idx = -1;
  74. return 0;
  75. }
  76. int lvgl_img_loader_set_custom(lvgl_img_loader_t *loader,
  77. const lvgl_img_loader_fn_t * fn, void * user_data)
  78. {
  79. memset(loader, 0, sizeof(*loader));
  80. loader->fn = fn;
  81. loader->user_data = user_data;
  82. loader->last_preload_idx = -1;
  83. return 0;
  84. }
  85. /**********************
  86. * STATIC FUNCTIONS
  87. **********************/
  88. static int picarray_load(lvgl_img_loader_t * loader, uint16_t index, lv_img_dsc_t * dsc, lv_point_t * offset)
  89. {
  90. if (offset) {
  91. if (loader->picarray.offsets) {
  92. offset->x = loader->picarray.offsets[index].x;
  93. offset->y = loader->picarray.offsets[index].y;
  94. } else {
  95. offset->x = 0;
  96. offset->y = 0;
  97. }
  98. }
  99. memcpy(dsc, &loader->picarray.dsc[index], sizeof(*dsc));
  100. return 0;
  101. }
  102. static uint16_t picarray_get_count(lvgl_img_loader_t * loader)
  103. {
  104. return loader->picarray.count;
  105. }
  106. static int picregion_load(lvgl_img_loader_t * loader, uint16_t index, lv_img_dsc_t * dsc, lv_point_t * offset)
  107. {
  108. int res = lvgl_res_load_pictures_from_picregion(loader->picregion.node, index, index, dsc);
  109. if (res == 0 && offset != NULL) {
  110. offset->x = 0;
  111. offset->y = 0;
  112. }
  113. return res;
  114. }
  115. static void picregion_unload(lvgl_img_loader_t *loader, lv_img_dsc_t * dsc)
  116. {
  117. if (dsc->data) {
  118. lvgl_res_unload_pictures(dsc, 1);
  119. dsc->data = NULL;
  120. }
  121. }
  122. static void picregion_preload(lvgl_img_loader_t *loader, uint16_t index)
  123. {
  124. lvgl_res_preload_pictures_from_picregion(loader->picregion.scene_id,
  125. loader->picregion.node, index, index);
  126. }
  127. static uint16_t picregion_get_count(lvgl_img_loader_t *loader)
  128. {
  129. return loader->picregion.node->frames;
  130. }
  131. static int picgroup_load(lvgl_img_loader_t *loader, uint16_t index, lv_img_dsc_t * dsc, lv_point_t * offset)
  132. {
  133. return lvgl_res_load_pictures_from_group(loader->picgroup.node,
  134. loader->picgroup.ids + index, dsc, offset, 1);
  135. }
  136. static void picgroup_unload(lvgl_img_loader_t *loader, lv_img_dsc_t * dsc)
  137. {
  138. if (dsc->data) {
  139. lvgl_res_unload_pictures(dsc, 1);
  140. dsc->data = NULL;
  141. }
  142. }
  143. static void picgroup_preload(lvgl_img_loader_t *loader, uint16_t index)
  144. {
  145. lvgl_res_preload_pictures_from_group(loader->picgroup.scene_id,
  146. loader->picgroup.node, loader->picgroup.ids + index, 1);
  147. }
  148. static uint16_t picgroup_get_count(lvgl_img_loader_t *loader)
  149. {
  150. return loader->picgroup.count;
  151. }