28 releases

0.6.2 Jan 30, 2023
0.6.0 Nov 24, 2022
0.5.0 Nov 12, 2021
0.4.0 Mar 28, 2021
0.0.2 Feb 22, 2019

#760 in Graphics APIs

Download history 1249/week @ 2024-02-26 1204/week @ 2024-03-04 1292/week @ 2024-03-11 1421/week @ 2024-03-18 1441/week @ 2024-03-25 1814/week @ 2024-04-01 1086/week @ 2024-04-08 1644/week @ 2024-04-15 1393/week @ 2024-04-22 1222/week @ 2024-04-29 1172/week @ 2024-05-06 1420/week @ 2024-05-13 1479/week @ 2024-05-20 1399/week @ 2024-05-27 1186/week @ 2024-06-03 952/week @ 2024-06-10

5,145 downloads per month
Used in 60 crates (2 directly)

MIT/Apache

370KB
4K SLoC

piet-cairo: Cairo backend for piet

This is the Cairo back-end for the piet graphics API.

Toy text API

For simplicity, the back-end currently uses the toy text API in Cairo. Essentially, this means there is no shaping, so complex scripts won't render correctly at all, and Latin will be missing kerning, ligatures, and other refinements. According to the docs, "Any serious application should avoid them."

Fairly soon, I hope to have some type of higher-level text in place. One possibility is pango. From what I can tell, this should work well on Linux, but since it has a non-optional glib dependency, it might be non-trivial to get it building portably. It's also not clear to me how well this approach handles discovering system fonts.

Another possibility is to use HarfBuzz more directly, using the rust-harfbuzz bindings. This will require more work for font discovery and selection, but has the possibility to be considerably more native. A good Rust-native candidate for system font discovery is font-kit.

A third possibility is to adapt libTXT from Flutter. This is a state of the art text layout library, with considerable investment in making it work well on mobile. However, it is in C++ and thus at the very least will need nontrivial work to make good Rust bindings.

The need for text shaping will be common to many low-level renderers that are not supported by system text services, not just Cairo.

Building on non-Linux

Cairo is quite portable, and it is quite feasible to build on other systems. However, the cairo-rs crate seems to expect a library to be provided, rather than building it from sources.

On Windows, I've been using prebuilt binary releases from cairo-windows.

On macOS with Homebrew, the following should work:

brew install cairo

On OpenBSD, the library can be installed from official packages:

pkg_add cairo

On FreeBSD, the library can be installed with pkg:

pkg install cairo

On NetBSD, the library can be installed with:

pkgin install cairo

A pkg-config file is provided as usual and cairo-rs will build as expected.

TODO: nicer installation instructions (contributions welcome)

Dependencies

~11MB
~241K SLoC