icon.c 1.3 KB

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