Commit graph

34 commits

Author SHA1 Message Date
Mohammad AlSaleh
3e02ae1ea6 Cache codepoint support info for monospace fonts
For the simplest case of " " words, a quick binary search in
 `supported` vec will suffice, instead of using `slice::contains()`
 for all monospace fonts, where some of them may support thousands of
 codepoints.

Signed-off-by: Mohammad AlSaleh <CE.Mohammad.AlSaleh@gmail.com>
2024-03-10 15:05:07 -06:00
Jeremy Soller
1eb3233373
Add shape-run-cache feature, that can significantly improve shaping performance 2024-02-08 11:12:41 -07:00
Mohammad AlSaleh
0cea55630c Use weight absolute difference in monospace fallback matching
When matching on weights smaller than normal, "equal or smaller"
 weight restriction may cause monospace fallback to fail, depending
 on font support at such weights for the text to be shaped.

 So remove that restriction, and calculate weight differences instead
 of offsets.

 In case of no exact weight match, and with all other factors being
 equal, smaller weights will be picked before bigger ones. So, this
 should generally not cause any behavioral changes when matching on
 normal weight or bigger.

 Should fix pop-os/cosmic-term#104.

Signed-off-by: Mohammad AlSaleh <CE.Mohammad.AlSaleh@gmail.com>
2024-01-31 06:32:37 -07:00
Mohammad AlSaleh
e0ae465f91 Only use relevant info from Attrs as a key in font_matches_cache
`Attrs` contains info like color and metadata which are not relevant
 to font matching.

 So, add a new struct `FontMatchAttrs` which only contains the relevant
 info, and use it as a key in `FontSystem`'s `font_matches_cache`.

Signed-off-by: Mohammad AlSaleh <CE.Mohammad.AlSaleh@gmail.com>
2024-01-23 23:05:52 -07:00
Mohammad AlSaleh
235ec02a20 Add a size limit to font_matches_cache and clear it when it's reached
In `FontSystem`, `font_matches_cache` is an ever growing cache.

 It can also be a fast growing one in stress tests like running this
 in `cosmic-term`:

     mpv -speed 3 -vo tct <some_video>

 So this commit adds a size limit to that cache, and clears the cache
 when that limit is reached, which shouldn't be a common occurrence in
 normal usage.

Signed-off-by: Mohammad AlSaleh <CE.Mohammad.AlSaleh@gmail.com>
2024-01-23 23:05:52 -07:00
Jeremy Soller
6aadfaddac
Fix subtraction overflow when comparing weights 2024-01-18 06:58:47 -07:00
Jeremy Soller
a11f68f13d Format 2024-01-17 13:31:03 -07:00
Mohammad AlSaleh
329941c4a6 Try harder to succeed at fall-backing to a Monospace font
A combination of some ideas:

 * Try all Monospace fonts before giving up.
 * Relax exact weight restriction on font matching when trying Monospace
   fall-back. Try smaller weights if needed.
 * Make the fall-back try order weight-offset aware, AND script-aware.
 * And finally, add the option to adjust the font size of glyphs using
   fall-back Monospace fonts, so the width of them matches the default
   font width.

   For my use-case, the current fall-back attempt always fails with
   Arabic script. And none of the Arabic-supporting Monospace fonts in
   my system also support medium weight. So, if my default font is set
   to medium weight, script-aware fall-back alone will still not work.

Signed-off-by: Mohammad AlSaleh <CE.Mohammad.AlSaleh@gmail.com>
2024-01-17 13:31:03 -07:00
Jeremy Soller
5f4bc87ccf Remove patch to load Redox system fonts, as fontdb does it now 2024-01-17 13:31:03 -07:00
Jeremy Soller
d0b4b4635e Refactor of scroll and shaping
- Scroll is identified by line index and layout index, instead of just
  layout index
- Shaping has the option to prune, where caches outside of the scroll
  view are cleared
- Syntax editor no longer requires layout of all lines, only of lines
  inside scroll
- BufferLine has a metadata field that can be used by other abstractions
  to know when text was changed
2024-01-17 13:31:03 -07:00
David Stern
73acfb0962 Cache rustybuzz shape plans. 2023-12-18 18:19:27 -05:00
Héctor Ramón Jiménez
9d1d5a54c6
Respect fontconfig font aliases when enabled 2023-09-18 19:59:35 +02:00
grovesNL
c4d107563a Require either std or no_std to be specified 2023-08-09 11:44:20 -02:30
grovesNL
14d0ceb81b Move hashbrown behind no_std feature 2023-08-09 10:19:24 -02:30
John Nunley
2509fc21e2
Fix a warning 2023-07-24 18:09:31 -07:00
John Nunley
7b289c945b
Fix no_std build 2023-07-24 17:57:46 -07:00
John Nunley
faa1ceafda Unify the no_std and std impls of FontSystem 2023-07-24 08:51:19 -07:00
Jeremy Soller
268805ba0c no_std support 2022-11-08 13:24:14 -07:00
Ian Douglas Scott
0d3fb1dd9d Use ouroboros in FontSystem to avoid lifetime bound
Perhaps not quite what ouroboros is expected to be used for, but it's
not too bad, and avoiding the lifetime bound can be a huge help.
2022-11-04 10:37:32 -06:00
Jeremy Soller
ac354c3a2a
Remove AttrsList lifetime bound 2022-11-04 09:44:54 -06:00
Jeremy Soller
119a570ee9
Cache font matches, use usize for line index, use font system for swash 2022-10-26 12:23:03 -06:00
Jeremy Soller
ea18576032 Make it possible to set and use default family 2022-10-25 21:16:02 -06:00
Jeremy Soller
d04337075a Make fontdb database public 2022-10-25 20:56:31 -06:00
Jeremy Soller
59a4f8a4c1
Produce FontMatches inside of Buffer 2022-10-25 16:13:07 -06:00
Jeremy Soller
085231c153
Move font matching to Attrs 2022-10-25 15:51:28 -06:00
Jeremy Soller
324c8837fd
Cache fonts 2022-10-25 15:47:55 -06:00
Jeremy Soller
1a5b01575d
Record font mapping time 2022-10-25 14:52:43 -06:00
Jeremy Soller
66885686a0
Move fontdb source handling to font 2022-10-25 14:49:44 -06:00
Jeremy Soller
84f4381cdf
Add text attributes 2022-10-25 14:14:23 -06:00
Jeremy Soller
0f446368ca
Have TextBuffer own FontMatches 2022-10-25 11:10:44 -06:00
Andrew Wheeler(Genusis)
5200f67196 Clippy Fixes 2022-10-25 08:58:40 -06:00
Jeremy Soller
564dab009c Relicense MIT OR Apache 2.0 2022-10-24 12:58:15 -06:00
Jeremy Soller
a242d817e9
Add documentation and improve API 2022-10-18 17:14:03 -06:00
Jeremy Soller
410d4ee674
Text library moved from libcosmic 2022-10-18 12:07:22 -06:00