## Introduction

BLP files are used as texture storage. The textures can be stored with a 256 color palette or full 24bit RGB colors. The format supports 1, 4 and 8-bit alpha transparency and DXT compression. The file format is NOT chunked. Wikipedia has a nice overview over the format: http://en.wikipedia.org/wiki/.BLP

## Header

From http://www.pxr.dk/wowdev/wiki/index.php?title=BLP

```
Offset Type Description
------------------------------------------------------------------------------------------
0x00 char[4] always 'BLP2'
0x04 uint32 Type, always 1
0x08 uint8 Compression: 1 for uncompressed, 2 for DXTC
0x09 uint8 Alpha channel bit depth: 0, 1 or 8
0x0A uint8 Alpha encoding 0x0B uint8 Has MipMaps?
0x0C uint32 X resolution (power of 2)
0x10 uint32 Y resolution (power of 2)
0x14 uint32[16] offsets for every mipmap level (or 0 when there is no more mipmap level)
0x54 uint32[16] sizes for every mipmap level (or 0 when there is no more mipmap level)
0x94 uint32[256] palette of 256 BGRA Values
```

If HasMipMaps is 0, there is only 1 mipmap level. The palette is always present, even if it is not used. In that case all values are 0.

## Encoding Schemes

**Type 1 Compression 1 AlphaDepth 0 (uncompressed paletted image with no alpha)**

Each byte of the image data is an index into Palette which contains the actual RGB value for the pixel. Although the palette entries are 32-bits, the alpha value of each Palette entry may contain garbage and should be discarded.

**Type 1 Compression 1 AlphaDepth 1 (uncompressed paletted image with 1-bit alpha)**

This is the same as Type 1 Encoding 1 AlphaDepth 0 except that immediately following the index array is a second image array containing 1-bit alpha values for each pixel. The first byte of the array is for pixels 0 through 7, the second byte for pixels 8 through 15 and so on. Bit 0 of each byte corresponds to the first pixel (leftmost) in the group, bit 7 to the rightmost. A set bit indicates the pixel is opaque while a zero bit indicates a transparent pixel.

**Type 1 Compression 1 AlphaDepth 8 (uncompressed paletted image with 8-bit alpha)**

This is the same as Type 1 Encoding 1 AlphaDepth 0 except that immediately following the index array is a second image array containing the actual 8-bit alpha values for each pixel. This second array starts at **BLP2Header.Offset[0] + BLP2Header.Width * BLP2Header.Height**.

**Type 1 Compression 2 AlphaDepth 0 (DXT1 no alpha)**

The image data are formatted using DXT1 compression with no alpha channel.

**Type 1 Compression 2 AlphaDepth 1 (DXT1 one bit alpha)**

The image data are formatted using DXT1 compression with a one-bit alpha channel.

**Type 1 Compression 2 AlphaDepth 4 AlphaEncoding 1 (DXT3 four bits alpha)**

The image data are formatted using DXT3 compression.

**Type 1 Compression 2 AlphaDepth 8 AlphaEncoding 1 (DXT3 eight bits alpha)**

The image data are formatted using DXT3 compression.

**Type 1 Compression 2 AlphaDepth 8 AlphaEncoding 7 (DXT5)**

The image data are formatted using DXT5 compression.

## DXT Compression

BLP only uses DXT 1,3 and 5. From: http://en.wikipedia.org/wiki/DXTn

### DXT1

DXT1 (also known as Block Compression 1 or BC1) is the smallest variation of S3TC, storing 16 input pixels in 64 bits of output, consisting of two 16-bit RGB 5:6:5 colour values and a 4x4 two bit lookup table.

If the first colour value (c_{0}) is numerically greater than the second colour value (c_{1}), then two other colours are calculated, such that

c_{2} = 2/3 c_{0} + 1/3 c_{1}

and

c_{3} = 1/3 c_{0} + 2/3 c_{1}

Otherwise, if c_{0} <= c_{1}, then

c_{2} = 1/2 c_{0} + 1/2 c_{1}

and c_{3} is transparent black corresponding to a pre-multiplied alpha format.

The lookup table is then consulted to determine the colour value for each pixel, with a value of 0 corresponding to c_{0} and a value of 3 corresponding to c_{3} . DXT1 does not store alpha data enabling higher compression ratios.

### DXT3

DXT3 (also known as Block Compression 2 or BC2) converts 16 input pixels (corresponding to a 4x4 pixel block) into 128 bits of output, consisting of 64 bits of alpha channel data (4 bits for each pixel) followed by 64 bits of colour data, encoded the same way as DXT1 (with the exception that the 4 colour version of the DXT1 algorithm is always used instead of deciding which version to use based on the relative values of c_{0} and c_{1} ).

In DXT3, the colour data is interpreted as not having been pre-multiplied by alpha. Typically DXT2/3 are well suited to images with sharp alpha transitions, between translucent and opaque areas.

### DXT5

DXT5 (also known as Block Compression 3 or BC3) converts 16 input pixels into 128 bits of output, consisting of 64 bits of alpha channel data (two 8 bit alpha values and a 4x4 3 bit lookup table) followed by 64 bits of colour data (encoded the same way as DXT2 and DXT3).

If α_{0} > α_{1}, then six other alpha values are calculated, such that

α_{2} = (6α_{0} + 1α_{1}) / 7,

α_{3} = (5α_{0} + 2α_{1}) / 7,

α_{4} = (4α_{0} + 3α_{1}) / 7,

α_{5} = (3α_{0} + 4α_{1}) / 7,

α_{6} = (2α_{0} + 5α_{1}) / 7,

α_{7} = (1α_{0} + 6α_{1}) / 7

Otherwise, if α_{0} <= α_{1}, four other alpha values are calculated such that

α_{2} = (4α_{0} + 1α_{1}) / 5,

α_{3} = (3α_{0} + 2α_{1}) / 5,

α_{4} = (2α_{0} + 3α_{1}) / 5,

α_{5} = (1α_{0} + 4α_{1}) / 5,

α_{6} = 0,

α_{7} = 255

The lookup table is then consulted to determine the alpha value for each pixel, with a value of 0 corresponding to α_{0} and a value of 7 corresponding to α_{7}. DXT5's colour data is not pre-multiplied by alpha. Because DXT4/5 use an interpolated alpha scheme, they generally produce superior results for alpha (transparency) gradients than DXT2/3.

## Recommended Comments

There are no comments to display.

## Create an account or sign in to comment

You need to be a member in order to leave a comment

## Create an account

Sign up for a new account in our community. It's easy!

Register a new account## Sign in

Already have an account? Sign in here.

Sign In Now