canvas.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "canvas.h"
  2. #include "canvas_i.h"
  3. #include <assert.h>
  4. #include <flipper.h>
  5. #include <u8g2.h>
  6. struct Canvas {
  7. FuriRecordSubscriber* fb_record;
  8. u8g2_t* fb;
  9. uint8_t offset_x;
  10. uint8_t offset_y;
  11. uint8_t width;
  12. uint8_t height;
  13. };
  14. Canvas* canvas_alloc() {
  15. Canvas* canvas = furi_alloc(sizeof(Canvas));
  16. canvas->fb_record = furi_open_deprecated("u8g2_fb", false, false, NULL, NULL, NULL);
  17. assert(canvas->fb_record);
  18. return canvas;
  19. }
  20. void canvas_free(Canvas* canvas) {
  21. assert(canvas);
  22. free(canvas);
  23. }
  24. void canvas_commit(Canvas* canvas) {
  25. assert(canvas);
  26. if(canvas->fb) {
  27. furi_commit(canvas->fb_record);
  28. canvas->fb = NULL;
  29. }
  30. }
  31. void canvas_frame_set(
  32. Canvas* canvas,
  33. uint8_t offset_x,
  34. uint8_t offset_y,
  35. uint8_t width,
  36. uint8_t height) {
  37. assert(canvas);
  38. canvas->offset_x = offset_x;
  39. canvas->offset_y = offset_y;
  40. canvas->width = width;
  41. canvas->height = height;
  42. }
  43. u8g2_t* canvas_fb(Canvas* canvas) {
  44. if(!canvas->fb) {
  45. canvas->fb = furi_take(canvas->fb_record);
  46. assert(canvas->fb);
  47. }
  48. return canvas->fb;
  49. }
  50. void canvas_clear(Canvas* canvas) {
  51. u8g2_t* fb = canvas_fb(canvas);
  52. u8g2_ClearBuffer(fb);
  53. }
  54. void canvas_color_set(Canvas* canvas, uint8_t color) {
  55. u8g2_t* fb = canvas_fb(canvas);
  56. u8g2_SetDrawColor(fb, 1);
  57. }
  58. void canvas_font_set(Canvas* canvas, font_t font) {
  59. u8g2_t* fb = canvas_fb(canvas);
  60. u8g2_SetFontMode(fb, 1);
  61. u8g2_SetFont(fb, font);
  62. }
  63. void canvas_str_draw(Canvas* canvas, uint8_t x, uint8_t y, const char* str) {
  64. x += canvas->offset_x;
  65. y += canvas->offset_y;
  66. u8g2_t* fb = canvas_fb(canvas);
  67. u8g2_DrawStr(fb, x, y, str);
  68. }