5#include "TinyGPU/Color/RGB565.h"
6#include "TinyGPU/Surface/SpriteInfo.h"
7#include "TinyGPU/Surface/Surface.h"
8#include "TinyGPU/ThreeD/Vector.h"
10#include "TinyGPU/Util/TinyGPULogger.h"
11#include "TinyGPU/Input/TouchDriver.h"
12#include "TinyGPU/Boards/LCDBoards.h"
17
18
19
20
21
22
23
24
26template <
typename RGB_T =
RGB565>
30 RGB_T backgroundColor = RGB_T(0))
56 const ISurface<RGB_T>& sprite) {
57 TinyGPULogger.log(TinyGPULoggerClass::INFO,
"Adding sprite at (%zu, %zu)",
59 auto info = std::make_unique<SpriteInfo<RGB_T, Surface<RGB_T>>>(
60 x, y, sprite, backgroundColor_, defaultFont_);
62 displaySprite(x, y, info->currentSprite());
64 sprites_.push_back(std::move(info));
65 return *sprites_.back();
86 RGB_T backgroundColor) {
87 auto sprite = std::make_unique<Sprite<RGB_T>>(maxX, maxY, defaultFont_);
89 sprite->clear(backgroundColor);
93 result.isSurfaceAutoDelete =
true;
103 const ISurface<RGB_T>& sprite) {
104 TinyGPULogger.log(TinyGPULoggerClass::INFO,
105 "Adding sprite at (%zu, %zu) with max size (%zu, %zu)", x,
108 std::make_unique<SpriteInfoWithoutBackground<RGB_T, Surface<RGB_T>>>(
109 x, y, sprite, backgroundColor_, defaultFont_);
110 info->setMaxSize(maxX, maxY);
111 displaySprite(x, y, info->currentSprite());
112 sprites_.push_back(std::move(info));
113 return *sprites_.back();
121 auto it = tinygpu::findSprite(sprites_, sprite);
122 if (it != sprites_.end()) {
130 for (
const auto& sprite : sprites_) {
131 if (x >= sprite->x && x < sprite->x + sprite->currentSprite().width() &&
132 y >= sprite->y && y < sprite->y + sprite->currentSprite().height()) {
144 if (idx < 0 || idx >=
static_cast<
int>(sprites_.size())) {
147 return sprites_[idx].get();
153 for (
auto& spriteInfo : sprites_) {
154 if (spriteInfo->currentSprite().data() == sprite.data()) {
155 return spriteInfo.get();
164 TinyGPULogger.log(TinyGPULoggerClass::INFO,
165 "Moving sprite from (%zu, %zu) to (%zu, %zu)", sprite.x,
166 sprite.y, newX, newY);
167 if (sprite.x == newX && sprite.y == newY) {
177 displaySprite(sprite.x, sprite.y, sprite.currentSprite());
185 "Scaling sprite at (%zu, %zu) by %.2f", sprite.x
,
187 sprite.currentScale = scale;
196 float angleDegrees) {
198 "Rotating sprite at (%zu, %zu) by %.2f degrees", sprite.x
,
199 sprite.y
, angleDegrees
);
200 sprite.currentAngleDegrees = angleDegrees;
216 for (
const auto& sprite : sprites_) {
217 displaySprite(sprite->x, sprite->y, sprite->currentSprite());
230 "Touch detected at (%d, %d) with pressure %d",
235 "Touch is within sprite at (%zu, %zu)", sprite->x
,
237 sprite->onTouch(point);
244 void fillScreen(RGB_T color) { driver_.writeColor(width_, height_, color); }
266 if (newDim >= oldDim) {
267 size_t diff = (newDim - oldDim) / 2;
268 return (pos > diff) ? (pos - diff) : 0;
270 return pos + (oldDim - newDim) / 2;
276 Surface<RGB_T>&& transformedSprite) {
277 const Rect oldBounds{spriteInfo.x, spriteInfo.y,
278 spriteInfo.currentSprite().width(),
279 spriteInfo.currentSprite().height()};
283 const Rect clamped = spriteInfo.clampedSize(transformedSprite.width(),
284 transformedSprite.height());
285 const size_t anchoredX =
286 centeredCoordinate(spriteInfo.x, oldBounds.width, clamped.width);
287 const size_t anchoredY =
288 centeredCoordinate(spriteInfo.y, oldBounds.height, clamped.height);
292 spriteInfo.x = anchoredX;
293 spriteInfo.y = anchoredY;
294 spriteInfo.setTransformedSprite(std::move(transformedSprite));
295 displaySprite(spriteInfo.x, spriteInfo.y, spriteInfo.currentSprite());
300 void clearSprite(size_t x, size_t y,
const ISurface<RGB_T>& sprite) {
301 clearSprite(x, y, sprite.width(), sprite.height());
308 void clearSprite(size_t x, size_t y, size_t width, size_t height) {
309 actual_sprite_background_.resize(width, height);
310 actual_sprite_background_.clear(backgroundColor_);
313 driver_.writeData(actual_sprite_background_, x, y);
318 driver_.writeData(
const_cast<ISurface<RGB_T>&>(sprite), x, y);
Definition: DisplayDriver.h:49
Fixed-size 5x7 bitmap font with ASCII and extended character support.
Definition: Font5x7.h:23
Definition: LCDBoardsCommon.h:62
virtual TouchDriver * touch()=0
The board's touch controller, or nullptr if none is wired up.
virtual DisplayDriver< RGB565 > & display()=0
The board's display driver.
RGB color stored in 16-bit RGB565 format, byte-swapped from the conventional bit layout.
Definition: RGB565.h:24
Definition: SpriteDisplay.h:27
void rotateSprite(SpriteInfo< RGB_T, Surface< RGB_T > > &sprite, float angleDegrees)
Definition: SpriteDisplay.h:195
Font5x7< RGB_T > defaultFont_
Definition: SpriteDisplay.h:261
void scaleSprite(SpriteInfo< RGB_T, Surface< RGB_T > > &sprite, float scale)
Definition: SpriteDisplay.h:183
void clearSprite(Rect rect)
Definition: SpriteDisplay.h:304
SpriteInfo< RGB_T, Surface< RGB_T > > & addSprite(size_t x, size_t y, size_t maxX, size_t maxY, const ISurface< RGB_T > &sprite)
Adds a sprite with a preallocated max buffer size for transformations.
Definition: SpriteDisplay.h:101
SpriteDisplay(size_t width, size_t height, DisplayDriver< RGB_T > &driver, RGB_T backgroundColor=RGB_T(0))
Definition: SpriteDisplay.h:29
Sprite< RGB_T > actual_sprite_background_
Definition: SpriteDisplay.h:256
size_t getSpriteCount() const
Returns the number of sprites currently managed by the framebuffer.
Definition: SpriteDisplay.h:140
RGB_T backgroundColor_
Definition: SpriteDisplay.h:259
SpriteInfo< RGB_T, Surface< RGB_T > > * getSprite(size_t x, size_t y)
Returns a reference to the sprite at the given position, if any.
Definition: SpriteDisplay.h:129
size_t width_
Definition: SpriteDisplay.h:257
void refresh()
Definition: SpriteDisplay.h:214
bool begin()
Definition: SpriteDisplay.h:71
void setTouchDriver(TouchDriver &touch)
Defines the touch driver.
Definition: SpriteDisplay.h:222
SpriteInfo< RGB_T, Surface< RGB_T > > * getSprite(const ISurface< RGB_T > &sprite)
Definition: SpriteDisplay.h:152
bool isClearOnSpriteMove() const
Returns whether the automatic clearing is active when we move a sprite.
Definition: SpriteDisplay.h:250
void removeSprite(SpriteInfo< RGB_T, Surface< RGB_T > > &sprite)
Removes a sprite and restores the pixels behind it.
Definition: SpriteDisplay.h:117
size_t height_
Definition: SpriteDisplay.h:258
DisplayDriver< RGB_T > & driver_
Definition: SpriteDisplay.h:253
SpriteDisplay(LCDBoard &board, RGB_T backgroundColor=RGB_T(0))
Definition: SpriteDisplay.h:46
bool is_clear_on_sprite_move
Definition: SpriteDisplay.h:262
SpriteInfo< RGB_T, Surface< RGB_T > > & addSprite(size_t x, size_t y, const ISurface< RGB_T > &sprite)
Adds a sprite to the framebuffer and draws it at the given position.
Definition: SpriteDisplay.h:55
void fillScreen(RGB_T color)
Fills/clears the entire display with the specified color.
Definition: SpriteDisplay.h:244
Vector< std::unique_ptr< SpriteInfo< RGB_T, Surface< RGB_T > > > > sprites_
Definition: SpriteDisplay.h:260
TouchDriver * p_touchDriver
Definition: SpriteDisplay.h:254
void applyTransformedSprite(SpriteInfo< RGB_T, Surface< RGB_T > > &spriteInfo, Surface< RGB_T > &&transformedSprite)
Applies a transformed sprite image to the display and updates bookkeeping.
Definition: SpriteDisplay.h:275
void end()
Ends the processing.
Definition: SpriteDisplay.h:78
void processTouch()
Processes touch input and dispatches events to sprites if touched.
Definition: SpriteDisplay.h:225
void clearSprite(size_t x, size_t y, size_t width, size_t height)
Definition: SpriteDisplay.h:308
SpriteInfo< RGB_T, Surface< RGB_T > > & addSprite(size_t x, size_t y, size_t maxX, size_t maxY, RGB_T backgroundColor)
Adds a sprite with a preallocated max buffer size for transformations.
Definition: SpriteDisplay.h:84
void moveSprite(SpriteInfo< RGB_T, Surface< RGB_T > > &sprite, size_t newX, size_t newY)
Moves a sprite to a new position and redraws it.
Definition: SpriteDisplay.h:162
void setClearOnSpriteMove(bool clear)
Activates/deactivates the automatic clearing when we move a sprite.
Definition: SpriteDisplay.h:247
void clear()
Clears the display and resets the background color.
Definition: SpriteDisplay.h:206
static size_t centeredCoordinate(size_t pos, size_t oldDim, size_t newDim)
Helper to calculate centered coordinate when scaling/rotating.
Definition: SpriteDisplay.h:265
void displaySprite(size_t x, size_t y, const ISurface< RGB_T > &sprite)
Draws a sprite at (x, y)
Definition: SpriteDisplay.h:316
LCDBoard * p_board_
Definition: SpriteDisplay.h:255
void clearSprite(size_t x, size_t y, const ISurface< RGB_T > &sprite)
Definition: SpriteDisplay.h:300
SpriteInfo< RGB_T, Surface< RGB_T > > * getSprite(int idx)
Returns a reference to the sprite at the given index, if valid.
Definition: SpriteDisplay.h:143
In-memory bitmap surface with basic 2D drawing and text rendering.
Definition: Surface.h:38
Simple header-only logger for TinyGPU with log levels and vararg support.
Definition: TinyGPULogger.h:24
@ INFO
General information.
Definition: TinyGPULogger.h:32
void log(Level level, const char *fmt,...)
Log a message with printf-style formatting.
Definition: TinyGPULogger.h:56
Base class for touch controllers.
Definition: TouchDriverCommon.h:72
virtual bool isTouched()=0
Return whether the panel currently appears touched.
virtual bool getPoint(Point &outPoint)=0
Read the current touch point.
Definition: DSIBusESP32.h:19
Touch point.
Definition: TouchDriverCommon.h:32
uint16_t pressure
Definition: TouchDriverCommon.h:35
int16_t x
Definition: TouchDriverCommon.h:33
int16_t y
Definition: TouchDriverCommon.h:34
Represents a rectangular area on the screen or surface.
Definition: SpriteInfo.h:19
Definition: SpriteInfo.h:52