icon.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. }
  51. uint8_t icon_get_current_frame(Icon* icon) {
  52. furi_assert(icon);
  53. return icon->frame;
  54. }
  55. bool icon_is_last_frame(Icon* icon) {
  56. furi_assert(icon);
  57. return icon->data->frame_count - icon->frame <= 1;
  58. }