REXPaint es una herramienta de arte ASCII utilizada para diseñar interfaces de usuario y prefabs de niveles, almacenando sus datos en un formato de archivo .xp específico. Estos archivos son estructuras binarias comprimidas con gzip que requieren un proceso de decodificación de varios pasos —descomprimir la compresión y luego analizar una secuencia little-endian de enteros y bytes de color— para reconstruir el arte en capas.
La estructura del archivo .xp
Un archivo REXPaint .xp comienza con un encabezado gzip estándar, identificado por el número mágico 1f8b. Una vez descomprimido, el archivo sigue un diseño simple little-endian que comienza con un número de versión (típicamente -1) y un recuento de capas. Cada capa está definida por su propio ancho y alto, seguidos por una secuencia de celdas.

Esta tabla ilustra el diseño de bytes específico y los tipos de datos utilizados en el formato de archivo .xp.
Cada celda en el archivo ocupa exactamente 10 bytes, que consisten en un índice de carácter de 4 bytes y dos valores de color RGB de 3 bytes para el primer plano y el fondo. Estas celdas están organizadas en orden de columna, lo que significa que la primera columna se escribe de arriba hacia abajo antes de que comience la segunda columna.

Este fragmento de código demuestra el diseño estructural del formato de archivo REXPaint.
Gráfico elaborado por HN Digest a partir de las cifras reportadas por tylerelton.com; los valores se muestran como aparecen en la fuente.
“Cada valor es little-endian, y todo el archivo es un puñado de enteros seguidos de una larga serie de celdas.”
— Decoding REXPaint Files in Odin
Lógica de análisis en Odin
Para decodificar estos archivos en el lenguaje de programación Odin, el proceso primero utiliza el paquete `core:compress/gzip` para inflar el archivo en un búfer de bytes. Luego se emplea una estructura `Reader` personalizada para mantener el desplazamiento actual dentro de los bytes crudos, proporcionando procedimientos auxiliares para leer valores `i32` y `u8` mientras se comprueba la existencia de desbordamientos de búfer.

Este código muestra el paso inicial del proceso de decodificación utilizando la biblioteca de compresión de Odin.
El decodificador mapea los datos crudos en una jerarquía anidada de estructuras: una estructura `File` contiene una porción de estructuras `Layer`, que a su vez contienen porciones de estructuras `Cell`. Esto permite que el programa represente el arte en capas como un objeto estructurado y navegable en lugar de una secuencia plana de bytes.
Seguridad de memoria y validación
El proceso de decodificación incluye varias comprobaciones de seguridad para evitar el agotamiento de memoria por archivos corruptos o maliciosos. Antes de asignar memoria para una capa, el código calcula el tamaño esperado y lo compara con los bytes restantes en el búfer. También impone un límite de `MAX_CELLS_PER_LAYER` para asegurar que una sola capa no exceda un tamaño razonable.
Se utiliza el mecanismo `defer` de Odin para gestionar la memoria durante el análisis de múltiples capas. Si ocurre un fallo mientras se lee una capa específica, el bloque `defer if` asegura que cualquier memoria ya asignada para las celdas de esa capa específica se libere, evitando fugas de memoria mientras permite que el resto del archivo sea procesado o se informe como un error.
Transparencia y compensaciones de renderizado
El formato REXPaint maneja la transparencia a través de un valor de color específico: rosa fuerte (255, 0, 255). El formato especifica que cualquier celda con este color de fondo se trata como transparente. Se aplica una regla específica a la capa base: si una celda transparente en una capa superior revela una celda transparente en la capa más baja, el resultado final se renderiza como negro.
Si bien la lógica de decodificación extrae con éxito estos valores, la implementación específica del mezclado de transparencia del motor de renderizado no se detalla en el proceso de decodificación. El enfoque principal del decodificador es asegurar la integridad de la extracción de datos desde el formato binario hacia el entorno de Odin.