Commit graph

22 commits

Author SHA1 Message Date
25728c151c feat: Paridad Visual DVUI Fase 2 - transiciones hover/press
HoverTransition helper:
- animation.zig: HoverTransition struct para widgets
- Métodos update(), updateWithPress() para animar hacia target
- blend() y blendThree() para interpolar colores
- Speed configurable (default 0.008/ms = ~125ms transición)

Button con transiciones:
- ButtonState struct opcional para transiciones suaves
- buttonStateful(), buttonStatefulEx(), buttonStatefulRect()
- Mantiene retrocompatibilidad (button() sigue siendo instantáneo)
- Test buttonStateful transitions

Uso:
```zig
var btn_state = button.ButtonState{};
if (button.buttonStateful(&ctx, &btn_state, "Click me")) {
    // clicked
}
```

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 01:10:58 +01:00
364a7d963f feat: Paridad visual DVUI - RenderMode dual (simple/fancy)
Sistema de rendering dual para zcatgui:

Core:
- RenderMode enum (simple/fancy) en style.zig
- global_render_mode con helpers: isFancy(), setRenderMode()
- fillRoundedRect con edge-fade AA en framebuffer.zig (~350 LOC)
- Nuevos comandos: rounded_rect, rounded_rect_outline

Widgets actualizados:
- Button: corner_radius=4, usa roundedRect en fancy mode
- Panel: corner_radius=6, show_shadow=true, sombra offset 4px
- TextInput: corner_radius=3
- Select: corner_radius=3
- Modal: corner_radius=8, show_shadow=true, sombra offset 6px
  - Botones y input field del modal también redondeados

Técnica edge-fade (de DVUI):
- Anti-aliasing por gradiente alfa en bordes
- Sin supersampling, mínimo impacto en rendimiento
- Bordes suaves sin multisampling

+589 líneas, 9 archivos modificados

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 01:02:46 +01:00
8b90a1b285 feat: Integrar zcatttf para renderizado TTF
- build.zig.zon: Añadir zcatttf como dependencia local
- build.zig: Importar módulo zcatttf en todos los targets
- ttf.zig: Reescribir como wrapper de zcatttf (991→561 LOC)

Cambios en ttf.zig:
- Usa zcatttf.Font para parsing y rasterización
- Mantiene API pública compatible (TtfFont, drawText, etc.)
- Añade soporte UTF-8 completo en drawText
- Elimina código de rasterización propio (buggy)

Eliminado:
- cmap_debug.zig del build (herramienta de diagnóstico obsoleta)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 23:14:16 +01:00
0cdd44b8a0 fix: TTF ABGR format + herramienta diagnóstico cmap
Cambios:
- ttf.zig: Fix formato pixel ABGR (era RGBA invertido)
- cmap_debug.zig: Herramienta diagnóstico tabla cmap
- build.zig: Target cmap-debug para ejecutar diagnóstico
- docs/research/TTF_DEBUG_SESSION: Documentación sesión debug

Nota: El código base TTF funciona (cmap_debug lo confirma).
El bug de rendering sigue sin resolver en integración.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 22:00:54 +01:00
105e3c63d1 fix: UTF-8 support in TTF drawText
- drawText now decodes UTF-8 codepoints instead of iterating bytes
- Fixes rendering of accented characters (á, é, í, ó, ú, ñ, etc.)
- Uses std.unicode.utf8ByteSequenceLength + utf8Decode
- Invalid UTF-8 sequences are gracefully skipped

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:25:17 +01:00
222c4e1542 fix: DroidSans reemplaza AdwaitaSans (variable) + Y-flip TTF
- AdwaitaSans era fuente variable (fvar/gvar) incompatible con parser
- DroidSans.ttf: fuente estática 187KB (Apache 2.0)
- Y-flip en rasterización: TTF Y crece arriba, bitmap Y crece abajo
- Pendiente: UTF-8 multibyte en drawText

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 13:19:40 +01:00
22d5e51769 feat: Embeber fuente AdwaitaSans-Regular.ttf
- Añadir src/render/fonts/AdwaitaSans-Regular.ttf (860KB)
- Crear src/render/embedded_font.zig con @embedFile
- Añadir TtfFont.initEmbedded() para carga sin dependencias
- Exportar embedded_font en zcatgui.zig

Ahora cualquier programa que use zcatgui tiene TTF
disponible automáticamente sin archivos externos.

Licencia: SIL Open Font License (redistribución OK)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 01:21:28 +01:00
a11e1ea842 feat: zcatgui v0.16.0 - TTF rasterization con antialiasing
Cambios:
- TTF rasterization completo con bezier curves
- Antialiasing via supersampling 2x
- Integración TTF en SoftwareRenderer (setTtfFont)
- Fix ArrayListUnmanaged para Zig 0.15.2
- Documentación REFERENCE.md actualizada

CLAUDE.md actualizado con v0.16.0 y historial.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 01:05:48 +01:00
f2900d9dc2 test(ttf): Añadir tests con AdwaitaSans real
- Test carga fuente del sistema
- Verificar parsing de contornos para 'A'
- Verificar rasterización produce bitmap con datos
- Test múltiples caracteres (AaBb0123)
- Tests skip gracefully si fuente no disponible

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 00:42:51 +01:00
69745ba857 feat(ttf): Implementar rasterización TTF con antialiasing
- Añadir GlyphPoint, Contour, GlyphOutline para representar contornos
- Implementar getGlyphOutline() para parsear tabla glyf
- Implementar rasterizeGlyph() con supersampling 2x
- Scanline fill con non-zero winding rule
- Subdivisión de curvas Bezier cuadráticas
- Cache de glyphs por codepoint+size
- Alpha blending para antialiasing
- Reemplazar drawGlyphPlaceholder con renderizado real

El código parsea contornos TTF y los rasteriza con antialiasing.
Próximo paso: test visual con AdwaitaSans.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 00:42:02 +01:00
f7af2ba833 perf(framebuffer): Optimize fillRect with row-wise @memset
For solid colors (alpha=255), use @memset per row instead of
pixel-by-pixel loop. @memset is SIMD-optimized by the compiler
(uses SSE/AVX on x86-64).

Result: Render time 1.4ms → 1.0ms (28% faster in Release build)

Also cleaner code separation between solid color fast path
and alpha blending slow path.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 12:18:47 +01:00
e5ba9b178c feat(render): Add partial redraw support with dirty regions
Framebuffer:
- Add clearRect() for clearing specific rectangular regions

SoftwareRenderer:
- Add executeWithDirtyRegions() for optimized partial rendering
- Add clearRect() convenience method
- Add commandBounds() to extract bounding box from draw commands
- Add rectsIntersect() helper for intersection testing

This enables applications to:
1. Clear only dirty regions instead of full screen
2. Skip rendering commands outside dirty areas
3. Significantly reduce CPU when only small areas change

Usage: Pass dirty_regions from Context.getDirtyRects() to
executeWithDirtyRegions() instead of using clear()+executeAll().

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 12:12:21 +01:00
51d41bd01e perf(font): Optimizar drawChar con fast path para caracteres visibles
- Early out para caracteres completamente fuera del clip
- Fast path para caracteres 100% visibles (caso común)
- Escritura directa al buffer de píxeles sin setPixel
- Loop optimizado para fuentes de 8px de ancho
- Unroll de los 8 bits del glyph byte

Resultados:
- Debug: 40ms → 32ms por frame
- Release: 40ms → 1.5ms por frame (~26x más rápido)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 11:40:58 +01:00
f7a7b48c2c docs: Documentar soporte UTF-8 en renderizado de texto
- REFERENCE.md: Nueva sección "UTF-8 Text Rendering" explicando:
  - Cómo funciona la decodificación UTF-8 → Latin-1
  - Caracteres soportados (ASCII + Latin-1 Supplement)
  - Por qué UTF-8 es el estándar correcto para BD/archivos
  - Ejemplo de uso con texto español

- software.zig: Doc comments explicando el sistema UTF-8

El renderer ahora maneja texto UTF-8 automáticamente,
permitiendo mostrar correctamente: ñ, á, é, í, ó, ú, ¿, ¡, €, etc.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 01:37:00 +01:00
2e1b627f11 fix(render): Decodificar UTF-8 correctamente en drawText
El renderer iteraba byte por byte, causando que caracteres UTF-8
multi-byte (como ñ, á, é) se mostraran incorrectamente.

Cambios:
- Decodificación completa de UTF-8 (1-4 bytes)
- Mapeo de codepoints a Latin-1 para renderizado
- Caracteres fuera de Latin-1 se muestran como '?'

Esto permite mostrar correctamente texto en español y otros
idiomas europeos que usan caracteres Latin-1.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 01:30:21 +01:00
784fecac01 feat(fonts): Sistema de fuentes multi-tamaño con 8x16 Latin-1
Nuevas fuentes bitmap 8x16 (altura VGA estándar, mejor legibilidad):
- font_8x16: ASCII básico (95 caracteres)
- font_8x16_latin1: Latin-1 completo (224 caracteres)

Sistema FontSize para selección por categoría:
- getFontForSize(.small) → 8x8 Latin-1 (compacto)
- getFontForSize(.medium) → 8x16 Latin-1 (estándar UI)
- getFontForSizeAscii() variantes para menor memoria

Soporte completo español/europeo: ñ, Ñ, á, é, í, ó, ú, ü, ¿, ¡, ç, ß

Documentación actualizada en REFERENCE.md con tabla de fuentes
y ejemplos de uso.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 01:19:34 +01:00
520c5d7343 🌍 Font Latin-1 completo para soporte español/europeo
- Nuevo font_data.zig con datos de glifos separados
- font_8x8_ascii: ASCII básico (32-126)
- font_8x8_latin1: Latin-1 completo (32-255)
- Soporte español: ñ, Ñ, á, é, í, ó, ú, ü, ¿, ¡
- Soporte europeo: français, deutsch, português, italiano
- Exports: default_font_latin1, font_data

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 01:03:02 +01:00
14d717d7f4 🔧 Font completo + key repeat para navegación
- Font bitmap 8x8 completo (ASCII 32-126)
- navKeyPressed() ahora detecta key repeat de SDL2
- Exportar default_font desde render module

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-10 00:50:44 +01:00
91e13f6956 feat: zcatgui Gio parity - 12 new widgets + gesture system
New widgets (12):
- Switch: Toggle switch with animation
- IconButton: Circular icon button (filled/outlined/ghost/tonal)
- Divider: Horizontal/vertical separator with optional label
- Loader: 7 spinner styles (circular/dots/bars/pulse/bounce/ring/square)
- Surface: Elevated container with shadow layers
- Grid: Layout grid with scrolling and selection
- Resize: Draggable resize handle (horizontal/vertical/both)
- AppBar: Application bar (top/bottom) with actions
- NavDrawer: Navigation drawer with items, icons, badges
- Sheet: Side/bottom sliding panel with modal support
- Discloser: Expandable/collapsible container (3 icon styles)
- Selectable: Clickable region with selection modes

Core systems added:
- GestureRecognizer: Tap, double-tap, long-press, drag, swipe
- Velocity tracking and fling detection
- Spring physics for fluid animations

Integration:
- All widgets exported via widgets.zig
- GestureRecognizer exported via zcatgui.zig
- Spring/SpringConfig exported from animation.zig
- Color.withAlpha() method added to style.zig

Stats: 47 widget files, 338+ tests, +5,619 LOC
Full Gio UI parity achieved.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 17:21:15 +01:00
70fca5177b feat: zcatgui v0.13.0 - Phase 7 Visual Polish
Animation System:
- Easing functions: linear, quad, cubic, quartic, sine, expo,
  elastic, bounce, back (in/out/inout variants)
- Animation struct with start/stop/getValue/isComplete
- AnimationManager for concurrent animations
- lerp/lerpInt interpolation helpers

Visual Effects:
- Shadow: soft/hard presets, offset, blur, spread
- Gradient: horizontal, vertical, diagonal, radial
- Blur: box blur with configurable radius
- Color utilities: interpolateColor, applyOpacity,
  highlight, lowlight

Virtual Scrolling:
- VirtualScrollState for large list management
- Variable item height support
- Scrollbar with drag support
- Overscan for smooth scrolling
- ensureVisible/scrollToItem helpers

Anti-Aliased Rendering:
- drawLineAA: Xiaolin Wu's algorithm
- drawCircleAA: filled and stroke
- drawRoundedRectAA: rounded corners
- drawEllipseAA: arbitrary ellipses
- drawPolygonAA: polygon outlines
- Quality levels: none, low, medium, high, ultra

Widget count: 35 widgets
Test count: 256 tests passing

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 13:49:50 +01:00
8adc93a345 feat: zcatgui v0.6.0 - Phase 1 Optimization Complete
Performance Infrastructure:
- FrameArena: O(1) per-frame allocator with automatic reset
- ObjectPool: Generic object pool for frequently allocated types
- CommandPool: Specialized pool for draw commands
- RingBuffer: Circular buffer for streaming data
- ScopedArena: RAII pattern for temporary allocations

Dirty Rectangle System:
- Context now tracks dirty regions for partial redraws
- Automatic rect merging to reduce overdraw
- invalidateRect(), needsRedraw(), getDirtyRects() API
- Falls back to full redraw when > 32 dirty rects

Benchmark Suite:
- Timer: High-resolution timing
- Benchmark: Stats collection (avg, min, max, stddev, median)
- FrameTimer: FPS and frame time tracking
- AllocationTracker: Memory usage monitoring
- Pre-built benchmarks for arena, pool, and commands

Context Improvements:
- Integrated FrameArena for zero-allocation hot paths
- frameAllocator() for per-frame widget allocations
- FrameStats for performance monitoring
- Context.init() now returns error union (breaking change)

New Widgets (from previous session):
- Slider: Horizontal/vertical with customization
- ScrollArea: Scrollable content region
- Tabs: Tab container with keyboard navigation
- RadioButton: Radio button groups
- Menu: Dropdown menus (foundation)

Theme System Expansion:
- 5 built-in themes: dark, light, high_contrast, nord, dracula
- ThemeManager with runtime switching
- TTF font support via stb_truetype

Documentation:
- DEVELOPMENT_PLAN.md: 9-phase roadmap to DVUI/Gio parity
- Updated WIDGET_COMPARISON.md with detailed analysis
- Lego Panels architecture documented

Stats: 17 widgets, 123 tests, 5 themes

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 12:45:00 +01:00
59c597fc18 feat: zCatGui v0.1.0 - Initial project setup
Immediate Mode GUI library for Zig with software rendering.

Core features:
- SDL2 backend for cross-platform window/events
- Software rasterizer (works everywhere, including SSH)
- Macro recording system (cornerstone feature, like Vim)
- Command-list rendering (DrawRect, DrawText, etc.)
- Layout system with constraints
- Color/Style system with themes

Project structure:
- src/core/: context, command, input, layout, style
- src/macro/: MacroRecorder, MacroPlayer, MacroStorage
- src/render/: Framebuffer, SoftwareRenderer, Font
- src/backend/: Backend interface, SDL2 implementation
- examples/: hello.zig, macro_demo.zig
- docs/: Architecture, research (Gio, immediate-mode libs, Simifactu)

Build: zig build (requires SDL2-devel)
Tests: 16 tests passing

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 01:30:05 +01:00