mirror of
https://github.com/nacabaro/nacapet.git
synced 2026-06-05 22:12:53 +00:00
114 lines
3.2 KiB
C++
114 lines
3.2 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, uint8_t factor, bool flipHorizontal
|
|
) {
|
|
int scaledWidth = spriteData->spriteWidth * factor;
|
|
int scaledHeight = spriteData->spriteHeight * factor;
|
|
|
|
spr.createSprite(scaledWidth, scaledHeight);
|
|
|
|
for (int sy = 0; sy < scaledHeight; sy++) {
|
|
for (int sx = 0; sx < scaledWidth; sx++) {
|
|
int srcX = sx / factor;
|
|
if (flipHorizontal) {
|
|
srcX = (spriteData->spriteWidth - 1) - srcX;
|
|
}
|
|
|
|
int srcY = sy / factor;
|
|
|
|
uint16_t color = spriteData->spriteData
|
|
[spriteNumber]
|
|
[srcY * spriteData->spriteWidth + srcX];
|
|
|
|
spr.drawPixel(sx, sy, color);
|
|
}
|
|
}
|
|
|
|
spr.pushToSprite(&composite1, x, y, TFT_TRANSPARENT);
|
|
spr.pushToSprite(&composite2, x, y - 120, TFT_TRANSPARENT);
|
|
|
|
spriteData->lastX = x;
|
|
spriteData->lastY = y;
|
|
spriteData->lastW = scaledWidth;
|
|
spriteData->lastH = scaledWidth;
|
|
|
|
//printf("%s: Sprite %d drawn at (%d, %d) %s\n", TAG_D, spriteNumber, x, y, (flipHorizontal ? "flipped" : ""));
|
|
}*/
|
|
|
|
|
|
void draw_drawSprite(
|
|
TFT_eSprite &spr,
|
|
int x, int y,
|
|
struct SpriteData* spriteData,
|
|
uint8_t spriteNumber,
|
|
uint8_t factor,
|
|
bool flipHorizontal
|
|
) {
|
|
int srcW = spriteData->spriteWidth;
|
|
int srcH = spriteData->spriteHeight;
|
|
int scaledW = srcW * factor;
|
|
int scaledH = srcH * factor;
|
|
|
|
if (spr.width() != scaledW || spr.height() != scaledH) {
|
|
spr.deleteSprite();
|
|
spr.createSprite(scaledW, scaledH);
|
|
}
|
|
|
|
uint16_t *sprBuf = (uint16_t *)spr.getPointer();
|
|
uint16_t *srcBuf = spriteData->spriteData[spriteNumber];
|
|
|
|
for (int srcY = 0; srcY < srcH; srcY++) {
|
|
int destYBase = srcY * factor;
|
|
for (int srcX = 0; srcX < srcW; srcX++) {
|
|
int useX = flipHorizontal ? (srcW - 1 - srcX) : srcX;
|
|
uint16_t raw = srcBuf[srcY * srcW + useX];
|
|
uint16_t color = (raw << 8) | (raw >> 8);
|
|
|
|
int destXBase = srcX * factor;
|
|
for (int dy = 0; dy < factor; dy++) {
|
|
int rowStart = (destYBase + dy) * scaledW + destXBase;
|
|
for (int dx = 0; dx < factor; dx++) {
|
|
sprBuf[rowStart + dx] = color;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
spr.pushToSprite(&composite1, x, y, TFT_TRANSPARENT);
|
|
spr.pushToSprite(&composite2, x, y - 120, TFT_TRANSPARENT);
|
|
|
|
spriteData->lastX = x;
|
|
spriteData->lastY = y;
|
|
spriteData->lastW = scaledW;
|
|
spriteData->lastH = scaledH;
|
|
}
|
|
|
|
|
|
void draw_drawSpriteCentered(
|
|
TFT_eSprite &spr,
|
|
struct SpriteData* spriteData, uint8_t spriteNumber, uint8_t factor, bool flipped, int y
|
|
) {
|
|
int x = (BUFFER_X - (spriteData->spriteWidth * factor)) / 2;
|
|
int new_y;
|
|
if (y == -1) {
|
|
new_y = (BUFFER_Y - (spriteData->spriteHeight * factor)) / 2;
|
|
} else {
|
|
new_y = y;
|
|
}
|
|
|
|
draw_drawSprite(
|
|
spr, x, new_y,
|
|
spriteData, spriteNumber, factor, flipped
|
|
);
|
|
} |