afegida funció per a escalar surfaces

This commit is contained in:
2025-04-07 12:06:03 +02:00
parent a40c9a899b
commit 0e2dff6647
2 changed files with 49 additions and 7 deletions

View File

@@ -19,6 +19,7 @@ void Logo::init()
{
Screen::get()->init();
logo_surface = std::make_shared<Surface>("jailgames.gif");
logo_surface->scale(5);
logo_sprite = std::make_unique<SSprite>(logo_surface);
logo_sprite->setPosition(
(options.game.width - logo_sprite->getWidth()) / 2,

View File

@@ -44,6 +44,44 @@ struct SurfaceData
// Evita copias accidentales
SurfaceData(const SurfaceData &) = delete;
SurfaceData &operator=(const SurfaceData &) = delete;
// Escala la superficie por un factor entero
void scale(int factor)
{
if (factor <= 1)
{
throw std::invalid_argument("El factor debe ser mayor a 1.");
}
// Calcular nuevas dimensiones
Uint16 newWidth = width * factor;
Uint16 newHeight = height * factor;
// Crear un nuevo buffer para los datos redimensionados
auto newData = std::shared_ptr<Uint8[]>(new Uint8[newWidth * newHeight](), std::default_delete<Uint8[]>());
// Rellenar los datos del nuevo buffer replicando los píxeles
for (Uint16 y = 0; y < height; ++y)
{
for (Uint16 x = 0; x < width; ++x)
{
Uint8 value = data[y * width + x]; // Obtener el valor del píxel original
// Copiar el píxel a la región escalada
for (int dy = 0; dy < factor; ++dy)
{
for (int dx = 0; dx < factor; ++dx)
{
newData[(y * factor + dy) * newWidth + (x * factor + dx)] = value;
}
}
}
}
// Actualizar los datos de la superficie
data = std::move(newData);
width = newWidth;
height = newHeight;
}
};
class Surface
@@ -123,4 +161,7 @@ public:
// Inicializa la sub paleta
void initializeSubPalette(SubPalette &palette) { std::iota(palette.begin(), palette.end(), 0); }
// Escala el tamaño de la Surface
void scale(int factor) { surface_data_->scale(factor); }
};