#define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #include #include #include "texture.h" Texture::Texture(SDL_Renderer *renderer) : renderer_(renderer), texture_(nullptr), width_(0), height_(0) {} Texture::Texture(SDL_Renderer *renderer, std::string file_path) : renderer_(renderer), texture_(nullptr), width_(0), height_(0) { loadFromFile(file_path); } Texture::~Texture() { free(); } bool Texture::loadFromFile(std::string file_path) { const std::string filename = file_path.substr(file_path.find_last_of("\\/") + 1); int req_format = STBI_rgb_alpha; int width, height, orig_format; unsigned char *data = stbi_load(file_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 pitch; SDL_PixelFormat pixel_format; if (req_format == STBI_rgb) { pitch = 3 * width; // 3 bytes por pixel * pixels por linea pixel_format = SDL_PIXELFORMAT_RGB24; } else { // STBI_rgb_alpha (RGBA) pitch = 4 * width; pixel_format = SDL_PIXELFORMAT_RGBA32; } // Limpia free(); // La textura final SDL_Texture *new_texture = nullptr; // Carga la imagen desde una ruta específica SDL_Surface *loaded_surface = SDL_CreateSurfaceFrom(width, height, pixel_format, (void *)data, pitch); if (loaded_surface == nullptr) { std::cout << "Unable to load image " << file_path << std::endl; } else { // Crea la textura desde los pixels de la surface new_texture = SDL_CreateTextureFromSurface(renderer_, loaded_surface); if (new_texture == nullptr) { std::cout << "Unable to create texture from " << file_path << "! SDL Error: " << SDL_GetError() << std::endl; } else { // Obtiene las dimensiones de la imagen width_ = loaded_surface->w; height_ = loaded_surface->h; } // Elimina la textura cargada SDL_DestroySurface(loaded_surface); } // Return success stbi_image_free(data); texture_ = new_texture; return texture_ != nullptr; } void Texture::free() { // Free texture if it exists if (texture_ != NULL) { SDL_DestroyTexture(texture_); texture_ = NULL; width_ = 0; height_ = 0; } } void Texture::render(SDL_FRect *src, SDL_FRect *dst) { // Render to screen SDL_RenderTexture(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); }