Afegides noves funciones a Surface
This commit is contained in:
@@ -155,21 +155,49 @@ void Surface::render(int dx, int dy, int sx, int sy, int w, int h)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Copia una región de la superficie de origen a la de destino
|
||||||
// Vuelca la superficie a una textura
|
void Surface::render(int x, int y, SDL_Rect *clip, SDL_RendererFlip flip)
|
||||||
void Surface::flip(SDL_Renderer *renderer, SDL_Texture *texture)
|
|
||||||
{
|
{
|
||||||
Uint32 *pixels;
|
if (!surface_ || !surface_dest_)
|
||||||
int pitch;
|
|
||||||
SDL_LockTexture(texture, nullptr, (void **)&pixels, &pitch);
|
|
||||||
for (int i = 0; i < surface_.width * surface_.height; ++i)
|
|
||||||
{
|
{
|
||||||
pixels[i] = palette_[surface_.data[i]];
|
throw std::runtime_error("Surface source or destination is null.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determina la región de origen (clip) a renderizar
|
||||||
|
int sx = (clip) ? clip->x : 0;
|
||||||
|
int sy = (clip) ? clip->y : 0;
|
||||||
|
int w = (clip) ? clip->w : surface_->width;
|
||||||
|
int h = (clip) ? clip->h : surface_->height;
|
||||||
|
|
||||||
|
// Limitar la región para evitar accesos fuera de rango
|
||||||
|
w = std::min(w, surface_->width - sx);
|
||||||
|
h = std::min(h, surface_->height - sy);
|
||||||
|
w = std::min(w, surface_dest_->width - x);
|
||||||
|
h = std::min(h, surface_dest_->height - y);
|
||||||
|
|
||||||
|
// Renderiza píxel por píxel aplicando el flip si es necesario
|
||||||
|
for (int iy = 0; iy < h; ++iy)
|
||||||
|
{
|
||||||
|
for (int ix = 0; ix < w; ++ix)
|
||||||
|
{
|
||||||
|
// Coordenadas de origen
|
||||||
|
int src_x = (flip == SDL_FLIP_HORIZONTAL) ? (sx + w - 1 - ix) : (sx + ix);
|
||||||
|
int src_y = (flip == SDL_FLIP_VERTICAL) ? (sy + h - 1 - iy) : (sy + iy);
|
||||||
|
|
||||||
|
// Coordenadas de destino
|
||||||
|
int dest_x = x + ix;
|
||||||
|
int dest_y = y + iy;
|
||||||
|
|
||||||
|
// Copia el píxel si no es transparente
|
||||||
|
Uint8 color = surface_->data[src_x + src_y * surface_->width];
|
||||||
|
if (color != transparent_color_) // Opcional: Ignorar píxeles transparentes
|
||||||
|
{
|
||||||
|
surface_dest_->data[dest_x + dest_y * surface_dest_->width] = color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
SDL_UnlockTexture(texture);
|
}
|
||||||
SDL_RenderCopy(renderer, texture, nullptr, nullptr);
|
}
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Vuelca la superficie a una textura
|
// Vuelca la superficie a una textura
|
||||||
void Surface::copyToTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
void Surface::copyToTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||||
|
|||||||
@@ -85,8 +85,9 @@ public:
|
|||||||
// Carga una paleta desde un archivo
|
// Carga una paleta desde un archivo
|
||||||
void loadPalette(const std::string &file_path);
|
void loadPalette(const std::string &file_path);
|
||||||
|
|
||||||
// Copia una región de la superficie de origen a la de destino
|
// Copia una región de la superficie de origen a la superficie de destino
|
||||||
void render(int dx, int dy, int sx, int sy, int w, int h);
|
void render(int dx, int dy, int sx, int sy, int w, int h);
|
||||||
|
void render(int x, int y, SDL_Rect *clip = nullptr, SDL_RendererFlip flip = SDL_FLIP_NONE);
|
||||||
|
|
||||||
// Establece un color en la paleta
|
// Establece un color en la paleta
|
||||||
void setColor(int index, Uint32 color);
|
void setColor(int index, Uint32 color);
|
||||||
@@ -102,7 +103,7 @@ public:
|
|||||||
|
|
||||||
// Getters
|
// Getters
|
||||||
std::shared_ptr<SurfaceData> getSurface() const { return surface_; }
|
std::shared_ptr<SurfaceData> getSurface() const { return surface_; }
|
||||||
// std::shared_ptr<SurfaceData> getSurfaceDest() const { return surface_dest_; }
|
|
||||||
// std::array<Uint32, 256> getPalette() const { return palette_; }
|
|
||||||
int getTransparentColor() const { return transparent_color_; }
|
int getTransparentColor() const { return transparent_color_; }
|
||||||
|
int getWidth() const { return surface_->width; }
|
||||||
|
int getHeight() const { return surface_->height; }
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user