mirror of
https://github.com/ghostty-org/ghostty.git
synced 2026-04-15 03:52:39 +00:00
This PR incorporates the recent changes made to CoreText in the following PRs: * https://github.com/ghostty-org/ghostty/pull/9883 * https://github.com/ghostty-org/ghostty/pull/10179 * https://github.com/ghostty-org/ghostty/pull/10295 Tests have been added verifying the behavior. Below are all the changes in shaping from the above PRs but now using HarfBuzz. ## Tai Tham vowels (https://github.com/ghostty-org/ghostty/pull/9883) Browser: ᨯᩰ Before: (Note that this worked correctly with the old logic for HarfBuzz in contrast to CoreText) <img width="498" height="96" alt="CleanShot 2026-01-15 at 09 50 50@2x" src="https://github.com/user-attachments/assets/a87abb4e-7829-4df0-9cb6-9fc254c10ba2" /> After: <img width="496" height="96" alt="CleanShot 2026-01-15 at 09 51 07@2x" src="https://github.com/user-attachments/assets/64cb8b12-0b99-4e9f-8189-d793469048f6" /> ## Tibetan characters (discussion https://github.com/ghostty-org/ghostty/discussions/8054) Browser: ༀ Before (with Noto Serif Tibetan): <img width="586" height="154" alt="CleanShot 2026-01-16 at 09 28 32@2x" src="https://github.com/user-attachments/assets/5b7df9c1-13ff-45fd-977e-9e152063517c" /> After: <img width="604" height="202" alt="CleanShot 2026-01-16 at 09 28 46@2x" src="https://github.com/user-attachments/assets/3832b8b0-1ce6-448d-a063-622127cfb213" /> ## Tai Tham ligature (https://github.com/ghostty-org/ghostty/pull/10179 and https://github.com/ghostty-org/ghostty/pull/10295) Browser: ᩉ᩠ᨿᩩ Before: <img width="860" height="144" alt="CleanShot 2026-01-15 at 09 57 30@2x" src="https://github.com/user-attachments/assets/56c85a06-1853-4f88-992b-568b7f1d4b4e" /> After: <img width="860" height="108" alt="CleanShot 2026-01-15 at 09 57 44@2x" src="https://github.com/user-attachments/assets/fe236aad-ac2c-4665-aef4-bc996e3b2938" /> ## Javanese ligature (https://github.com/ghostty-org/ghostty/pull/10295) Browser: ᩉ᩠ᨿᩩ Before: <img width="856" height="128" alt="CleanShot 2026-01-15 at 09 59 04@2x" src="https://github.com/user-attachments/assets/73c60445-a80d-4003-ae2b-c8d53f3c9cf9" /> After: <img width="866" height="114" alt="CleanShot 2026-01-15 at 09 59 23@2x" src="https://github.com/user-attachments/assets/fce80429-096a-455e-aabd-00bf33fdae54" /> ## Chakma ligature (https://github.com/ghostty-org/ghostty/pull/10295) Browser: 𑄝𑄖𑄳𑄠𑄬 Before: <img width="1298" height="104" alt="CleanShot 2026-01-15 at 10 00 31@2x" src="https://github.com/user-attachments/assets/72e2be85-fb4b-4ca0-98d7-30279fd2613f" /> After: <img width="1310" height="84" alt="CleanShot 2026-01-15 at 10 00 52@2x" src="https://github.com/user-attachments/assets/a5e2a89c-7f1e-474c-9d61-b90c6a6ffedd" /> ## Bengali ligature (https://github.com/ghostty-org/ghostty/pull/10295) Browser: রাষ্ট্রে Before: <img width="1268" height="94" alt="CleanShot 2026-01-15 at 10 02 16@2x" src="https://github.com/user-attachments/assets/2946701c-a41b-45c5-b442-915dad45d380" /> After: <img width="1274" height="110" alt="CleanShot 2026-01-15 at 10 02 32@2x" src="https://github.com/user-attachments/assets/c1684149-cca4-43a7-b384-13e3d4854765" /> ## Devanagari string (test changed in https://github.com/ghostty-org/ghostty/pull/10295) Browser: अपार्टमेंट Before: <img width="560" height="98" alt="CleanShot 2026-01-16 at 09 31 45@2x" src="https://github.com/user-attachments/assets/8df36427-c1fe-4f3c-9e2a-7e9b798411b4" /> After: <img width="570" height="88" alt="CleanShot 2026-01-16 at 09 32 06@2x" src="https://github.com/user-attachments/assets/972ed525-f341-400b-a09c-29b0a9135502" /> ## AI disclaimer I used Amp to copy the logic from CoreText, but had to help it along. I took over after I noticed the different behavior with HarfBuzz's default cluster level. [Adopt CoreText changes to HarfBuzz shaper](https://ampcode.com/threads/T-019bbccd-74d3-76c8-add4-6270f0f5375f) [Rename debug_codepoints, explore HarfBuzz alternatives](https://ampcode.com/threads/T-019bbce3-bed6-70fa-9eec-b0d1ee448ee9) [Fix cluster indexing in codepoints array](https://ampcode.com/threads/T-019bbced-d67b-7239-b507-9b3bd027faeb)