| Crates.io | woofwoof |
| lib.rs | woofwoof |
| version | 1.0.2 |
| created_at | 2025-12-01 12:06:55.536875+00 |
| updated_at | 2026-01-02 16:27:31.076623+00 |
| description | WOFF2 font compression/decompression using Rust brotli |
| homepage | https://github.com/fasterthanlime/woofwoof |
| repository | https://github.com/fasterthanlime/woofwoof |
| max_upload_size | |
| id | 1959711 |
| size | 184,844 |
WOFF2 font compression and decompression for Rust.
Inspired by the woff crate, but with key differences:
This crate wraps Google's woff2 C++ library for the font-specific table transformations that make WOFF2 compress so well, while using pure Rust for brotli compression.
use woofwoof::{compress, decompress};
// Compress TTF/OTF to WOFF2
let ttf_data = std::fs::read("font.ttf")?;
let woff2_data = compress(&ttf_data, "", 8, true)
.expect("compression failed");
// Decompress WOFF2 back to TTF/OTF
let roundtripped = decompress(&woff2_data)
.expect("decompression failed");
compress(data, metadata, quality, transform) -> Option<Vec<u8>>Compress a TTF/OTF font to WOFF2 format.
data: The TTF or OTF font datametadata: Optional extended metadata (XML string, usually empty "")quality: Brotli compression quality (0-11, recommended: 8-11)transform: Whether to apply font-specific transforms (recommended: true)decompress(data) -> Option<Vec<u8>>Decompress a WOFF2 font back to TTF/OTF format.
Because it does WOFF2. Get it? WOFF... woof... woofwoof?
Rust API (compress/decompress)
│
▼
C wrapper (extern "C")
│
▼
Google woff2 C++ (font transforms)
│
▼
Rust brotli shim (#[no_mangle])
│
▼
brotli crate (pure Rust)
The C++ woff2 library handles the complex font table transformations that make WOFF2 compress so well. Instead of linking to C brotli, we provide stub headers and implement the brotli functions in Rust, forwarding to the pure Rust brotli crate.
The test suite compresses a real font (Roboto) to WOFF2, verifies the WOFF2 signature, then decompresses it back. Note that roundtripped fonts are not byte-identical to the original due to WOFF2's font table transformations, but they are semantically equivalent.
cargo test
For manual verification, the compressed and decompressed fonts can be inspected with tools like FontGoggles.
This crate was inspired by bodoni/woff, which pioneered the approach of wrapping Google's woff2 C++ library for Rust.
Thanks to all individual sponsors:
...along with corporate sponsors:
...without whom this work could not exist.
Licensed under either of:
at your option.
The bundled woff2 C++ library is licensed under the MIT license.