icon.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. void icon_start_animation(Icon* icon) {
  43. furi_assert(icon);
  44. icon->tick = osKernelGetTickCount();
  45. }
  46. void icon_stop_animation(Icon* icon) {
  47. furi_assert(icon);
  48. icon->tick = 0;
  49. icon->frame = 0;
  50. }