Support .otf fonts by switching to ttf-parser & ab_glyph_rasterizer
- Major rework to use crates ttf-parser & ab_glyph_rasterizer to respectively read and render OpenType .oft format fonts.
- Remove dependencies approx, stb_truetype & ordered-float along with in-crate rasterization code.
- Strip back some non-vital API functionality.
- Remove support for
.standalone()variants which are sparsely used.
- Remove some functions that didn't immediately translate to ttf-parser. Please raise issues to re-add any you relied on via the new stack.
- Remove support for
Supporting .otf fonts will be a major upgrade to rusttype, special thanks to @RazrFalcon for their work on ttf-parser!
Of course, changing the guts of rusttype affects performance. We have some losses and some big wins.
group 0.8.3 rework ----- ----- ------ draw_big_biohazard 1.89 668.9±3.14µs 1.00 354.5±1.23µs draw_iota 3.94 20.2±0.06µs 1.00 5.1±0.03µs draw_oft_tailed_e 1.00 92.4±0.47µs draw_w 5.06 4.9±0.02µs 1.00 965.4±8.08ns layout_a_sentence 1.00 20.3±0.16µs 1.36 27.6±0.32µs layout_a_sentence (vec) 1.00 27.5±0.13µs high_position_tolerance 1.00 832.8±5.54µs 1.19 987.7±16.62µs moving_text 1.00 970.5±4.60µs 1.15 1113.6±11.14µs moving_text_thrashing 1.08 5.0±0.08ms 1.00 4.6±0.05ms multi_font_population 1.88 1328.0±81.76µs 1.00 705.6±15.37µs mutli_font 1.00 952.1±20.63µs 1.14 1084.6±3.41µs resizing 1.06 3.1±0.04ms 1.00 2.9±0.02ms single_font 1.00 936.1±4.00µs 1.15 1078.0±7.36µs
Wins: Rasterization performance of ttf fonts is between 1.89 & 5.06 times faster using ab_glyph_rasterizer. Very nice, we can mostly thank Raph Levien's font-rs line+quad rasterization logic there which I adapted into ab_glyph_rasterizer.
Losses: Layout is down around 36% slower, also affecting general gpu-cache performance by ~15%. This may be down to differences in performance between stb_truetype-rs & ttf-parser. I also suspect this is, at least in part, due to how rusttype copies
Font references very eagerly with every
ttf_parser::Font is heavier that stb_truetype-rs's version. Currently Rusttype uses
Arc<ttf_parser::Font> to help with performance because of this.
I aim to investigate different APIs, maybe alternate crates, that avoid font reference copying all together. For now though the added ability to use .otf fonts + the greatly improved draw speed makes this a net positive for rusttype in my book.
ttf-parser does not support using owned font data. I consider this a critical ability of rusttype and so I introduced a self-borrowing wrapper for ttf-parser. This involves
unsafe code as self-referencing is not currently possible in safe rust. Improvements are welcome.
The shift around in dependencies means clean compile times are a tiny bit faster.
$ hyperfine --runs 3 'cargo clean; cargo build' Benchmark #1: cargo clean; cargo build Time (mean ± σ): 1.997 s ± 0.024 s [User: 3.638 s, System: 0.350 s] Range (min … max): 1.980 s … 2.025 s 3 runs
$ hyperfine --runs 3 'cargo clean; cargo build' Benchmark #1: cargo clean; cargo build Time (mean ± σ): 1.830 s ± 0.140 s [User: 3.157 s, System: 0.249 s] Range (min … max): 1.748 s … 1.993 s 3 runs
Resolves #137 (closed)