v1.1.7

Changelog

1.1.7

Two spec-conformance fixes in the subsetter, both found while extracting it into a separate project and validating the output against the OpenType spec and fontTools rather than against daegun itself. Output bytes move for anything that rebuilds a font, so pinned subset fingerprints need re-recording. Nothing in the public API changed.

Fixed

Changed

Both fixes carry a test that was confirmed to fail without it, which the head bug in particular earned: it had already survived one checksum rule that passed the whole time.

1.1.6

A fix to the fuzz harness, which is a development tool rather than part of the published crate. The library is byte-identical to 1.1.5 and there is nothing here to upgrade for.

Fixed

1.1.5

The measurement release. Testing the engine against real fonts and a real frame budget turned up seven correctness defects and two paths doing far more work than they needed to.

Fixed

Performance

Two root causes account for most of it. Resolving an axis position built a BTreeMap and two intermediate vectors to hold what is almost always a single axis; and the rasterizer’s overlap resolution divided in its innermost loop.

before after
Font::shape, cache hit 285 ns, 13 allocations 88 ns, 3 −69%
rasterize_glyph, first time 25.7 µs, 31 allocations 20.8 µs, 16 −19%
rasterize_glyph, cached 73.4 ns 63.5 ns −13%
advance_widths ×1 26.0 ns 19.6 ns −25%
colr_v1_paint_graph_variable 621.7 µs 555.6 µs −11%
CPU raster pipeline, B at 16px 4.999 µs 4.543 µs −9%

Measured at the frame rather than the call, in a scrolling GPU app: re-laying-out a document of unchanged text fell from 0.0105 ms to 0.0048 ms a frame, and a page zoom from 12 to 96 pixels fell from 0.507 ms to 0.284 ms of rasterization a frame.

Bytes allocated per shape fell furthest of all, from 1,033 to 53.

Full figures in benchmark.md, which is re-measured for this release as the best of three runs.

Added

Changed

1.1.0

The refining release. Driving 1.0.0 from a real-time app turned up defects a static capture never would, and the capability that app needed most.

Fixed

Added

Changed

No documented signature changed and nothing was removed, so 1.0.0 code compiles against 1.1.0 untouched.

1.0.0

2026-08-20

First release. A text engine in one crate: parsing, shaping, layout, rasterizing, subsetting and a GPU path, with no dependencies and no std required.

Type to search.