feat: support wide characters in win32 gui

closes #132
This commit is contained in:
CJ van den Berg 2025-09-23 18:03:45 +02:00
parent f7496654ae
commit a9d4fed205
3 changed files with 35 additions and 18 deletions

View file

@ -1081,19 +1081,26 @@ fn WndProc(
global.render_cells_arena.allocator(),
global.screen.buf.len,
) catch |e| oom(e);
var prev_width: usize = 1;
var prev_cell: render.Cell = undefined;
for (global.screen.buf, global.render_cells.items) |*screen_cell, *render_cell| {
const width = screen_cell.char.width;
const codepoint = if (std.unicode.utf8ValidateSlice(screen_cell.char.grapheme))
std.unicode.wtf8Decode(screen_cell.char.grapheme) catch std.unicode.replacement_character
else
std.unicode.replacement_character;
render_cell.* = .{
.glyph_index = state.render_state.generateGlyph(
font,
codepoint,
),
.background = renderColorFromVaxis(screen_cell.style.bg),
.foreground = renderColorFromVaxis(screen_cell.style.fg),
};
if (prev_width > 1) {
render_cell.* = prev_cell;
render_cell.glyph_index = state.render_state.generateGlyph(font, codepoint, true);
} else {
render_cell.* = .{
.glyph_index = state.render_state.generateGlyph(font, codepoint, false),
.background = renderColorFromVaxis(screen_cell.style.bg),
.foreground = renderColorFromVaxis(screen_cell.style.fg),
};
}
prev_width = width;
prev_cell = render_cell.*;
}
render.paint(
&state.render_state,