Files

134 lines
5.1 KiB
Markdown

# 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 <fnix/fnix.h>
#include <stdio.h>
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.