mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-05-06 06:47:17 -04:00
unicode-combining: store seen combining chains "globally" in the term struct
Instead of storing combining data per cell, realize that most combinations are re-occurring and that there's lots of available space left in the unicode range, and store seen base+combining combinations chains in a per-terminal array. When we encounter a combining character, we first try to pre-compose, like before. If that fails, we then search for the current base+combining combo in the list of previously seen combinations. If not found there either, we allocate a new combo and add it to the list. Regardless, the result is an index into this array. We store this index, offsetted by COMB_CHARS_LO=0x40000000ul in the cell. When rendering, we need to check if the cell character is a plain character, or if it's a composed character (identified by checking if the cell character is >= COMB_CHARS_LO). Then we render the grapheme pretty much like before.
This commit is contained in:
parent
ae7383189a
commit
62e0774319
8 changed files with 97 additions and 92 deletions
17
terminal.h
17
terminal.h
|
|
@ -77,21 +77,16 @@ struct damage {
|
|||
int lines;
|
||||
};
|
||||
|
||||
#if FOOT_UNICODE_MAX_COMBINING_CHARS > 0
|
||||
struct combining_chars {
|
||||
struct composed {
|
||||
wchar_t base;
|
||||
wchar_t combining[5];
|
||||
uint8_t count;
|
||||
wchar_t chars[FOOT_UNICODE_MAX_COMBINING_CHARS];
|
||||
} __attribute__((packed));
|
||||
#endif
|
||||
};
|
||||
|
||||
struct row {
|
||||
struct cell *cells;
|
||||
bool dirty;
|
||||
bool linebreak;
|
||||
|
||||
#if FOOT_UNICODE_MAX_COMBINING_CHARS > 0
|
||||
struct combining_chars *comb_chars;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct sixel {
|
||||
|
|
@ -221,6 +216,10 @@ struct terminal {
|
|||
struct grid alt;
|
||||
struct grid *grid;
|
||||
|
||||
#define COMB_CHARS_LO 0x40000000ul
|
||||
size_t composed_count;
|
||||
struct composed *composed;
|
||||
|
||||
struct fcft_font *fonts[4];
|
||||
int font_dpi;
|
||||
int font_adjustments;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue