Changes since 1.18.0:
- Preserve stroke-simulated bold. #511
- Honor horizontal text scaling. #510
- Recover stale single-byte font mappings. #516
- Expose legacy symbol-rewrite metadata in Rust and Node. #519
- Keep separately clipped text runs apart. #518
Rust migration: TextItem literals need legacy_symbol_rewrite: false for items without symbol cleanup. The Node legacySymbolRewrite field is optional and emitted only when cleanup changed a character.