mirror of
https://github.com/nacabaro/nacapet.git
synced 2026-06-05 14:02:53 +00:00
64 lines
1.6 KiB
C++
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);
|
|
} |