Fix rendering of scaled emoji

This commit is contained in:
Kovid Goyal 2024-12-10 13:29:19 +05:30
parent 27bcd96071
commit 87dea95a0e
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
2 changed files with 11 additions and 9 deletions

View file

@ -123,7 +123,7 @@ ensure_canvas_can_fit(FontGroup *fg, unsigned cells, unsigned scale) {
}
fg->canvas.current_cells = cells;
fg->canvas.current_scale = scale;
if (fg->canvas.buf) memset(fg->canvas.buf, 0, cs(fg->canvas.current_cells, fg->canvas.alloced_scale));
if (fg->canvas.buf) memset(fg->canvas.buf, 0, cs(cells, scale));
#undef cs
}
@ -490,8 +490,7 @@ face_has_codepoint(const void* face, char_type cp) {
static bool
has_emoji_presentation(const CPUCell *c, const ListOfChars *lc) {
if (!c->is_multicell || c->x || c->y || !lc->count) return false;
return is_emoji(lc->chars[0]) && (lc->count == 1 || lc->chars[1] != VS15);
return c->is_multicell && lc->count && is_emoji(lc->chars[0]) && (lc->count == 1 || lc->chars[1] != VS15);
}
bool

View file

@ -106,14 +106,17 @@ def test_multicell(self: TestMulticell) -> None:
ac(x, 0, is_multicell=True, width=2, scale=2, subscale_n=3, x=x, y=0, text='', natural_width=False)
for x in range(0, 4):
ac(x, 1, is_multicell=True, width=2, scale=2, subscale_n=3, x=x, y=1, text='', natural_width=False)
def comb(x, y):
s.reset()
multicell(s, 'a', scale=2)
s.cursor.x, s.cursor.y = x, y
s.draw('\u0301')
assert_cursor_at(x, y)
ac(0, 0, text='a' if y else 'a\u0301', is_multicell=True)
for y in range(2):
for x in range(1, 3):
s.reset()
multicell(s, 'a', scale=2)
s.cursor.x, s.cursor.y = x, y
s.draw('\u0301')
assert_cursor_at(x, y)
ac(0, 0, text='a' if y else 'a\u0301', is_multicell=True)
comb(x, y)
comb(0, 1)
# Test wrapping
s.reset()