Sprite.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /***************************************************************************************
  2. // The following class creates Sprites in RAM, graphics can then be drawn in the Sprite
  3. // and rendered quickly onto the TFT screen. The class inherits the graphics functions
  4. // from the TFT_eSPI class. Some functions are overridden by this class so that the
  5. // graphics are written to the Sprite rather than the TFT.
  6. ***************************************************************************************/
  7. class TFT_eSprite : public TFT_eSPI {
  8. public:
  9. explicit TFT_eSprite(TFT_eSPI *tft);
  10. ~TFT_eSprite(void);
  11. // Create a sprite of width x height pixels, return a pointer to the RAM area
  12. // Sketch can cast returned value to (uint16_t*) for 16 bit depth if needed
  13. // RAM required is:
  14. // - 1 bit per pixel for 1 bit colour depth
  15. // - 1 nibble per pixel for 4 bit colour
  16. // - 1 byte per pixel for 8 bit colour
  17. // - 2 bytes per pixel for 16 bit color depth
  18. void* createSprite(int16_t width, int16_t height, uint8_t frames = 1);
  19. // Returns a pointer to the sprite or nullptr if not created, user must cast to pointer type
  20. void* getPointer(void);
  21. // Returns true if sprite has been created
  22. bool created(void);
  23. // Delete the sprite to free up the RAM
  24. void deleteSprite(void);
  25. // Select the frame buffer for graphics write (for 2 colour ePaper and DMA toggle buffer)
  26. // Returns a pointer to the Sprite frame buffer
  27. void* frameBuffer(int8_t f);
  28. // Set or get the colour depth to 4, 8 or 16 bits. Can be used to change depth an existing
  29. // sprite, but clears it to black, returns a new pointer if sprite is re-created.
  30. void* setColorDepth(int8_t b);
  31. int8_t getColorDepth(void);
  32. // Set the palette for a 4 bit depth sprite. Only the first 16 colours in the map are used.
  33. void createPalette(uint16_t *palette = nullptr, uint8_t colors = 16); // Palette in RAM
  34. void createPalette(const uint16_t *palette = nullptr, uint8_t colors = 16); // Palette in FLASH
  35. // Set a single palette index to the given color
  36. void setPaletteColor(uint8_t index, uint16_t color);
  37. // Get the color at the given palette index
  38. uint16_t getPaletteColor(uint8_t index);
  39. // Set foreground and background colours for 1 bit per pixel Sprite
  40. void setBitmapColor(uint16_t fg, uint16_t bg);
  41. void drawPixel(int32_t x, int32_t y, uint32_t color);
  42. void drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t font),
  43. // Fill Sprite with a colour
  44. fillSprite(uint32_t color),
  45. // Define a window to push 16 bit colour pixels into in a raster order
  46. // Colours are converted to the set Sprite colour bit depth
  47. setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1),
  48. // Push a color (aka singe pixel) to the screen
  49. pushColor(uint32_t color),
  50. // Push len colors (pixels) to the screen
  51. pushColor(uint32_t color, uint16_t len),
  52. // Push a pixel preformatted as a 8 or 16 bit colour (avoids conversion overhead)
  53. writeColor(uint16_t color),
  54. // Set the scroll zone, top left corner at x,y with defined width and height
  55. // The colour (optional, black is default) is used to fill the gap after the scroll
  56. setScrollRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t color = TFT_BLACK),
  57. // Scroll the defined zone dx,dy pixels. Negative values left,up, positive right,down
  58. // dy is optional (default is then no up/down scroll).
  59. // The sprite coordinate frame does not move because pixels are moved
  60. scroll(int16_t dx, int16_t dy = 0),
  61. // Draw lines
  62. drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color),
  63. drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color),
  64. drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color),
  65. // Fill a rectangular area with a color (aka draw a filled rectangle)
  66. fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color);
  67. // Set the coordinate rotation of the Sprite (for 1bpp Sprites only)
  68. // Note: this uses coordinate rotation and is primarily for ePaper which does not support
  69. // CGRAM rotation (like TFT drivers do) within the displays internal hardware
  70. void setRotation(uint8_t rotation);
  71. uint8_t getRotation(void);
  72. // Push a rotated copy of Sprite to TFT with optional transparent colour
  73. bool pushRotated(int16_t angle, uint32_t transp = 0x00FFFFFF); // Using fixed point maths
  74. // Push a rotated copy of Sprite to another different Sprite with optional transparent colour
  75. bool pushRotated(TFT_eSprite *spr, int16_t angle, uint32_t transp = 0x00FFFFFF); // Using fixed point maths
  76. // Get the TFT bounding box for a rotated copy of this Sprite
  77. bool getRotatedBounds(int16_t angle, int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y);
  78. // Get the destination Sprite bounding box for a rotated copy of this Sprite
  79. bool getRotatedBounds(TFT_eSprite *spr, int16_t angle, int16_t *min_x, int16_t *min_y,
  80. int16_t *max_x, int16_t *max_y);
  81. // Bounding box support function
  82. void getRotatedBounds(int16_t angle, int16_t w, int16_t h, int16_t xp, int16_t yp,
  83. int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y);
  84. // Read the colour of a pixel at x,y and return value in 565 format
  85. uint16_t readPixel(int32_t x0, int32_t y0);
  86. // return the numerical value of the pixel at x,y (used when scrolling)
  87. // 16bpp = colour, 8bpp = byte, 4bpp = colour index, 1bpp = 1 or 0
  88. uint16_t readPixelValue(int32_t x, int32_t y);
  89. // Write an image (colour bitmap) to the sprite.
  90. void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, uint16_t *data, uint8_t sbpp = 0);
  91. void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, const uint16_t *data);
  92. // Push the sprite to the TFT screen, this fn calls pushImage() in the TFT class.
  93. // Optionally a "transparent" colour can be defined, pixels of that colour will not be rendered
  94. void pushSprite(int32_t x, int32_t y);
  95. void pushSprite(int32_t x, int32_t y, uint16_t transparent);
  96. // Push a windowed area of the sprite to the TFT at tx, ty
  97. bool pushSprite(int32_t tx, int32_t ty, int32_t sx, int32_t sy, int32_t sw, int32_t sh);
  98. // Push the sprite to another sprite at x,y. This fn calls pushImage() in the destination sprite (dspr) class.
  99. // >>>>>> Using a transparent color is not supported at the moment <<<<<<
  100. bool pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y);
  101. bool pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y, uint16_t transparent);
  102. int16_t drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font),
  103. drawChar(uint16_t uniCode, int32_t x, int32_t y);
  104. // Return the width and height of the sprite
  105. int16_t width(void),
  106. height(void);
  107. // Functions associated with anti-aliased fonts
  108. void drawGlyph(uint16_t code);
  109. void printToSprite(String string);
  110. void printToSprite(char *cbuffer, uint16_t len);
  111. int16_t printToSprite(int16_t x, int16_t y, uint16_t index);
  112. private:
  113. TFT_eSPI *_tft;
  114. // Reserve memory for the Sprite and return a pointer
  115. void* callocSprite(int16_t width, int16_t height, uint8_t frames = 1);
  116. protected:
  117. uint8_t _bpp; // bits per pixel (1, 8 or 16)
  118. uint16_t *_img; // pointer to 16 bit sprite
  119. uint8_t *_img8; // pointer to 8 bit sprite frame 1 or frame 2
  120. uint8_t *_img4; // pointer to 4 bit sprite (uses color map)
  121. uint8_t *_img8_1; // pointer to frame 1
  122. uint8_t *_img8_2; // pointer to frame 2
  123. uint16_t *_colorMap; // color map: 16 entries, used with 4 bit color map.
  124. int32_t _sinra;
  125. int32_t _cosra;
  126. bool _created; // A Sprite has been created and memory reserved
  127. bool _gFont = false;
  128. int32_t _xs, _ys, _xe, _ye, _xptr, _yptr; // for setWindow
  129. int32_t _sx, _sy; // x,y for scroll zone
  130. uint32_t _sw, _sh; // w,h for scroll zone
  131. uint32_t _scolor; // gap fill colour for scroll zone
  132. int32_t _iwidth, _iheight; // Sprite memory image bit width and height (swapped during rotations)
  133. int32_t _dwidth, _dheight; // Real display width and height (for <8bpp Sprites)
  134. int32_t _bitwidth; // Sprite image bit width for drawPixel (for <8bpp Sprites, not swapped)
  135. };