Schwarz ist nicht gleich schwarz

Ich bin gerade dabei, ein verbessertes Run-Length Encoding (RLE) zu implementieren, dass auch aufeinanderfolgende Blöcke unterschiedlicher Farben kodiert. Bisher ist es so, dass zum Beispiel die folgenden Farben (bzw. Indizes in die Palette):


1F 10 08 1F

wie folgt kodiert werden:


00 1F 00 10 00 08 00 1F

Das funktioniert zwar, gibt aber eine relativ große .VGA-Datei, da aus den 4 Bytes so 8 Bytes werden.

Eine freundliche Seele aus dem Managerspiele-Forum hatte schon eine verbesserte RLE-Implementierung für den bmp_to_vga-Konverter gemacht (siehe auch diesen Thread im Managerspiele-Forum), ich hab allerdings ein bisschen gebraucht bis ich sie übernehmen konnte, außerdem musste ich den Code noch etwas adaptieren, da der letzten Pixel in einer Datei nicht korrekt behandelt wurde. Die Implementierung macht dann folgendes aus den obigen Bytes:


03 1F 10 08 1F

Die 03 zeigt an, dass 4 einzelne Bytes folgen, der Overhead ist also deutlich geringer, vor allem für längere Blöcke mit verschiedenen Farben.

Im Prinzip kommt da, zumindest beim BMP, bei vielen Daten nach einer Konvertierung VGA->BMP->VGA eine fast identische Datei raus, also gäbe es eine gute Möglichkeit, die korrekte Funktionalität automatisch zu prüfen. Das hatte ich dann auch mal mittels einem Bash-Script für alle Dateien des BMP gemacht, das hat aber nicht funktionier und jetzt kommen wir wieder auf die Überschrift zurück.

In der Tat ist es nämlich so, dass es zum Beispiel bei der Palette für die 0.VGA in BMP (die 4 Managerköpfe) 32 Farben gibt. Schwarz, also RGB 0/0/0 kommt dabei an Index 0 und Index 31 vor. Und natürlich ist es so, dass in der .VGA-Datei schwarz mal als 1F vorkommmt (fast immer) aber auch mal als 00. Naja, das hat dann das Testen in der Form leider unmöglich gemacht, ich habe aber einen, glaube ich, ganz guten Weg gefunden, doch dazu später mehr, ebenso zur verbesserten Version des RLE-Algorithmus.

This entry was posted in BMH, BMP, EM, Graphics, Tools and tagged , , , , , . Bookmark the permalink.

Leave a Reply