Ya tengo el sistema de compresión acabado
Es al final un RLE, pero en lugar de ser un RLE-8 (repeticiones de 8 bits seguidas), es un RLE-4, para ajustarse al tamaño de los píxeles en las imágenes de la MD (un pixel en la MD = 4 bits)
Una explicación con ejemplo de cómo funciona:
00 00 04 44 00 00 47 77 00 44 77 77 00 47 78 8704 77 87 77 47 78 77 77 47 77 77 77 47 77 77 77
47 77 77 77 47 77 77 77 47 77 77 77 04 77 77 77
00 47 77 77 00 44 77 77 00 00 47 77 00 00 04 44
44 40 00 00 77 74 00 00 77 77 44 00 77 77 74 00
77 77 77 40 77 77 77 74 77 77 77 74 77 77 77 74
77 77 77 74 77 77 77 74 77 77 76 74 77 77 67 40
77 76 74 00 76 67 44 00 77 74 00 00 44 40 00 00
Esa es la imagen de un Sprite real de la MD (en hexadecimal). Codificado sería:
00 00 00 80 50 34 40 14 37 20 24 47 20 14 27 2817 10 14 27 18 37 14 27 18 47 14 77 14 77 14 77
14 77 14 77 10 14 67 20 14 57 20 24 47 40 14 37
50 64 50 37 14 40 47 24 20 57 14 20 67 14 10 77
14 77 14 77 14 77 14 77 14 57 16 17 14 47 16 17
14 10 37 16 17 14 20 17 26 17 24 20 37 14 40 34
50
Es decir:
- Primero va un Long (32 bits) indicando el tamaño del fichero descomprimido (verde)
- A continuación los datos (azul y rojo), en formato de 4 bits de longitud + 4 bits del nibble
Viendo el RLE-4, se descodificaría así:
5 veces el 0
3 veces el 4
4 veces el 0
1 vez el 4
3 veces el 7
etc...
En esta imágen, se ha sacado un ratio de compresión del ~0,72 (el 72% de tamaño frente al archivo original), y para descodificarlo también se hace muy simple
El RLE-8 también lo haré, pero destinado a cosas como los mapas, donde por ejemplo, así podemos reemplazar los espacios vacíos del mapa (es decir, donde no hay decorado o imágenes) por conjuntos, y ahí es donde se obtiene especialmente una compresión mucho mayor