From f8f7c7a9b693142fba82f8e2047f3439a97cc0ff Mon Sep 17 00:00:00 2001 From: Nacho Date: Thu, 28 May 2026 19:32:04 +0200 Subject: [PATCH] Fix egg upscale issues --- src/vpet/lines/get_available_lines.cpp | 2 +- src/vpet/lines/get_single_line.cpp | 72 ++++++++++++++++++++------ 2 files changed, 57 insertions(+), 17 deletions(-) diff --git a/src/vpet/lines/get_available_lines.cpp b/src/vpet/lines/get_available_lines.cpp index 58884e8..6ade3ef 100644 --- a/src/vpet/lines/get_available_lines.cpp +++ b/src/vpet/lines/get_available_lines.cpp @@ -83,8 +83,8 @@ void lines_getAvailableLines() { uint8_t lowByte; for (int i = 0; i < originalWidth * originalHeight; i++) { - bytesRead += lineFile.read(&highByte, 1); bytesRead += lineFile.read(&lowByte, 1); + bytesRead += lineFile.read(&highByte, 1); spriteBuffer[i] = (highByte << 8) | lowByte; } diff --git a/src/vpet/lines/get_single_line.cpp b/src/vpet/lines/get_single_line.cpp index 5f02e01..dc5826e 100644 --- a/src/vpet/lines/get_single_line.cpp +++ b/src/vpet/lines/get_single_line.cpp @@ -1,6 +1,7 @@ #include "lines.h" #include "memory/memory.h" #include "defs/defs.h" +#include "utils/utils.h" #include #include @@ -40,37 +41,76 @@ void lines_getSingleLine(const char* fileName) { currentLine[currentCharacter] = selectedLine; currentEgg = selectedEgg; } - void lines_getSingleEggSprites(fs::File &lineFile, Egg_t* selectedEgg) { + // Importante tener el nombre de archivo del huevo en todo momento strcpy(selectedEgg->fileName, lineFile.name()); - // Ahora se lee los datos - lineFile.read(&(selectedEgg->eggSprite.spriteWidth), 1); - lineFile.read(&(selectedEgg->eggSprite.spriteHeight), 1); + // Leer dimensiones originales + uint8_t originalWidth; + uint8_t originalHeight; + + lineFile.read(&originalWidth, 1); + lineFile.read(&originalHeight, 1); lineFile.read(&(selectedEgg->eggSprite.spriteNumber), 1); - + + const uint8_t scaledWidth = originalWidth * SPRITE_SCALE; + const uint8_t scaledHeight = originalHeight * SPRITE_SCALE; + + // Guardar dimensiones escaladas + selectedEgg->eggSprite.spriteWidth = scaledWidth; + selectedEgg->eggSprite.spriteHeight = scaledHeight; + + // Reservar memoria para sprites escalados selectedEgg->eggSprite.spriteData = memory_allocate( - selectedEgg->eggSprite.spriteNumber, - selectedEgg->eggSprite.spriteWidth, - selectedEgg->eggSprite.spriteHeight + selectedEgg->eggSprite.spriteNumber, + scaledWidth, + scaledHeight ); - uint16_t size = selectedEgg->eggSprite.spriteWidth * selectedEgg->eggSprite.spriteHeight; + const uint16_t originalSize = + originalWidth * originalHeight; + + // Buffer temporal en SRAM + uint16_t* spriteBuffer = + (uint16_t*) malloc( + originalSize * sizeof(uint16_t) + ); + + if (!spriteBuffer) { + printf("[LINES] Failed to allocate sprite buffer\n"); + return; + } uint8_t highByte; uint8_t lowByte; - for (int spr = 0; spr < selectedEgg->eggSprite.spriteNumber; spr++) { - for (int i= 0; i < size; i++) { - lineFile.read(&highByte, 1); + for ( + int spr = 0; + spr < selectedEgg->eggSprite.spriteNumber; + spr++ + ) { + + // Leer sprite original + for (int i = 0; i < originalSize; i++) { + lineFile.read(&lowByte, 1); + lineFile.read(&highByte, 1); - uint16_t pixel = (highByte << 8) | lowByte; - - selectedEgg->eggSprite.spriteData[spr][i] = pixel; + spriteBuffer[i] = + (highByte << 8) | lowByte; } - } + + // Escalar sprite + utils_upscaleSprite( + spriteBuffer, + originalWidth, + originalHeight, + selectedEgg->eggSprite.spriteData[spr] + ); + } + + free(spriteBuffer); } // Son las 22:35, que estoy haciendo?