This crate is in maintenance mode. Bug fixes only — no new features.
Bug reports and fixes are welcome and will be reviewed promptly. Correctness, panics and security issues are in scope. New table support, new API surface and performance work are not, and feature requests will be closed.
For new projects, we recommend fontations (
read-fontsandskrifa), which is actively developed by Google Fonts, has broader table support, and is the direction the Rust font ecosystem is moving.
A high-level, safe, zero-allocation font parser for TrueType, OpenType, and AAT.
Can be used as a Rust or C library.
Requires Rust 1.88 and uses edition 2024.
- A high-level API for most common properties, hiding all parsing and data resolving logic.
- A low-level, but safe API to access TrueType tables data.
- Highly configurable. You can disable most of the features, reducing binary size. You can also parse TrueType tables separately, without loading the whole font/face.
- Zero heap allocations.
- Zero unsafe.
- Zero dependencies.
no_std/WASM compatible.- A basic C API.
- Fast.
- Stateless. All parsing methods are immutable.
- Simple and maintainable code (no magic numbers).
- The library must not panic. Any panic considered as a critical bug and should be reported.
- The library forbids unsafe code.
- No heap allocations, so crash due to OOM is not possible.
- All recursive methods have a depth limit, and the ones whose input forms a graph
(composite glyphs, the COLRv1 paint graph, CFF subroutines) additionally bound the
total work per call. A depth limit alone does not: with fan-out
band depthd, a small font can forceb^dvisits without ever exceeding the depth. - Stack usage is bounded, but not tightly: outlining a composite variable glyph nests up to 32 frames, each holding a variation-tuple buffer, for roughly 80KiB in the worst case.
- Most of arithmetic operations are checked.
- Most of numeric casts are checked.
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
See CONTRIBUTING.md for how to build and test the library, the C API and the benchmarks, the lint and formatting workflow, and what is expected of a change to a parser of untrusted input.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.