134 lines
5.1 KiB
Markdown
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.
|