Thanks to visit codestin.com
Credit goes to github.com

Skip to content

WOFF2 compression for Rust (some C++ inside)

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

bearcove/woofwoof

Repository files navigation

woofwoof

crates.io documentation MIT/Apache-2.0 licensed woof woof

WOFF2 font compression and decompression for Rust.

Inspired by the woff crate, but with key differences:

  • Pure Rust brotli: Uses the brotli crate instead of linking to C brotli
  • Windows support: Compiles on Windows, Linux, and macOS
  • WOFF2 only: No WOFF1 support — WOFF2 adoption is now widespread enough that serving WOFF1 is unnecessary

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.

Usage

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<Vec<u8>>

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<Vec<u8>>

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.

cargo test

For manual verification, the compressed and decompressed fonts can be inspected with tools like FontGoggles.

Credits

This crate was inspired by 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:

at your option.

The bundled woff2 C++ library is licensed under the MIT license.

About

WOFF2 compression for Rust (some C++ inside)

Topics

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Sponsor this project

  •