A complete harfbuzz's shaping algorithm port to Rust
This project is in a semi-abandoned state.
The port is complete. All tests are passing. But we're are a couple of years and thousands commits behind harfbuzz.
Backporting takes a lot of time and I have barely any. If you are interested in helping the project checkout docs/backporting.md.
rustybuzz
is a complete harfbuzz's
shaping algorithm port to Rust.
Matches harfbuzz
v4.1.0
Because you can add rustybuzz = "*"
to your project and it just works.
No need for a C++ compiler. No need to configure anything. No need to link to system libraries.
rustybuzz passes 98% of harfbuzz tests (1764 to be more precise). So it's mostly identical, but there are still some tiny edge-cases which are not implemented yet or cannot be implemented at all.
Also, Apple layout is largely untested, because we cannot include Apple fonts for legal reasons. harfbuzz uses macOS CI instances to test it, which is extremely painful and we do not do this for now.
mort
table is not supported, since it's deprecated by Apple.graphite
library support.At the moment, performance isn't that great. We're 1.5-2x slower than harfbuzz. Also, rustybuzz doesn't support shaping plan caching at the moment.
See benches/README.md for details.
rustybuzz is not a faithful port.
harfbuzz can roughly be split into 6 parts: shaping, subsetting, TrueType parsing, Unicode routines, custom containers and utilities (harfbuzz doesn't use C++ std) and glue for system/3rd party libraries. In the mean time, rustybuzz contains only shaping. All of the TrueType parsing was moved to the ttf-parser. Subsetting was removed. Unicode code was mostly moved to external crates. We don't need custom containers because Rust's std is good enough. And we do not use any non Rust libraries, so no glue code either.
In the end, we still have around 20 KLOC. While harfbuzz is around 80 KLOC.
As mentioned above, rustybuzz has around 20 KLOC. But this is not strictly true, because there are a lot of auto-generated data tables.
You can find the "real" code size using:
tokei --exclude unicode_norm.rs --exclude complex/vowel_constraints.rs \
--exclude '*_machine.rs' --exclude '*_table.rs' src
Which gives us around 13 KLOC, which is still a lot.
Since the port is finished, there is not much to do other than syncing it with a new harfbuzz releases. But there are still a lot of room for performance optimizations and refactoring.
Also, despite the fact that harfbuzz has a vast test suite, there are still a lot of things left to test.
The library is completely safe.
We do have one unsafe
to cast between two POD structures, which is perfectly safe.
But except that, there are no unsafe
in this library and in most of its dependencies
(excluding bytemuck
).
rustybuzz
is licensed under the MIT.
harfbuzz
is licensed under the Old MIT