icon.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "icon_i.h"
  2. #include <furi.h>
  3. Icon* icon_alloc(const IconData* data) {
  4. Icon* icon = furi_alloc(sizeof(Icon));
  5. icon->data = data;
  6. return icon;
  7. }
  8. void icon_free(Icon* icon) {
  9. furi_assert(icon);
  10. free(icon);
  11. }
  12. const uint8_t* icon_get_data(Icon* icon) {
  13. furi_assert(icon);
  14. if(icon->tick) {
  15. uint32_t now = osKernelGetTickCount();
  16. if(now < icon->tick) {
  17. icon->tick = now;
  18. icon_next_frame(icon);
  19. } else if(now - icon->tick > osKernelGetTickFreq() / icon->data->frame_rate) {
  20. icon->tick = now;
  21. icon_next_frame(icon);
  22. }
  23. }
  24. return icon->data->frames[icon->frame];
  25. }
  26. void icon_next_frame(Icon* icon) {
  27. furi_assert(icon);
  28. icon->frame = (icon->frame + 1) % icon->data->frame_count;
  29. }
  30. uint8_t icon_get_width(Icon* icon) {
  31. furi_assert(icon);
  32. return icon->data->width;
  33. }
  34. uint8_t icon_get_height(Icon* icon) {
  35. furi_assert(icon);
  36. return icon->data->height;
  37. }
  38. bool icon_is_animated(Icon* icon) {
  39. furi_assert(icon);
  40. return icon->data->frame_count > 1;
  41. }
  42. bool icon_is_animating(Icon* icon) {
  43. furi_assert(icon);
  44. return icon->tick > 0;
  45. }
  46. void icon_start_animation(Icon* icon) {
  47. furi_assert(icon);
  48. icon->tick = osKernelGetTickCount();
  49. }
  50. void icon_stop_animation(Icon* icon) {
  51. furi_assert(icon);
  52. icon->tick = 0;
  53. icon->frame = 0;
  54. }
  55. uint8_t icon_get_current_frame(Icon* icon) {
  56. furi_assert(icon);
  57. return icon->frame;
  58. }
  59. bool icon_is_last_frame(Icon* icon) {
  60. furi_assert(icon);
  61. return icon->data->frame_count - icon->frame <= 1;
  62. }