Merge pull request #2609 from ghostty-org/push-uuprylpzkqsn

coretext: variable font fixes
This commit is contained in:
Mitchell Hashimoto
2024-11-06 13:01:02 -08:00
committed by GitHub

View File

@ -235,21 +235,7 @@ pub const Descriptor = struct {
);
}
// Build our descriptor from attrs
var desc = try macos.text.FontDescriptor.createWithAttributes(@ptrCast(attrs));
errdefer desc.release();
// Variations are built by copying the descriptor. I don't know a way
// to set it on attrs directly.
for (self.variations) |v| {
const id = try macos.foundation.Number.create(.int, @ptrCast(&v.id));
defer id.release();
const next = try desc.createCopyWithVariation(id, v.value);
desc.release();
desc = next;
}
return desc;
return try macos.text.FontDescriptor.createWithAttributes(@ptrCast(attrs));
}
};
@ -685,30 +671,29 @@ pub const CoreText = struct {
break :style .unmatched;
defer style.release();
// If we have a specific desired style, attempt to search for that.
if (desc.style) |desired_style| {
// Get our style string
var buf: [128]u8 = undefined;
const style_str = style.cstring(&buf, .utf8) orelse break :style .unmatched;
// If we have a specific desired style, attempt to search for that.
if (desc.style) |desired_style| {
// Matching style string gets highest score
if (std.mem.eql(u8, desired_style, style_str)) break :style .match;
// Otherwise the score is based on the length of the style string.
// Shorter styles are scored higher.
break :style @enumFromInt(100 -| style_str.len);
}
} else if (!desc.bold and !desc.italic) {
// If we do not, and we have no symbolic traits, then we try
// to find "regular" (or no style). If we have symbolic traits
// we do nothing but we can improve scoring by taking that into
// account, too.
if (!desc.bold and !desc.italic) {
var buf: [128]u8 = undefined;
const style_str = style.cstring(&buf, .utf8) orelse break :style .unmatched;
if (std.mem.eql(u8, "Regular", style_str)) break :style .match;
if (std.mem.eql(u8, "Regular", style_str)) {
break :style .match;
}
}
break :style .unmatched;
// Otherwise the score is based on the length of the style string.
// Shorter styles are scored higher. This is a heuristic that
// if we don't have a desired style then shorter tends to be
// more often the "regular" style.
break :style @enumFromInt(100 -| style_str.len);
};
score_acc.traits = traits: {