6#include "TinyGPU/Color/RGB565.h"
7#include "TinyGPU/ThreeD/Vector.h"
8#include "TinyGPU/Input/TouchDriverCommon.h"
13
14
15
16
17
18
27 const size_t overlapX = std::max(first.x, second.x);
28 const size_t overlapY = std::max(first.y, second.y);
29 const size_t firstRight = first.x + first.width;
30 const size_t firstBottom = first.y + first.height;
31 const size_t secondRight = second.x + second.width;
32 const size_t secondBottom = second.y + second.height;
33 const size_t overlapRight = std::min(firstRight, secondRight);
34 const size_t overlapBottom = std::min(firstBottom, secondBottom);
36 if (overlapX >= overlapRight || overlapY >= overlapBottom) {
40 return {overlapX, overlapY, overlapRight - overlapX,
41 overlapBottom - overlapY};
46
47
48
49
50
80 SpriteInfo(size_t startX, size_t startY,
const ISurface<RGB_T>& sourceSprite,
81 RGB_T transparentColor, IFont<RGB_T>& font)
90 if (isSurfaceAutoDelete && sprite) {
96 return {x, y, currentSprite().width(), currentSprite().height()};
119 if (transformedSprite) {
120 return {0, 0, maxWidth, maxHeight};
122 return {0, 0, rawWidth, rawHeight};
127 return hasTransformedContent
128 ?
static_cast<
const ISurface<RGB_T>&>(*transformedSprite)
134 originalPixels.resize(currentSprite().width(), currentSprite().height());
135 framebuffer.copySprite(x, y, originalPixels);
148 if (!transformedSprite) {
150 std::make_unique<SurfaceT>(maxWidth, maxHeight, fontRef);
151 transformedSprite->begin();
158 if (!transformedSprite) {
160 maxWidth = newSprite.width();
161 maxHeight = newSprite.height();
163 std::make_unique<SurfaceT>(maxWidth, maxHeight, newSprite.font());
164 transformedSprite->begin();
173 const size_t copyWidth = std::min(maxWidth, newSprite.width());
174 const size_t copyHeight = std::min(maxHeight, newSprite.height());
175 const size_t srcOffsetX = (newSprite.width() - copyWidth) / 2;
176 const size_t srcOffsetY = (newSprite.height() - copyHeight) / 2;
177 const size_t dstOffsetX = (maxWidth - copyWidth) / 2;
178 const size_t dstOffsetY = (maxHeight - copyHeight) / 2;
180 transformedSprite->clear(RGB_T(0));
181 for (size_t y = 0; y < copyHeight; ++y) {
182 for (size_t x = 0; x < copyWidth; ++x) {
183 transformedSprite->setPixel(
184 dstOffsetX + x, dstOffsetY + y,
185 newSprite.getPixel(srcOffsetX + x, srcOffsetY + y));
193
194
195
196
197
198
202 const ISurface<RGB_T>& sourceSprite,
203 RGB_T transparentColor, IFont<RGB_T>& font)
213template <
typename RGB_T,
typename SurfaceT>
218 sprites.begin(), sprites.end(),
219 [&spriteInfo](
const std::unique_ptr<SpriteInfo<RGB_T, SurfaceT>>& entry) {
220 return entry.get() == &spriteInfo;
226template <
typename RGB_T>
229 size_t scaledWidth =
static_cast<size_t>(source.width() * scale);
230 size_t scaledHeight =
static_cast<size_t>(source.height() * scale);
232 if (scaledWidth == 0) {
235 if (scaledHeight == 0) {
239 Surface<RGB_T> scaledSprite(scaledWidth, scaledHeight, font);
240 scaledSprite.begin();
241 for (size_t currentY = 0; currentY < scaledHeight; ++currentY) {
242 const size_t sourceY =
243 static_cast<size_t>(
static_cast<
float>(currentY) / scale);
244 const size_t clampedY =
245 sourceY < source.height() ? sourceY : source.height() - 1;
246 for (size_t currentX = 0; currentX < scaledWidth; ++currentX) {
247 const size_t sourceX =
248 static_cast<size_t>(
static_cast<
float>(currentX) / scale);
249 const size_t clampedX =
250 sourceX < source.width() ? sourceX : source.width() - 1;
251 scaledSprite.setPixel(currentX, currentY,
252 source.getPixel(clampedX, clampedY));
261template <
typename RGB_T>
265 const float radians =
266 static_cast<
float>(angleDegrees) * 3.14159265358979323846 / 180.0;
267 const float cosine = std::cos(radians);
268 const float sine = std::sin(radians);
269 const float sourceWidth =
static_cast<
float>(source.width());
270 const float sourceHeight =
static_cast<
float>(source.height());
271 size_t rotatedWidth =
static_cast<size_t>(std::ceil(
272 std::fabs(sourceWidth * cosine) + std::fabs(sourceHeight * sine)));
273 size_t rotatedHeight =
static_cast<size_t>(std::ceil(
274 std::fabs(sourceWidth * sine) + std::fabs(sourceHeight * cosine)));
276 if (rotatedWidth == 0) {
279 if (rotatedHeight == 0) {
283 Surface<RGB_T> rotatedSprite(rotatedWidth, rotatedHeight, font);
284 rotatedSprite.begin();
285 rotatedSprite.clear(fillColor);
287 const float sourceCenterX = (sourceWidth - 1.0) / 2.0;
288 const float sourceCenterY = (sourceHeight - 1.0) / 2.0;
289 const float rotatedCenterX = (
static_cast<
float>(rotatedWidth) - 1.0) / 2.0;
290 const float rotatedCenterY =
291 (
static_cast<
float>(rotatedHeight) - 1.0) / 2.0;
293 for (size_t currentY = 0; currentY < rotatedHeight; ++currentY) {
294 for (size_t currentX = 0; currentX < rotatedWidth; ++currentX) {
295 const float targetX =
static_cast<
float>(currentX) - rotatedCenterX;
296 const float targetY =
static_cast<
float>(currentY) - rotatedCenterY;
297 const float sourceX =
298 (targetX * cosine) + (targetY * sine) + sourceCenterX;
299 const float sourceY =
300 (-targetX * sine) + (targetY * cosine) + sourceCenterY;
301 const long nearestX = std::lround(sourceX);
302 const long nearestY = std::lround(sourceY);
304 if (nearestX >= 0 && nearestY >= 0 &&
305 static_cast<size_t>(nearestX) < source.width() &&
306 static_cast<size_t>(nearestY) < source.height()) {
307 rotatedSprite.setPixel(
309 source.getPixel(
static_cast<size_t>(nearestX),
310 static_cast<size_t>(nearestY)));
315 return rotatedSprite;
336template <
typename RGB_T,
typename SurfaceT>
339 Surface<RGB_T> scaled =
340 scaleSpriteImage(*spriteInfo.sprite, spriteInfo.currentScale, font);
341 return rotateSpriteImage(scaled, spriteInfo.currentAngleDegrees,
342 spriteInfo.invisibleColor, font);
Definition: DSIBusESP32.h:19
Surface< RGB_T > scaleSpriteImage(const ISurface< RGB_T > &source, float scale, IFont< RGB_T > &font)
Definition: SpriteInfo.h:227
Surface< RGB_T > rotateSpriteImage(const ISurface< RGB_T > &source, float angleDegrees, RGB_T fillColor, IFont< RGB_T > &font)
Definition: SpriteInfo.h:262
Surface< RGB_T > renderTransformedSprite(const SpriteInfo< RGB_T, SurfaceT > &spriteInfo, IFont< RGB_T > &font)
Definition: SpriteInfo.h:337
Vector< std::unique_ptr< SpriteInfo< RGB_T, SurfaceT > > >::iterator findSprite(Vector< std::unique_ptr< SpriteInfo< RGB_T, SurfaceT > > > &sprites, SpriteInfo< RGB_T, SurfaceT > &spriteInfo)
Definition: SpriteInfo.h:215
Touch point.
Definition: TouchDriverCommon.h:32
Represents a rectangular area on the screen or surface.
Definition: SpriteInfo.h:19
size_t height
Definition: SpriteInfo.h:23
size_t width
Definition: SpriteInfo.h:22
size_t y
Definition: SpriteInfo.h:21
size_t x
Definition: SpriteInfo.h:20
static Rect intersect(const Rect &first, const Rect &second)
Returns the intersection rectangle of two rectangles.
Definition: SpriteInfo.h:26
Definition: SpriteInfo.h:200
SpriteInfoWithoutBackground(size_t startX, size_t startY, const ISurface< RGB_T > &sourceSprite, RGB_T transparentColor, IFont< RGB_T > &font)
Definition: SpriteInfo.h:201
void saveOriginalPixels(ISurface< RGB_T > &) override
Saves the background pixels currently covered by the sprite.
Definition: SpriteInfo.h:208
Definition: SpriteInfo.h:52
bool isSurfaceAutoDelete
Definition: SpriteInfo.h:59
size_t y
Definition: SpriteInfo.h:54
size_t maxWidth
Definition: SpriteInfo.h:55
std::unique_ptr< SurfaceT > transformedSprite
Definition: SpriteInfo.h:60
float currentAngleDegrees
Definition: SpriteInfo.h:75
void setMaxSize(size_t maxX, size_t maxY)
Set the maximum buffer size for transformedSprite and allocate buffer.
Definition: SpriteInfo.h:145
void onTouch(Point point)
Definition: SpriteInfo.h:138
virtual void saveOriginalPixels(ISurface< RGB_T > &framebuffer)
Saves the background pixels currently covered by the sprite.
Definition: SpriteInfo.h:133
Rect clampedSize(size_t rawWidth, size_t rawHeight) const
Definition: SpriteInfo.h:118
size_t x
Definition: SpriteInfo.h:53
virtual ~SpriteInfo()
Definition: SpriteInfo.h:89
void(* onTouchCallback)(SpriteInfo &, Point)
Definition: SpriteInfo.h:78
IFont< RGB_T > & fontRef
Definition: SpriteInfo.h:77
SpriteInfo(size_t startX, size_t startY, const ISurface< RGB_T > &sourceSprite, RGB_T transparentColor, IFont< RGB_T > &font)
Definition: SpriteInfo.h:80
Rect getRect() const
Definition: SpriteInfo.h:95
void setTransformedSprite(SurfaceT &&newSprite)
Definition: SpriteInfo.h:157
const ISurface< RGB_T > & currentSprite() const
Returns the sprite image currently used for drawing.
Definition: SpriteInfo.h:126
SurfaceT originalPixels
Definition: SpriteInfo.h:76
RGB_T invisibleColor
Definition: SpriteInfo.h:57
bool hasTransformedContent
Definition: SpriteInfo.h:66
const ISurface< RGB_T > * sprite
Definition: SpriteInfo.h:58
float currentScale
Definition: SpriteInfo.h:74
size_t maxHeight
Definition: SpriteInfo.h:56