From 33728857ac1ae00007ee417e0348b8f3b4cd4830 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 10 Oct 2025 11:18:16 +0200 Subject: [PATCH] Fix: TextRenderer aplica offset de viewport para modo letterbox (F3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrige el posicionamiento del texto HUD en modo F3 (letterbox) cuando SDL3 crea barras negras y ajusta el viewport con offset para centrar. ## Problema En modo letterbox (F3), SDL_LOGICAL_PRESENTATION_LETTERBOX crea: - Barras negras para mantener aspect ratio - Viewport con offset (x, y) para centrar la imagen renderizada Cuando printAbsolute() deshabilitaba temporalmente la presentación lógica, perdía el offset del viewport y pintaba en (0,0) absoluto, cayendo en las barras negras. ## Solución **textrenderer.cpp - printAbsolute():** - Obtener viewport ANTES de deshabilitar presentación lógica - Aplicar offset del viewport a coordenadas físicas: - `dest_rect.x = physical_x + viewport.x` - `dest_rect.y = physical_y + viewport.y` ## Resultado ✅ HUD se pinta dentro del área visible con offset de letterbox ✅ Compatible con todos los modos: - Ventana normal - F3 letterbox (con barras negras) - F4 stretch fullscreen 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- source/text/textrenderer.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/source/text/textrenderer.cpp b/source/text/textrenderer.cpp index c17ddd5..24ec7f4 100644 --- a/source/text/textrenderer.cpp +++ b/source/text/textrenderer.cpp @@ -186,10 +186,16 @@ void TextRenderer::printAbsolute(int physical_x, int physical_y, const char* tex SDL_SetTextureAlphaModFloat(text_texture, color.a / 255.0f); } + // Obtener viewport ANTES de deshabilitar presentación lógica + // En modo letterbox (F3), SDL crea un viewport con offset para centrar la imagen + SDL_Rect viewport; + SDL_GetRenderViewport(renderer_, &viewport); + // Preparar rectángulo de destino en coordenadas físicas absolutas + // Aplicar offset del viewport para que el texto se pinte dentro del área visible SDL_FRect dest_rect; - dest_rect.x = static_cast(physical_x); - dest_rect.y = static_cast(physical_y); + dest_rect.x = static_cast(physical_x + viewport.x); + dest_rect.y = static_cast(physical_y + viewport.y); dest_rect.w = static_cast(text_surface->w); dest_rect.h = static_cast(text_surface->h); @@ -198,7 +204,7 @@ void TextRenderer::printAbsolute(int physical_x, int physical_y, const char* tex SDL_RendererLogicalPresentation presentation_mode; SDL_GetRenderLogicalPresentation(renderer_, &logical_w, &logical_h, &presentation_mode); - // Renderizar sin presentación lógica (coordenadas absolutas) + // Renderizar sin presentación lógica (coordenadas absolutas con offset de viewport) SDL_SetRenderLogicalPresentation(renderer_, 0, 0, SDL_LOGICAL_PRESENTATION_DISABLED); SDL_RenderTexture(renderer_, text_texture, nullptr, &dest_rect);