29 de Abril, 2004

Está casi todo hecho

Ya lo decía Chavalina en un comentario. ¡Cómo han cambiado las cosas!

Recuerdo que ya entrando en programación de juegecillos y superado lo de poner bits en pantalla se planteaba el problema de cargar los gráficos que con más o menos gracias íbamos a mover para entretener al jugador.

Deluxe Paint

En aquel entonces estaba DOS, y Deluxe Paint era el rey.

Así que si querías cargar un gráfico realizado con tan potente programa era necesario aprender a manejar uno de los formatos gráficos que éste soportaba. ¿Y si además elegías el PCX que soportaba compresión? Simplemente la leche.

Que quede claro que lo intenté con el formato GIF, aunque el DP no lo soportaba sí tenía un conversor (pcx2gif, creo que era), pero los códigos huffman resultaron demasiado para mi. Además la documentación que tenía era una porquería y por aquel entonces no había internet, claro :P.

Así que me lié a manejar la compresión RLE (Run-Length Encoding). Que maravilla de la técnica. Hasta llegué a mejorar la compresión del formato PCX :D.

Resulta que en las imágenes de aquel entonces (256 colores máximo, el modo 13h de las VGA es lo que tenía) se podían dar casos en los que un color se repitiera mucho. Teníamos una paleta de 256 colores y las imágenes se representaban con un índice por pixel en esa tabla. Por ejemplo:

00 00 00 00 01 01 01 00 02 03 06 01 01 01

El formato PCX decía que por linea de ancho de la imagen (estúpida limitación que eliminé de mi algoritmo) se podían introducir bytes de control que indicaban que el siguiente byte se repetía n veces. De esta forma teníamos:

[04] 00 [03] 01 00 02 03 06 [03] 01 

¡Que ahorro de espacio! De 14 a 10 bytes :o.

Además se empleaban los dos bits altos de cada byte para controlar si el byte era tal cual o si era un byte de control que indicaba las veces a repetir el siguiente byte (los 6 bits bajos para el número de repeticiones).

Esto iba bastante bien, salvo que era complicado de optimizar una imagen para ser grabada en este formato porque había que dejar los bytes más repetidos en los valores más altos de la tabla.

Si nos encontrábamos con un pixel cuyo índice en la paleta era mayor o igual a 192 (los dos bits altos), era obligatorio codificarlo como repetido aunque solo apareciera ese pixel una vez. Eso ya lo controlaba el Deluxe Paint, ¿qué más se puede pedir? :)

En mi formato eliminé esa limitación introduciendo otro sistema de control que indicaba que seguían n bytes diferentes. Así se ahorraba en bytes de control una barbaridad, mejorando en un 20% los peores casos del formato PCX original.

Ahora todo esto ya no tiene importancia, ya está hecho. Pues vaya :).

Anotación por Juan J. Martínez.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.