#include #include #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #include "texture.h" Texture::Texture(SDL_Renderer *renderer) { this->renderer = renderer; texture = nullptr; width = 0; height = 0; } Texture::Texture(SDL_Renderer *renderer, std::string filepath) { this->renderer = renderer; texture = nullptr; width = 0; height = 0; loadFromFile(filepath); } Texture::~Texture() { free(); } bool Texture::loadFromFile(std::string path) { const std::string filename = path.substr(path.find_last_of("\\/") + 1); int req_format = STBI_rgb_alpha; int width, height, orig_format; unsigned char *data = stbi_load(path.c_str(), &width, &height, &orig_format, req_format); if (data == nullptr) { SDL_Log("Loading image failed: %s", stbi_failure_reason()); exit(1); } else { std::cout << "Image loaded: " << filename.c_str() << std::endl; } int depth, pitch; Uint32 pixel_format; if (req_format == STBI_rgb) { depth = 24; pitch = 3 * width; // 3 bytes por pixel * pixels por linea pixel_format = SDL_PIXELFORMAT_RGB24; } else { // STBI_rgb_alpha (RGBA) depth = 32; pitch = 4 * width; pixel_format = SDL_PIXELFORMAT_RGBA32; } // Limpia free(); // La textura final SDL_Texture *newTexture = nullptr; // Carga la imagen desde una ruta específica SDL_Surface *loadedSurface = SDL_CreateRGBSurfaceWithFormatFrom((void *)data, width, height, depth, pitch, pixel_format); if (loadedSurface == nullptr) { std::cout << "Unable to load image " << path.c_str() << std::endl; } else { // Crea la textura desde los pixels de la surface newTexture = SDL_CreateTextureFromSurface(renderer, loadedSurface); if (newTexture == nullptr) { std::cout << "Unable to create texture from " << path.c_str() << "! SDL Error: " << SDL_GetError() << std::endl; } else { // Obtiene las dimensiones de la imagen this->width = loadedSurface->w; this->height = loadedSurface->h; } // Elimina la textura cargada SDL_FreeSurface(loadedSurface); } // Return success stbi_image_free(data); texture = newTexture; return texture != nullptr; } void Texture::free() { // Free texture if it exists if (texture != nullptr) { SDL_DestroyTexture(texture); texture = nullptr; width = 0; height = 0; } } void Texture::render(SDL_Rect *src, SDL_Rect *dst) { // Render to screen SDL_RenderCopy(renderer, texture, src, dst); } int Texture::getWidth() { return width; } int Texture::getHeight() { return height; } // Modulación de color void Texture::setColor(int r, int g, int b) { SDL_SetTextureColorMod(texture, r, g, b); }