#pragma once #include #include #include class TextRenderer { public: TextRenderer(); ~TextRenderer(); // Inicializa el renderizador de texto con una fuente bool init(SDL_Renderer* renderer, const char* font_path, int font_size, bool use_antialiasing = true); // Reinicializa el renderizador con un nuevo tamaño de fuente bool reinitialize(int new_font_size); // Libera recursos void cleanup(); // Renderiza texto en la posición especificada con color RGB void print(int x, int y, const char* text, uint8_t r, uint8_t g, uint8_t b); void print(int x, int y, const std::string& text, uint8_t r, uint8_t g, uint8_t b); // Renderiza texto en coordenadas lógicas, pero convierte a físicas para tamaño absoluto void printPhysical(int logical_x, int logical_y, const char* text, uint8_t r, uint8_t g, uint8_t b, float scale_x, float scale_y); void printPhysical(int logical_x, int logical_y, const std::string& text, uint8_t r, uint8_t g, uint8_t b, float scale_x, float scale_y); // Renderiza texto en coordenadas físicas absolutas (tamaño fijo independiente de resolución) // NOTA: Este método usa el tamaño de fuente tal cual fue cargado, sin escalado void printAbsolute(int physical_x, int physical_y, const char* text, SDL_Color color); void printAbsolute(int physical_x, int physical_y, const std::string& text, SDL_Color color); // Obtiene el ancho de un texto renderizado (en píxeles lógicos para compatibilidad) int getTextWidth(const char* text); // Obtiene el ancho de un texto en píxeles FÍSICOS reales (sin escalado) // Útil para notificaciones y elementos UI de tamaño fijo int getTextWidthPhysical(const char* text); // Obtiene la altura de la fuente int getTextHeight(); // Verifica si está inicializado correctamente bool isInitialized() const { return font_ != nullptr && renderer_ != nullptr; } private: SDL_Renderer* renderer_; TTF_Font* font_; int font_size_; bool use_antialiasing_; std::string font_path_; // Almacenar ruta para reinitialize() unsigned char* font_data_buffer_; // Buffer de datos de fuente (mantener en memoria mientras esté abierta) };