nacapet/src/draw/draw_sprites.cpp

64 lines
1.6 KiB
C++

#include "draw.h"
#include "defs/sprite_data.h"
#include "defs/screen_defs.h"
#define BUFFER_X 240
#define BUFFER_Y 240
const char* TAG_D = "[DRAW]";
void draw_drawSprite(
TFT_eSprite &spr,
int x, int y,
struct SpriteData* spriteData,
uint8_t spriteNumber,
bool flipHorizontal
) {
// Sprites are pre-scaled at load time; width/height are already final.
const int W = spriteData->spriteWidth;
const int H = spriteData->spriteHeight;
if (spr.width() != W || spr.height() != H) {
spr.deleteSprite();
spr.createSprite(W, H);
}
uint16_t* sprBuf = (uint16_t*) spr.getPointer();
uint16_t* srcBuf = spriteData->spriteData[spriteNumber];
if (!flipHorizontal) {
// Fast path: one memcpy of the whole frame
memcpy(sprBuf, srcBuf, W * H * sizeof(uint16_t));
} else {
// Mirror each row horizontally
for (int row = 0; row < H; row++) {
const uint16_t* src = srcBuf + row * W;
uint16_t* dst = sprBuf + row * W;
for (int col = 0; col < W; col++) {
dst[col] = src[W - 1 - col];
}
}
}
spr.pushToSprite(&composite, x, y, TFT_TRANSPARENT);
spriteData->lastX = x;
spriteData->lastY = y;
spriteData->lastW = W;
spriteData->lastH = H;
}
void draw_drawSpriteCentered(
TFT_eSprite &spr,
struct SpriteData* spriteData, uint8_t spriteNumber, bool flipped, int y
) {
int x = (BUFFER_X - spriteData->spriteWidth) / 2;
int new_y = (y == -1)
? (BUFFER_Y - spriteData->spriteHeight) / 2
: y;
draw_drawSprite(spr, x, new_y, spriteData, spriteNumber, flipped);
}