zcatgui/CHANGELOG.md
R.Eugenio 0342d5c145 perf(render): Shadow Baking + Glyph Blitting optimizado (v0.27.0-v0.27.1)
Shadow Baking:
- ShadowCache prerenderiza sombras blur (key: w,h,blur,radius,spread)
- initWithCache() habilita cache, deinit() lo libera
- 4.2x más rápido en Debug, 2.5x en ReleaseSafe

Glyph Blitting:
- Early exit si glifo fuera de clip
- Pre-cálculo región visible
- Acceso directo fb.pixels[]
- Aritmética u32 (sin structs Color)
- Fast path alpha=255

Correcciones:
- Integer overflow: saturating arithmetic (+|, -|, *|)
- u16→u32 en blitShadowCache

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 01:49:54 +01:00

190 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# zcatgui - Historial de Versiones
> Extraído de CLAUDE.md para mantener archivo principal conciso.
> Ver CLAUDE.md para documentación del proyecto.
---
## Historial Completo
| Fecha | Versión | Cambios |
|-------|---------|---------|
| 2025-12-09 | v0.1.0 | Proyecto creado, estructura base, documentación |
| 2025-12-09 | v0.2.0 | Widgets Fase 2 completados (Label, Button, TextInput, Checkbox, Select, List, Focus) |
| 2025-12-09 | v0.3.0 | Widgets Fase 3 completados (Table editable, Split panels, Panel container) |
| 2025-12-09 | v0.3.5 | Keyboard integration: InputState ahora trackea teclas, Table responde a flechas/Enter/Escape/Tab/F2 |
| 2025-12-09 | v0.4.0 | Modal widget: diálogos modales (alert, confirm, input), plan extendido documentado |
| 2025-12-09 | v0.5.0 | AutoComplete widget, comparativa DVUI/Gio/zcatui en WIDGET_COMPARISON.md |
| 2025-12-09 | v0.6.0 | FASE 1 Optimización: FrameArena, ObjectPool, dirty rectangles, Benchmark suite |
| 2025-12-09 | v0.7.0 | FASE 2: Progress, Tooltip, Toast, Spinner |
| 2025-12-09 | v0.8.0 | FASE 2: TextArea, Tree, Badge/TagGroup |
| 2025-12-09 | v0.9.0 | FASE 3: Image, ReorderableList, ColorPicker, DatePicker |
| 2025-12-09 | v0.10.0 | FASE 4: NumberEntry, RichText, Breadcrumb |
| 2025-12-09 | v0.11.0 | FASE 5: Canvas, Charts (line/bar/pie), Icon system (60+ icons) |
| 2025-12-09 | v0.12.0 | FASE 6: Clipboard, DragDrop, Shortcuts, FocusGroups |
| 2025-12-09 | v0.13.0 | FASE 7: Animation/Easing, Effects (shadow/gradient/blur), VirtualScroll, AA rendering |
| 2025-12-09 | v0.14.0 | FASE 8: Accessibility system, Testing framework, 274 tests |
| 2025-12-09 | v0.14.1 | FASE 9: Gio parity - 12 widgets + gesture system |
| 2025-12-09 | v0.15.0 | FASE 10: Mobile/Web - WASM, Android, iOS backends |
| 2025-12-09 | v0.15.0 | Documentación: REFERENCE.md completo (1370 líneas) |
| 2025-12-11 | v0.15.1 | FocusSystem rediseñado: registration_group/active_group, focus implícito |
| 2025-12-11 | v0.15.2 | Widgets adaptados a FocusSystem: numberentry, textarea, select, radio, slider, tabs |
| 2025-12-16 | v0.16.0 | TTF rasterization con antialiasing (supersampling 2x) |
| 2025-12-16 | v0.16.1 | Fuente embebida: TtfFont.initEmbedded() |
| 2025-12-16 | v0.16.2 | Fix TTF: DroidSans (187KB) reemplaza AdwaitaSans (variable). Y-flip rasterización. |
| 2025-12-17 | v0.17.0 | ⭐ Integración zcatttf v1.0 - TTF FUNCIONA PERFECTAMENTE |
| 2025-12-17 | v0.18.0 | Paridad Visual DVUI Fase 1: RenderMode dual, esquinas redondeadas, sombras |
| 2025-12-17 | v0.19.0 | Paridad Visual DVUI Fase 2: HoverTransition, Focus Ring AA en 9 widgets |
| 2025-12-17 | v0.20.0 | AdvancedTable: 8 fases completas (~2,700 LOC) - Schema, CRUD, Sorting, Lookup |
| 2025-12-17 | v0.21.0 | AdvancedTable: +990 LOC (multi-select, search, validation) |
| 2025-12-17 | v0.21.1 | Fix: AdvancedTable teclado - result.selected_row/col en handleKeyboard |
| 2025-12-19 | v0.21.2 | AdvancedTable: selected_row_unfocus, color selección según focus |
| 2025-12-19 | v0.22.0 | ⭐ AutoComplete: focus system integration, getTextInput(), first_frame guard |
| 2025-12-19 | v0.22.1 | ⭐ Text Metrics: ctx.measureText/measureTextToCursor para fuentes TTF de ancho variable |
| 2025-12-19 | v0.22.2 | Cursor blink rate: 500ms→300ms (más responsive durante edición) |
| 2025-12-30 | v0.23.0 | ⭐ FilledTriangle primitive: scanline rasterizer for 3D graphics |
| 2025-12-30 | v0.24.0 | ⭐ FilledCircle primitive: Midpoint Circle Algorithm (Bresenham) |
| 2025-12-30 | v0.25.0 | ⭐ IdleCompanion widget: mascota animada que aparece tras inactividad |
| 2025-12-31 | v0.26.0 | ⭐ Z-Design V5 Pixel Perfect: títulos legibles (contrastTextColor), botones centrados (+2px TTF), semáforo reubicado (texto + cuadrado derecha) |
| 2025-12-31 | v0.26.1 | Fix: drawBeveledRect bisel ahora +1px inset (no solapa borde exterior) |
| 2026-01-02 | v0.27.0 | ⭐ **PERF: Shadow Baking** - Cache de sombras prerenderizadas en SoftwareRenderer |
| 2026-01-02 | v0.27.1 | ⭐ **PERF: Glyph Blitting Optimizado** - drawGlyphBitmap con acceso directo a píxeles |
---
## Hitos Importantes
### v0.17.0 - TTF Funcional (2025-12-17)
Integración de zcatttf v1.0. El texto TTF ahora se renderiza perfectamente.
→ Detalle: `docs/research/` y teamdocs hitos
### v0.18.0-v0.19.0 - Paridad Visual DVUI (2025-12-17)
Sistema de rendering dual (simple/fancy), esquinas redondeadas, sombras, transiciones hover, focus ring AA.
→ Detalle: `docs/research/DVUI_AUDIT_2025-12-17.md`
### v0.20.0-v0.21.1 - AdvancedTable (2025-12-17)
Widget de tabla avanzada con schema, CRUD, sorting, lookup, multi-select, search, validation.
→ Detalle: `docs/ADVANCED_TABLE_MERGE_PLAN.md`
### v0.22.0-v0.22.2 - AutoComplete + Text Metrics (2025-12-19)
- **AutoComplete**: Integración completa con sistema de focus (registerFocusable, requestFocus, hasFocus)
- **Text Metrics**: Nuevo sistema ctx.measureText() para posicionamiento correcto del cursor con fuentes TTF
- **Cursor**: Velocidad de parpadeo aumentada (500ms→300ms) para mejor feedback durante edición
→ Archivos: `context.zig`, `text_input.zig`, `autocomplete.zig`
### v0.23.0-v0.24.0 - Primitivas Gráficas 2D (2025-12-30)
Nuevas primitivas para gráficos 2D y mascotas animadas:
- **FilledTriangle** (v0.23.0):
- Rasterización por scanlines con interpolación de bordes
- Soporte para backface culling y Z-sorting (3D)
- Clipping integrado con sistema de clip rects
- Uso: logos 3D, iconos, formas geométricas
- **FilledCircle** (v0.24.0):
- Algoritmo Midpoint Circle (Bresenham)
- Solo aritmética entera (eficiente, sin sqrt/trig)
- Relleno por scanlines horizontales simétricos
- Uso: mascotas, avatares, UI orgánica, gráficos
**Aplicación:** Mascota "Zcat" en zsimifactu (aparece tras 15s de inactividad)
→ Archivos: `core/command.zig`, `render/software.zig`
→ Doc: `zsimifactu/docs/PLAN_CIRCULOS_Y_ZCAT_2025-12-30.md`
### v0.25.0 - IdleCompanion Widget (2025-12-30)
Sistema de mascota animada reutilizable para cualquier aplicación:
- **Características:**
- Aparece tras periodo configurable de inactividad (default: 15s)
- Se asoma por bordes de paneles/rectángulos aleatorios
- Animación suave con clipping correcto (respeta bordes)
- Ojos que miran a los lados (izq/centro/der)
- "Salto de pánico" al detectar actividad del usuario
- Diseño de gato con orejas puntiagudas, pupilas verticales, mejillas y bigotes
- **Estados de animación:**
- `hidden`: Esperando idle
- `peeking`: Asomándose lentamente (4s)
- `watching`: Completamente visible, mirando alrededor (3s)
- `hiding`: Bajando normal (1s) o salto de pánico (0.2s)
- **Uso:**
```zig
const IdleCompanion = zcatgui.widgets.idle_companion;
var state: IdleCompanion.State = .{};
const panels = [_]IdleCompanion.Rect{ ... };
IdleCompanion.draw(ctx, &panels, &state, last_activity, color);
```
→ Archivo: `widgets/idle_companion.zig`
### v0.27.0-v0.27.1 - Optimizaciones de Rendimiento (2026-01-02)
Optimizaciones profundas del motor de renderizado software para alcanzar 60fps.
#### Shadow Baking (v0.27.0)
Sistema de cache de sombras prerenderizadas que elimina el recálculo costoso de sombras blur cada frame.
**Problema original:**
- Las sombras con blur dibujaban N capas de rectángulos redondeados por frame
- Cada capa ejecutaba `fillRoundedRect` que hace `@sqrt()` por cada píxel
- Una sombra blur=8 sobre 200x100px = 8 × 20,000 × sqrt = 160,000 operaciones sqrt/frame
**Solución:**
- Nuevo `ShadowCache` struct con HashMap para sombras prerenderizadas
- Key: (w, h, blur, radius, spread) - forma de la sombra
- Value: Buffer de alpha (u8[]) con la sombra ya calculada
- Primer frame: renderiza sombra a buffer, cachea
- Frames siguientes: blit rápido del buffer con color aplicado
**Resultados medidos:**
| Modo | Sin Cache | Con Cache | Mejora |
|------|-----------|-----------|--------|
| Debug | ~180ms | ~43ms | **4.2x** |
| ReleaseSafe | ~11ms | ~4.4ms | **2.5x** |
**API:**
```zig
// Antes (sin cache)
var renderer = SoftwareRenderer.init(&fb);
// Ahora (con cache - recomendado)
var renderer = SoftwareRenderer.initWithCache(&fb, allocator);
defer renderer.deinit();
```
**Archivos modificados:**
- `src/render/software.zig`: +200 LOC (ShadowCache, ShadowCacheKey, ShadowCacheEntry, fillAlphaRect, fillAlphaRectAdditive, blitShadowCache)
#### Glyph Blitting Optimizado (v0.27.1)
Optimización de `drawGlyphBitmap` en TTF rendering.
**Problema original:**
- 6 checks de bounds por cada píxel del glifo
- Llamadas a `getPixel()`/`setPixel()` (con más bounds checks)
- Creación de struct `Color` por cada píxel semi-transparente
- Sin early exit para glifos fuera del clip
**Optimizaciones aplicadas:**
1. **Early exit**: Si glifo entero está fuera de clip/framebuffer, return inmediato
2. **Pre-cálculo de región visible**: Intersección glifo ∩ clip ∩ framebuffer calculada una vez
3. **Acceso directo a `fb.pixels[]`**: Sin getPixel/setPixel
4. **Aritmética u32**: Sin crear structs Color por cada píxel
5. **Fast path opaco**: Si alpha=255, escritura directa sin blending
**Archivos modificados:**
- `src/render/ttf.zig`: drawGlyphBitmap() reescrito (~80 LOC)
#### Correcciones de Estabilidad
Durante la implementación se detectaron y corrigieron varios integer overflows:
- **fillAlphaRect/fillAlphaRectAdditive**: Aritmética saturante (`+|`, `-|`, `*|`) y bounds checks
- **blitShadowCache**: Color math con u32 en lugar de u16 para evitar overflow en multiplicación
- **renderShadow**: Límite de tamaño máximo (2048x2048) para evitar allocaciones enormes
→ Archivos: `src/render/software.zig`, `src/render/ttf.zig`
→ Telemetría: Añadida en `zsimifactu/src/main.zig` para medir Exec time