Blp
Blp ist das nicht offengelegte Bild- bzw. Texturformat von Blizzard Entertainment, welches für Warcraft 3 entwickelt wurde. In der Betaphase des Spiels existierte das Format "BLP0", welches aber in sämtlichen Belangen (bis auf den Bezeichner) dem späteren glich. Für das Spiel World of Warcraft wurde außerdem eine weitere Version des Formats entwickelt. Das Format wird zum Beispiel für Texturen von Modellen oder Ladebildschirmen benutzt. Es unterstützt drei unterschiedliche Kompressionstypen:
- Palettenkompression
- Palettenkompression mit zusätzlichem Alphakanal
- JFIF-Kompression
Inhaltsverzeichnis |
Aufbau
Jede BLP-Datei beginnt mit fest definierten Kopfdaten, die Informationen über die Textur enthalten. Zudem können die Texturdaten auf bis zu sechzehn sogenannte MIP-Maps ausgeweitet werden. Dabei existiert in der Regel eine MIP-Map, die die normalen Texturdaten enthält. Alle weiteren enthalten herunterskalierte Versionen der Textur, wobei bei jeder Skalierungsstufe die Höhe und die Breite der Textur durch zwei geteilt werden, bis die Höhe und Breite eins entsprechen. Entspricht einer der beiden Werte beim Herunterskalieren vor dem anderen eins, so wird er natürlich beibehalten. Die Größe des Bildes muss keine Potenz von zwei sein. Bei einer Teilung durch zwei wird bei einem Restwert abgerundet. Wo die Daten der einzelnen MIP-Map beginnen, ist in den Kopfdaten mittels Abstandswerten vorgegeben.
Kopfdaten
Die Kopfdaten sind unabhängig vom Kompressionstyp und der eigentlichen Anzahl der MIP-Maps immer gleich und werden hier als C-Struktur veranschaulicht:
struct Blp1Header
{
uint32_t identifier;
uint32_t compression;
uint32 width;
uint32 height;
uint32_t pictureType;
uint32_t mipMapOffset[16];
uint32_t mipMapSize[16];
};
Die Eigenschaft "identifier" sollte dabei den Wert "BLP1" bzw. "BLP0" enthalten.
Die sechzehn Offset-Werte geben die Startpositionen der MIP-Maps in der Datei relativ zur Startposition der Kopfdatenstruktur an.
Die Größenwerte geben die Größen der MIP-Maps relativ zu deren Startpositionen an.
Die möglichen Werte der Eigenschaft "compression" haben folgende Bedeutungen:
- 0 - Textur verwendet JFIF-Kompression
- 1 - Textur verwendet Palettenkompression
- 8 - Textur verwendet Alphakanal?
Die möglichen Werte der Eigenschaft "pictureType" haben folgende Bedeutungen:
- 3 - MIP-Maps enthalten Palettenindex- und Alphawertliste
- 4 - ebenso
- 5 - MIP-Maps enthalten nur Palettenindexliste
- 1 - unbekannt
Palettenkompression
Bei einer Palettenkompression wird eine Farbpalette mit exakt 256 RGBA-Farbwerten (in jedem Fall) am Anfang der Datei, unmittelbar nach den stets vorhandenen Kopfdaten gespeichert.
Es wird pro MIP-Map eine Liste von Pixelwerten gespeichert, die der Größe der MIP-Map (Höhe mal Breite) entspricht.
Jedes Pixel einer MIP-Map wird unkomprimiert gespeichert und enthält einen Index von der Größe eines Bytes (da es 256 verschiedene Farben sind), welcher auf eine der Farben in der Palette verweist.
Bei einer Palettenkompression mit zusätzlichem Alphakanal wird zudem noch eine Liste von Bytes gespeichert, die ebenfalls der Größe der MIP-Map entspricht. Dabei ist jeder Wert der Liste der zugehörige Alphawert des Pixels und der Alphawert der Palette wird ignoriert.
Die Palettenkompression wird vor allem bei einer geringen Anzahl von unterschiedlichen Farben im Bild verwendet bzw. wenn die Dateigröße recht klein gehalten werden soll.
Im Folgenden veranschaulicht erneut eine C-Struktur den Aufbau:
struct BlpPaletted
{
uint32_t palette[256];
struct {
uint8_t *indexList; uint8_t *alphaList;
} mipMaps[16]; }; Wie man sieht, enthält die Textur eine Liste von sechzehn MIP-Map, die jeweils für sich je nach Kompressionstyp ein oder zwei Arrays enthalten. Das zweite Array mit den Alphawerten entfällt beim entsprechenden Kompressionstyp. Die Arrays haben beide, insofern vorhanden die Größe, die in den Kopfdaten angegeben wird und normalerweise der Höhe mal der Breite der MIP-Map entspricht. Der Alphawert in der Farbpalette ist umgekehrt. Das bedeutet, dass ein Wert von 255 als Alphawert transparenz verursacht. Der Alphawert in der Liste enthält einen normalen Wert.
JFIF-Kompression
Bei dieser Art der Kompression wird ein JFIF-Bild pro MIP-Map gespeichert, wobei sich die JFIF-Kopfdaten geteilt werden.
Es wird bei der Vielzahl aller Texturen verwendet, da oftmals 256 verschiedene Farben nicht ausreichen.
Wieder wird der Aufbau als C-Struktur veranschaulicht:
struct BlpJfif
{
uint32_t headerSize;
uint8_t *header;
struct { uint8_t *data; } mipMaps[16]; }; Die Eigenschaft "headerSize" gibt die Größe des Arrays "header" vor, welches die Kopfdaten des JFIF-komprimierten Bildes darstellt. Danach werden wie gewohnt die sechzehn MIP-Maps gespeichert, die die entsprechenden Bilddaten enthalten. Die Größe dieser Bilddaten kann mittels einer entsprechenden Bibliothek, die die JFIF-Kompression unterstützt, ermittelt werden.
Werkzeuge
Es existiert eine Reihe von Werkzeugen, die das Format unterstützen:
