sprite.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "sprite.h"
  2. #include <storage/storage.h>
  3. #ifdef SPRITE_DEBUG
  4. #define SPRITE_D(...) FURI_LOG_D("Sprite", __VA_ARGS__)
  5. #define SPRITE_E(...) FURI_LOG_E("Sprite", __VA_ARGS__)
  6. #else
  7. #define SPRITE_D(...)
  8. #define SPRITE_E(...)
  9. #endif
  10. struct Sprite {
  11. uint32_t width;
  12. uint32_t height;
  13. uint8_t data[];
  14. };
  15. Sprite* sprite_alloc(const char* path) {
  16. Storage* storage = furi_record_open(RECORD_STORAGE);
  17. File* file = storage_file_alloc(storage);
  18. Sprite* sprite = NULL;
  19. do {
  20. if(!storage_file_open(file, path, FSAM_READ, FSOM_OPEN_EXISTING)) {
  21. SPRITE_E("Failed to open file: %s", path);
  22. break;
  23. }
  24. uint32_t size = 0;
  25. if(storage_file_read(file, &size, sizeof(size)) != sizeof(size)) {
  26. SPRITE_E("Failed to read file size: %s", path);
  27. break;
  28. }
  29. sprite = malloc(size);
  30. if(storage_file_read(file, sprite, size) != size) {
  31. SPRITE_E("Failed to read file: %s", path);
  32. free(sprite);
  33. sprite = NULL;
  34. break;
  35. }
  36. SPRITE_D(
  37. "Loaded sprite: %s, width: %lu, height: %lu", path, sprite->width, sprite->height);
  38. } while(false);
  39. storage_file_free(file);
  40. return sprite;
  41. }
  42. void sprite_free(Sprite* sprite) {
  43. free(sprite);
  44. }
  45. size_t sprite_get_width(Sprite* sprite) {
  46. return sprite->width;
  47. }
  48. size_t sprite_get_height(Sprite* sprite) {
  49. return sprite->height;
  50. }
  51. void canvas_draw_sprite(Canvas* canvas, Sprite* sprite, int32_t x, int32_t y) {
  52. furi_check(sprite->width);
  53. furi_check(sprite->height);
  54. furi_check(sprite->data);
  55. canvas_draw_xbm(canvas, x, y, sprite->width, sprite->height, sprite->data);
  56. }