An open API service indexing awesome lists of open source software.

https://github.com/bearcove/woofwoof

WOFF2 compression for Rust (some C++ inside)
https://github.com/bearcove/woofwoof

compression fonts rust ttf woff2

Last synced: 5 months ago
JSON representation

WOFF2 compression for Rust (some C++ inside)

Awesome Lists containing this project

README

          

# woofwoof

[![crates.io](https://img.shields.io/crates/v/woofwoof.svg)](https://crates.io/crates/woofwoof)
[![documentation](https://docs.rs/woofwoof/badge.svg)](https://docs.rs/woofwoof)
[![MIT/Apache-2.0 licensed](https://img.shields.io/crates/l/woofwoof.svg)](./LICENSE-MIT)
![woof woof](https://img.shields.io/badge/woof-woof-blue)

WOFF2 font compression and decompression for Rust.

Inspired by the [woff](https://github.com/bodoni/woff) crate, but with key differences:

- **Pure Rust brotli**: Uses the [brotli](https://crates.io/crates/brotli) crate instead of linking to C brotli
- **Windows support**: Compiles on Windows, Linux, and macOS
- **WOFF2 only**: No WOFF1 support — [WOFF2 adoption](https://caniuse.com/?search=woff2) is now widespread enough that serving WOFF1 is unnecessary

This crate wraps Google's [woff2](https://github.com/google/woff2) C++ library for the font-specific table transformations that make WOFF2 compress so well, while using pure Rust for brotli compression.

## Usage

```rust
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");
```

## API

### `compress(data, metadata, quality, transform) -> Option>`

Compress a TTF/OTF font to WOFF2 format.

- `data`: The TTF or OTF font data
- `metadata`: 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>`

Decompress a WOFF2 font back to TTF/OTF format.

## Why "woofwoof"? 🐕

Because it does WOFF2. Get it? WOFF... woof... woofwoof?

## Architecture

```
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.

## Testing

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.

```bash
cargo test
```

For manual verification, the compressed and decompressed fonts can be inspected with tools like [FontGoggles](https://fontgoggles.org/).

## Credits

This crate was inspired by [bodoni/woff](https://github.com/bodoni/woff), which pioneered the approach of wrapping Google's woff2 C++ library for Rust.

## Sponsors

Thanks to all individual sponsors:

GitHub Sponsors




Patreon

...along with corporate sponsors:

Zed

Depot

...without whom this work could not exist.

## License

Licensed under either of:

- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or )
- MIT license ([LICENSE-MIT](LICENSE-MIT) or )

at your option.

The bundled [woff2](https://github.com/google/woff2) C++ library is licensed under the MIT license.