Merge pull request #1048 from mitchellh/combining

font: position combining character correctly on x-axis
This commit is contained in:
Mitchell Hashimoto
2023-12-11 07:56:12 -08:00
committed by GitHub
3 changed files with 25 additions and 6 deletions

View File

@ -397,6 +397,10 @@ pub const Face = struct {
break :offset_y @intFromFloat(@ceil(baseline_with_offset)); break :offset_y @intFromFloat(@ceil(baseline_with_offset));
}; };
// Get our advance
var advances: [glyphs.len]macos.graphics.Size = undefined;
_ = self.font.getAdvancesForGlyphs(.horizontal, &glyphs, &advances);
// std.log.warn("renderGlyph rect={} width={} height={} render_x={} render_y={} offset_y={} ascent={} cell_height={} cell_baseline={}", .{ // std.log.warn("renderGlyph rect={} width={} height={} render_x={} render_y={} offset_y={} ascent={} cell_height={} cell_baseline={}", .{
// rect, // rect,
// width, // width,
@ -416,10 +420,7 @@ pub const Face = struct {
.offset_y = offset_y, .offset_y = offset_y,
.atlas_x = region.x, .atlas_x = region.x,
.atlas_y = region.y, .atlas_y = region.y,
.advance_x = @floatCast(advances[0].width),
// This is not used, so we don't bother calculating it. If we
// ever need it, we can calculate it using getAdvancesForGlyph.
.advance_x = 0,
}; };
} }

View File

@ -1787,6 +1787,15 @@ pub fn updateCell(
.emoji => .fg_color, .emoji => .fg_color,
}; };
// If this glyph doesn't have an advance, then we assume it is
// connected to the previous glyph (perhaps an unsafe assumption...)
// and offset by the cell width.
// Related: https://github.com/mitchellh/ghostty/issues/1046
const extra_offset: i32 = if (glyph.advance_x == 0)
@intCast(self.grid_metrics.cell_width)
else
0;
self.cells.appendAssumeCapacity(.{ self.cells.appendAssumeCapacity(.{
.mode = mode, .mode = mode,
.grid_pos = .{ @as(f32, @floatFromInt(x)), @as(f32, @floatFromInt(y)) }, .grid_pos = .{ @as(f32, @floatFromInt(x)), @as(f32, @floatFromInt(y)) },
@ -1795,7 +1804,7 @@ pub fn updateCell(
.bg_color = bg, .bg_color = bg,
.glyph_pos = .{ glyph.atlas_x, glyph.atlas_y }, .glyph_pos = .{ glyph.atlas_x, glyph.atlas_y },
.glyph_size = .{ glyph.width, glyph.height }, .glyph_size = .{ glyph.width, glyph.height },
.glyph_offset = .{ glyph.offset_x, glyph.offset_y }, .glyph_offset = .{ glyph.offset_x + extra_offset, glyph.offset_y },
}); });
} }

View File

@ -1490,6 +1490,15 @@ pub fn updateCell(
.emoji => .fg_color, .emoji => .fg_color,
}; };
// If this glyph doesn't have an advance, then we assume it is
// connected to the previous glyph (perhaps an unsafe assumption...)
// and offset by the cell width.
// Related: https://github.com/mitchellh/ghostty/issues/1046
const extra_offset: i32 = if (glyph.advance_x == 0)
@intCast(self.grid_metrics.cell_width)
else
0;
self.cells.appendAssumeCapacity(.{ self.cells.appendAssumeCapacity(.{
.mode = mode, .mode = mode,
.grid_col = @intCast(x), .grid_col = @intCast(x),
@ -1499,7 +1508,7 @@ pub fn updateCell(
.glyph_y = glyph.atlas_y, .glyph_y = glyph.atlas_y,
.glyph_width = glyph.width, .glyph_width = glyph.width,
.glyph_height = glyph.height, .glyph_height = glyph.height,
.glyph_offset_x = glyph.offset_x, .glyph_offset_x = glyph.offset_x + extra_offset,
.glyph_offset_y = glyph.offset_y, .glyph_offset_y = glyph.offset_y,
.r = colors.fg.r, .r = colors.fg.r,
.g = colors.fg.g, .g = colors.fg.g,