buffer.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #pragma once
  2. #include <furi.h>
  3. #include <gui/canvas.h>
  4. #include "vector.h"
  5. enum DrawMode {
  6. WhiteOnly,
  7. BlackOnly,
  8. WhiteAsBlack,
  9. BlackAsWhite,
  10. WhiteAsInverted,
  11. BlackAsInverted,
  12. };
  13. typedef struct {
  14. uint8_t* data;
  15. uint8_t* back_buffer;
  16. uint8_t width;
  17. uint8_t height;
  18. bool double_buffered;
  19. } Buffer;
  20. enum PixelColor {
  21. Black, //or
  22. White, //
  23. Flip //not
  24. };
  25. typedef struct {
  26. const Vector anchor;
  27. enum DrawMode drawMode;
  28. } RenderSettings;
  29. #define SCREEN_WIDTH 128
  30. #define SCREEN_HEIGHT 64
  31. #define DEFAULT_RENDER \
  32. (RenderSettings) { \
  33. .anchor = {.x = 0.5f, .y = 0.5f}, .drawMode = BlackOnly \
  34. }
  35. Buffer* buffer_create(uint8_t width, uint8_t height, bool double_buffered);
  36. void buffer_release(Buffer* buffer);
  37. bool buffer_test_coordinate(Buffer* const buffer, int x, int y);
  38. bool buffer_get_pixel(Buffer* const buffer, int x, int y);
  39. void buffer_set_pixel(Buffer* buffer, int16_t x, int16_t y, enum PixelColor draw_mode);
  40. Buffer* buffer_copy(Buffer* buffer);
  41. void buffer_swap_back(Buffer* buffer);
  42. void buffer_swap_with(Buffer* buffer_a, Buffer* buffer_b);
  43. void buffer_draw_all(Buffer* target, Buffer* const sprite, Vector* position, float rotation);
  44. void buffer_draw(
  45. Buffer* target,
  46. Buffer* const sprite,
  47. Vector* position,
  48. uint8_t x_cap,
  49. uint8_t y_cap,
  50. float rotation,
  51. RenderSettings* settings);
  52. //void buffer_draw_internal(Buffer *target, Buffer* sprite, bool is_black, enum PixelColor color, Vector *const position, uint8_t x_cap, uint8_t y_cap, float rotation);
  53. void buffer_render(Buffer* buffer, Canvas* const canvas);
  54. void buffer_clear(Buffer* buffer);
  55. void buffer_draw_line(Buffer* buffer, int x0, int y0, int x1, int y1, enum PixelColor draw_mode);
  56. void buffer_draw_rbox(
  57. Buffer* buffer,
  58. int16_t x0,
  59. int16_t y0,
  60. int16_t x1,
  61. int16_t y1,
  62. enum PixelColor draw_mode);
  63. void buffer_draw_rbox_frame(
  64. Buffer* buffer,
  65. int16_t x0,
  66. int16_t y0,
  67. int16_t x1,
  68. int16_t y1,
  69. enum PixelColor draw_mode);
  70. void buffer_draw_box(
  71. Buffer* buffer,
  72. int16_t x0,
  73. int16_t y0,
  74. int16_t x1,
  75. int16_t y1,
  76. enum PixelColor draw_mode);
  77. void buffer_draw_circle(Buffer* buffer, int x, int y, int r, enum PixelColor draw_mode);