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 <noreply@anthropic.com>
Sistema de texto:
- Reemplazado dbgtxt.cpp (bitmap 8x8) por TextRenderer (SDL_TTF)
- Creado source/text/ con TextRenderer class
- Añadidas fuentes TrueType en data/fonts/
- Implementados dos TextRenderer (display + debug) con escalado dinámico
- Constantes configurables: TEXT_FONT_PATH, TEXT_BASE_SIZE, TEXT_ANTIALIASING
Correcciones de centrado:
- Reemplazado text.length() * 8 por text_renderer_.getTextWidth() en ~25 lugares
- Texto de tecla F ahora se centra correctamente
- Texto de modo (Demo/Logo/Lite) fijo en tercera fila del HUD debug
- Implementado espaciado dinámico con getTextHeight()
Conversión a mixed case:
- ~26 textos de display cambiados de ALL CAPS a mixed case
- 15 nombres de temas en theme_manager.cpp convertidos a mixed case
- Ejemplos: "FPS" → "fps", "MODO FISICA" → "Modo Física", "DEMO MODE ON" → "Modo Demo: On"
- Temas: "SUNSET" → "Sunset", "OCEANO" → "Océano", etc.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>