16 Commits

Author SHA1 Message Date
Qwerasd
2d174f9bff font: allow non-boolean font feature settings
+ much more flexible syntax and lenient parser
+ allows comma-separated list as a single config value

This allows, e.g. `cv01 = 2` to select the second variant of `cv01`.
2024-12-30 21:15:25 -05:00
Qwerasd
7686cacde6 renderer, shaper: don't use null cells, handle bg and decorations separately
Significant rework that also removes a lot of unnecessarily duplicated
work while rebuilding cells in both renderers. Fixes multiple issues
with decorations and bg colors on wide chars and ligatures, while
reducing the amount of special case handling required.
2024-10-08 23:10:43 -04:00
Mitchell Hashimoto
14e3f43db2 font: yeet usingns 2024-08-16 10:47:15 -07:00
Mitchell Hashimoto
851b1fe2ac font: noop shaper 2024-05-01 20:31:50 -07:00
Mitchell Hashimoto
0a69615670 font/shaper: add Cache 2024-05-01 18:55:22 -07:00
Mitchell Hashimoto
1072354747 build: add -Dfont-backend=coretext_harfbuzz to force Harfbuzz w/ CT 2024-04-30 14:03:38 -07:00
Mitchell Hashimoto
1b8bae5f0a Update src/font/shape.zig
Co-authored-by: Jon Parise <jon@indelible.org>
2024-04-04 13:25:27 -07:00
Mitchell Hashimoto
e41e45e1ad font/coretext: face doesn't need harfbuzz font if we're not using it 2024-04-04 12:18:28 -07:00
Mitchell Hashimoto
f0b2e21548 font: enable the coretext shaper by default for CoreText faces 2024-04-04 11:33:55 -07:00
Mitchell Hashimoto
f447e6f9df font: insert blank cells for multi-cell ligatures for styling
Up to this point, every font I've experienced with ligatures has
replaced the codepoints that were replaced for combining with a space.
For example, if a font has a ligature for "!=" to turn it into a glyph,
it'd shape to `[not equal glyph, space]`, so it'd still take up two
cells, allowing us to style both.

Monaspace, however, does not do this. It turns "!=" into `[not equal
glyph]` so styles like backgrounds, underlines, etc. were not extending.

This commit detects multi-cell glyphs and inserts synthetic blank cells
so that styling returns. I decided to do this via synthetic blank cells
instead of introducing a `cell_width` to the shaper result because this
simplifies the renderers to assume each shaper cell is one cell. We can
change this later if we need to.

Annoyingly, this does make the shaper slightly slower for EVERYONE to
accomodate one known font that behaves this way. I haven't benchmarked
it but my belief is that the performance impact will be negligible
because to figure out cell width we're only accessing subsequent cells
so they're likely to be in the CPU cache and also 99% of cells are going
to be width 1.
2024-01-06 19:22:25 -08:00
Mitchell Hashimoto
24d4981996 font: note why shaper is not enabled 2023-12-11 21:58:49 -08:00
Mitchell Hashimoto
114723af9e font/coretext: shaper applies x/y offsets 2023-12-11 21:22:30 -08:00
Mitchell Hashimoto
5c1fbd09cd font: shaper dynamically allocates cell buffer
Pathlogical grapheme clusters can use a LOT of memory, so we need to be
able to grow.
2023-09-26 17:59:16 -07:00
Mitchell Hashimoto
45ac9b5d4c font-feature config to enable/disable OpenType Font Features 2023-07-05 13:12:30 -07:00
Mitchell Hashimoto
f0b7fbecee font: extract common shaper elements out 2022-12-06 13:23:53 -08:00
Mitchell Hashimoto
e3c18f3f51 font: move shaper into comptime interface 2022-12-06 11:20:37 -08:00