wow-blp

Crates.iowow-blp
lib.rswow-blp
version0.3.2
created_at2025-06-14 01:36:43.261601+00
updated_at2025-08-29 03:59:30.358063+00
descriptionParser and encoder for World of Warcraft BLP texture files with DXT compression support
homepagehttps://github.com/wowemulation-dev/warcraft-rs
repositoryhttps://github.com/wowemulation-dev/warcraft-rs
max_upload_size
id1712022
size198,798
WoW Emulation Panda King (wowemulation-panda)

documentation

https://docs.rs/wow-blp

README

wow-blp

Parser and encoder for Blizzard BLP texture files used in Warcraft III and World of Warcraft.

Crates.io Version docs.rs License

Status

Implemented - Full BLP parsing and encoding functionality.

Features

  • Parse and encode all BLP versions (BLP0, BLP1, BLP2)
  • Support for all compression formats:
    • JPEG compression with alpha channel
    • RAW1 (256-color palettized) with 0/1/4/8-bit alpha
    • RAW3 (uncompressed BGRA)
    • DXT1/3/5 compression (S3TC)
  • Mipmap support (internal and external)
  • Convert between BLP and standard image formats
  • High-performance DXT compression using texpresso

Supported Versions

  • BLP0 - Warcraft III Beta (external mipmaps)
  • BLP1 - Warcraft III (1.x+)
  • BLP2 - World of Warcraft (all versions)
    • Classic (1.12.1)
    • The Burning Crusade (2.4.3)
    • Wrath of the Lich King (3.3.5a)
    • Cataclysm (4.3.4)
    • Mists of Pandaria (5.4.8)

Installation

Add to your Cargo.toml:

[dependencies]
wow-blp = "0.3.0"

Or use cargo add:

cargo add wow-blp

Usage

Loading BLP Files

use wow_blp::{parser::load_blp, convert::blp_to_image};

// Load BLP file
let blp_file = load_blp("texture.blp")?;

// Convert to standard image format
let image = blp_to_image(&blp_file, 0)?; // mipmap level 0

// Save as PNG
image.save("texture.png")?;
# Ok::<(), Box<dyn std::error::Error>>(())

Creating BLP Files

use wow_blp::{
    convert::{image_to_blp, BlpTarget, Blp2Format, DxtAlgorithm},
    encode::save_blp,
};
use image::imageops::FilterType;

// Load source image
let image = image::open("input.png")?;

// Convert to BLP2 with DXT5 compression
let blp = image_to_blp(
    image,
    true, // generate mipmaps
    BlpTarget::Blp2(Blp2Format::Dxt5 {
        has_alpha: true,
        compress_algorithm: DxtAlgorithm::ClusterFit,
    }),
    FilterType::Lanczos3
)?;

// Save BLP file
save_blp(&blp, "output.blp")?;
# Ok::<(), Box<dyn std::error::Error>>(())

Format Options

use wow_blp::convert::{BlpTarget, BlpOldFormat, Blp2Format, AlphaBits, DxtAlgorithm};

// BLP0 (Warcraft III Beta) - External mipmaps
let blp0 = BlpTarget::Blp0(BlpOldFormat::Jpeg { has_alpha: true });

// BLP1 (Warcraft III) - Palettized
let blp1 = BlpTarget::Blp1(BlpOldFormat::Raw1 {
    alpha_bits: AlphaBits::Bit8
});

// BLP2 (World of Warcraft) - DXT compression
let blp2_dxt = BlpTarget::Blp2(Blp2Format::Dxt5 {
    has_alpha: true,
    compress_algorithm: DxtAlgorithm::ClusterFit
});

// BLP2 - Uncompressed
let blp2_raw = BlpTarget::Blp2(Blp2Format::Raw3);

Working with Mipmaps

use wow_blp::{parser::load_blp, convert::blp_to_image};

// Load BLP file first
let blp_file = load_blp("texture.blp")?;

// Access specific mipmap level
let mipmap_2 = blp_to_image(&blp_file, 2)?;

// Get mipmap count
let count = blp_file.header.mipmaps_count();

// For BLP0, external mipmap files are handled automatically
// texture.blp → texture.b00, texture.b01, etc.
# Ok::<(), Box<dyn std::error::Error>>(())

Examples

See the examples directory for more usage examples:

  • load.rs - Load and convert BLP to PNG
  • save.rs - Convert PNG to BLP

Performance

  • DXT compression/decompression is parallelized using rayon
  • Direct GPU upload support for DXT formats
  • Efficient palette quantization for RAW1 format

License

Licensed under either of

at your option.

Credits

Based on the image-blp crate by zloy_tulen.

Commit count: 129

cargo fmt