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:

sudo pacman -S --needed gcc cmake make libx11

Compilar y probar

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

#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.

S
Description
FnixLib es una biblioteca multimedia en C para desarrollar juegos y aplicaciones gráficas 2D y 3D, con implementación propia y soporte previsto para Linux y Windows.
Readme
82 KiB
0 Stars 1 Watchers 0 Forks
Languages
C 97.1%
CMake 2.9%