# FnixLib Biblioteca multimedia propia, escrita en C, para juegos y aplicaciones. Sin bibliotecas multimedia de terceros (nada de SDL, GLFW, raylib, GLAD ni GLEW): solo usa la biblioteca estándar de C y las interfaces nativas del sistema. **Versión 0.1.0 — primera versión funcional, solo Linux (X11), solo 2D por software.** ## Qué hay hoy | Módulo | Estado | |---|---| | Errores (`errors.h`) | Códigos y mensajes por hilo | | Ventana (`window.h`) | Linux/X11, tamaño fijo, límite de FPS, delta time | | Dibujo 2D por software (`draw2d.h`, `canvas.h`) | Píxel, línea, rectángulo, círculo (lleno y contorno), alfa | | Teclado y ratón (`input.h`, `events.h`) | Estado por fotograma y cola de eventos | | Tiempo (`time.h`) | Reloj monótono y espera | **No existe todavía:** imágenes/texturas, fuentes y texto, audio, matemáticas, colisiones, animaciones, 3D, mandos, Windows, instalación (`cmake --install`) ni `find_package`. Los encabezados correspondientes no se han creado a propósito. ## Requisitos - Compilador C con soporte de C17: GCC (verificado) o Clang (no verificado). - CMake 3.16 o superior y Make. - Xlib: paquete `libx11` en Arch/CachyOS, `libx11-dev` en Debian/Ubuntu. - Para ejecutar programas: un servidor X11 (o XWayland en una sesión Wayland, no verificado). En CachyOS / Arch: ```sh sudo pacman -S --needed gcc cmake make libx11 ``` ## Compilar y probar ```sh cmake -S . -B build -DCMAKE_BUILD_TYPE=Release cmake --build build ctest --test-dir build --output-on-failure ./build/basic ``` `ctest` ejecuta cuatro pruebas. La de `window_x11` necesita un servidor X11; sin `DISPLAY` se omite. Para ejecutarla sin pantalla: instalar `xorg-server-xvfb` y usar `xvfb-run -a ctest --test-dir build --output-on-failure`. Opciones de CMake: `-DFNIX_BUILD_EXAMPLES=OFF`, `-DFNIX_BUILD_TESTS=OFF`, `-DFNIX_WARNINGS_AS_ERRORS=ON`, `-DFNIX_SANITIZE=ON` (AddressSanitizer + UBSan). ## Ejemplo mínimo ```c #include #include int main(void) { FnixWindow *window = fnix_window_create("Mi juego", 800, 600); if (window == NULL) { fprintf(stderr, "Error: %s\n", fnix_last_error()); return 1; } while (!fnix_window_should_close(window)) { fnix_begin_frame(window); /* eventos + destino de dibujo */ if (fnix_key_pressed(window, FNIX_KEY_ESCAPE)) { fnix_window_request_close(window); } fnix_clear(FNIX_BLACK); fnix_draw_circle(400, 300, 50, FNIX_RED); fnix_end_frame(window); /* muestra y limita a 60 FPS */ } fnix_window_destroy(window); return 0; } ``` Un programa más completo (movimiento con teclado, ratón, alfa) está en `examples/basic/main.c`. Para usar la biblioteca desde otro proyecto CMake mientras no exista la instalación, añade este repositorio con `add_subdirectory(FnixLib)` y enlaza `FnixLib::fnix`. ## Estructura ``` include/fnix/ API pública (fnix.h incluye todo) src/core/ errores y ventana (lógica independiente del sistema) src/graphics/ lienzo y renderizador 2D por software src/input/ estado de teclado/ratón y cola de eventos src/time/ reloj y espera (POSIX) src/platform/ interfaz con el sistema; linux/ contiene la parte de X11 tests/ pruebas (cuatro ejecutables) examples/basic/ ejemplo interactivo docs/ DECISIONS.md: decisiones de diseño y límites conocidos ``` ## Estado de verificación (13/10/2026) Verificado en: Ubuntu 24.04 (x86_64), GCC 13.3, Xlib, servidor Xvfb de 24 bits. - Compilación con `-std=c17 -Wall -Wextra -Wpedantic -Wshadow -Werror`: sin avisos. - Las cuatro pruebas pasan, también compiladas con AddressSanitizer + UBSan (sin errores ni fugas). - La prueba de integración comprueba que lo dibujado llega a la ventana (leyendo píxeles del servidor), el teclado, el ratón, la rueda, el cierre de ventana, la destrucción y el límite de FPS. - El ejemplo `basic` se ejecutó bajo Xvfb a ~60 FPS y se inspeccionó una captura. **No verificado:** la configuración con CMake (el entorno de pruebas no tenía `cmake`; se compiló con `gcc` directamente usando las mismas opciones, así que el `CMakeLists.txt` debe probarse), Clang, una pantalla real o Wayland/XWayland, bibliotecas compartidas (`BUILD_SHARED_LIBS=ON`) y Windows. ## Limitaciones conocidas - Solo Linux/X11. La ventana tiene tamaño fijo y no se puede redimensionar. - Exige una pantalla TrueColor de 24/32 bits con orden de bytes igual al de la CPU; en otro caso la creación de la ventana falla con un mensaje claro. - Los errores de protocolo de X11 los gestiona el manejador por defecto de Xlib, que termina el proceso; FnixLib no lo sustituye para no interferir con el programa. - Las teclas dependen de la distribución de teclado activa (ver `docs/DECISIONS.md`). - Sin sincronización vertical ni aceleración por GPU. - Coordenadas, tamaños y radios de dibujo limitados a ±2^28. - Un `FnixCanvas` de destino es un valor por hilo; el dibujo no es seguro desde varios hilos sobre el mismo lienzo. Las decisiones de diseño y el motivo de cada una están en `docs/DECISIONS.md`. El repositorio no incluye licencia: debe elegirla el autor.