55 Commits

Author SHA1 Message Date
Qwerasd
c2484f48ef font: add jb mono and symbols-only nerd font as dependencies
Rather than using binaries statically in our source tree; this makes
them easier to update. This also makes it so that they are separated
from each other rather than using a patched JB mono as our fallback.
2025-07-03 15:59:04 -06:00
Qwerasd
2a836b0ab7 font/coretext: fix small memory leak 2025-07-02 11:02:33 -06:00
Mitchell Hashimoto
73ff4b8f74 move runIterator options to dedicated struct 2025-06-30 09:05:09 -07:00
Daniel Patterson
beb961fb80 Introduce font-shaping-break config option 2025-06-30 08:06:00 -07:00
Qwerasd
2384bd69cc style: use decl literals
This commit changes a LOT of areas of the code to use decl literals
instead of redundantly referring to the type.

These changes were mostly driven by some regex searches and then manual
adjustment on a case-by-case basis.

I almost certainly missed quite a few places where decl literals could
be used, but this is a good first step in converting things, and other
instances can be addressed when they're discovered.

I tested GLFW+Metal and building the framework on macOS and tested a GTK
build on Linux, so I'm 99% sure I didn't introduce any syntax errors or
other problems with this. (fingers crossed)
2025-05-26 21:50:14 -06:00
Qwerasd
cfedd477b2 font/freetype: introduce mutexes to ensure thread safety of Library and Face
For details see comments and FreeType docs @
https://freetype.org/freetype2/docs/reference/ft2-library_setup.html#ft_library
https://freetype.org/freetype2/docs/reference/ft2-face_creation.html#ft_face

tl;dr: FT_New_Face and FT_Done_Face require the Library to be locked for
thread safety, and FT_Load_Glyph and FT_Render_Glyph and friends need
the face to be locked for thread safety, since we're sharing faces
across threads.
2025-05-01 18:22:37 -06:00
Qwerasd
f0080529c4 fix(font/shape): don't require emoji presentation for grapheme parts
Also update shaper test that fails because the run iterator can't apply
that logic since `testWriteString` doesn't do proper grpaheme clustering
so the parts are actually split across multiple cells.

Several other tests are technically incorrect for the same reason but
still pass, so I've decided not to fix them here.
2025-03-19 15:09:53 -06:00
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
7de7bfa20e coretext: fix tests to account for removal of null cells 2024-10-09 16:00:57 -04:00
Qwerasd
b65ccd4598 test(coretext): add test for high plane padding sprite font behavior 2024-10-09 15:28:01 -04:00
Qwerasd
5730242596 coretext: don't emit 0 codepoints for special fonts 2024-10-08 23:47:35 -04: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
be3ae56bc8 font: add stylistic variants for built-in font, fix naming convention
Fixes #2364

This adds the bold, italic, and bold italic variants of JB Mono so it is
built-in. This also fixes up the naming convention for the embedded font
files across tests and removes redundant embedded font files.
2024-10-02 15:17:18 -07:00
Mitchell Hashimoto
1f3ccb2d66 font: Collection uses SegmentedList for styles for pointer stability 2024-08-23 14:50:04 -07:00
Mitchell Hashimoto
ed49670d2f font: remove broken test (on purpose) due to improvements in shaping 2024-08-11 15:46:08 -07:00
Mitchell Hashimoto
e385e0f9d0 font/shaper: split text runs on common bad ligature pairs
Fixes #2081

Many fonts have a bad ligature for "fl", "fi", or "st". We previously
maintained a list of such fonts in quirks.zig. However, these are so
common that it was suggested we do something more systematic and this
commit is that.

This commit changes our text run splitting algorithm to always split on
`fl`, `fi`, and `st`. This will cause some more runs for well behaved
fonts but the combination of those characters is rare enough and our
caching algorithm is good enough that it should be minimal overhead.

This commit renders our existing quirks fonts obsolete but I kept that
logic around so we can add to it if/when we find other quirky font
behaviors.
2024-08-11 15:26:36 -07:00
Mitchell Hashimoto
de9ea2d735 font: add test for fl lig 2024-08-11 15:04:56 -07:00
Łukasz Niemier
f9be02a20f chore: clean up typos 2024-08-05 13:56:57 +02:00
Mitchell Hashimoto
f4c26dfaf5 shaper/coretext: use pointer address for cache comparison 2024-07-18 18:46:09 -07:00
Qwerasd
12e8d96b1a shaper/coretext: reset font cache on grid change
Not doing this caused issues with spacing of ligatures and
multi-substitutions when changing the font size with cmd +/-
2024-07-18 17:39:57 -04:00
Mitchell Hashimoto
3b36dbb53e font/coretext: cached fonts uses unmanaged arraylist 2024-06-22 20:56:23 -07:00
Mitchell Hashimoto
71353d016e coretext shaper owns CFReleaseThread, works on both Metal and OpenGL now 2024-06-22 20:42:59 -07:00
Mitchell Hashimoto
4325dc51bc font: coretext shaper owns the cf release pool 2024-06-22 20:32:24 -07:00
Qwerasd
053500da38 shaper/coretext: update tests 2024-06-14 01:57:46 -04:00
Qwerasd
626ec2b5ac perf: introduce CFReleaseThread for running CoreFoundation releases
Some CoreFoundation objects, such as those produced by CoreText, have
expensive callbacks that run when they are released. By offloading the
CFRelease calls to another thread, we can avoid important threads being
blocked by unexpectedly expensive callbacks.

This commit also changes the way that the coretext shaper's run iterator
builds its string. Rather than using a CFMutableString, an ArrayList of
unichars is built which is passed to CFStringCreateWithCharactersNoCopy,
which is a lot more efficient since it avoids all the CoreFoundation
overhead.
2024-06-14 01:43:02 -04:00
Qwerasd
04896a14b4 perf(shaper/coretext): cache fonts between shape calls 2024-06-14 00:14:53 -04:00
Mitchell Hashimoto
1cb70d6e40 font/coretext: force LTR shaping 2024-05-08 10:11:57 -07:00
Mitchell Hashimoto
18e5382909 font/coretext: do not assume capacity on arraylist append
Now that we're padding the cells with blanks if we have shaped ligatures
we don't actually know the exact count based on the CoreText APIs, so we
should just dynamically add.
2024-05-08 08:55:28 -07:00
Mitchell Hashimoto
a8b97d4061 font/coretext: only pad shaped text ltr 2024-05-01 20:27:40 -07:00
Mitchell Hashimoto
f99823ec38 Merge pull request #1713 from BvngeeCord/main
sprites: dont thicken via font-thicken, add cursor thickness adjustment
2024-04-30 14:09:04 -07:00
Mitchell Hashimoto
6858646843 font/coretext: tests for #1721 2024-04-30 11:55:18 -07:00
Gordon Cassie
e77f9962a8 revert on comment removal 2024-04-30 10:21:31 -07:00
Gordon Cassie
e564454ff1 More log statements. 2024-04-30 10:21:08 -07:00
Gordon Cassie
b76f5976ee Remove unnecessary allocation. 2024-04-30 10:20:50 -07:00
Mitchell Hashimoto
9b4e362a33 font/coretext: shaping ligatures adds padding cells for replaced cells
Fixes #1708

Harfbuzz does this automatically. Our tests for harfbuzz test this. We
had a todo in CoreText to mimic this but wasn't sure if it was useful.
Turns out, it is important (see bug!)
2024-04-30 10:14:43 -07:00
Jack N
8c8f1b6fde fix macos build 2024-04-22 23:35:48 -07:00
Mitchell Hashimoto
188d25b5d9 font/coretext: fix merge issue from #1662 2024-04-08 17:07:00 -04:00
Mitchell Hashimoto
e66e82787b Merge pull request #1662 from mitchellh/fontmem
Dedupe font stack for terminals with identical font configuration
2024-04-08 16:57:58 -04:00
Mitchell Hashimoto
edac4a113f font/coretext: shaper may return multiple runs and that's okay
Fixes #1664

I previously asserted that we got exactly one run from CoreText because
I assumed that our run iterator was perfectly splitting runs for
CoreText. This assumption appears to be false and that seems okay.

The test case in this commit produces two runs that are directly next to
each other and there's no downside to simply iterating over them. So
this commit changes to iterate over the runs.
2024-04-08 10:52:50 -04:00
Mitchell Hashimoto
de2b0f6857 font: Atlas updated to use monotonic ID 2024-04-05 21:10:10 -07:00
Mitchell Hashimoto
c88137d254 font/shaper: work on new grid APIs 2024-04-05 20:21:13 -07:00
Mitchell Hashimoto
329697779a renderer/metal: convert more 2024-04-05 18:51:26 -07:00
Mitchell Hashimoto
eb4d21fcbf font/coretext: handle two-byte utf16 followed by more chars 2024-04-04 21:31:07 -07:00
Mitchell Hashimoto
6ace9e9d19 font/coretext: unit tests pass on macOS 2024-04-04 14:46:46 -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
c5bbbdb5ee font/coretext: better comment coretext shaper 2024-04-04 12:06:59 -07:00
Mitchell Hashimoto
61d3da1bf6 font/coretext: respect quirks fonts for shaper 2024-04-04 12:02:43 -07:00
Mitchell Hashimoto
b124378f5c font/coretext: remove todo for font features 2024-04-04 11:34:20 -07:00
Mitchell Hashimoto
de11063679 font/coretext: shaper supports user-defined font features 2024-04-04 11:25:46 -07:00
Mitchell Hashimoto
f0f53bd8b1 font/shaper: fix CoreText shaper to compile with latest terminal changes 2024-04-03 10:14:17 -07:00