mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 16:56:09 +03:00
font/coretext: always score based on style string length
This fixes an issue where for the regular style we were picking a suboptimal style because for some font faces we were choosing more bold faces (just as chance). This modifies our scoring to take the style length into account even for regular style. We already had this logic for explicit styles.
This commit is contained in:
@ -685,30 +685,29 @@ pub const CoreText = struct {
|
|||||||
break :style .unmatched;
|
break :style .unmatched;
|
||||||
defer style.release();
|
defer style.release();
|
||||||
|
|
||||||
|
// 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 we have a specific desired style, attempt to search for that.
|
||||||
if (desc.style) |desired_style| {
|
if (desc.style) |desired_style| {
|
||||||
var buf: [128]u8 = undefined;
|
|
||||||
const style_str = style.cstring(&buf, .utf8) orelse break :style .unmatched;
|
|
||||||
|
|
||||||
// Matching style string gets highest score
|
// Matching style string gets highest score
|
||||||
if (std.mem.eql(u8, desired_style, style_str)) break :style .match;
|
if (std.mem.eql(u8, desired_style, style_str)) break :style .match;
|
||||||
|
} else if (!desc.bold and !desc.italic) {
|
||||||
// Otherwise the score is based on the length of the style string.
|
// If we do not, and we have no symbolic traits, then we try
|
||||||
// Shorter styles are scored higher.
|
// to find "regular" (or no style). If we have symbolic traits
|
||||||
break :style @enumFromInt(100 -| style_str.len);
|
// we do nothing but we can improve scoring by taking that into
|
||||||
|
// account, too.
|
||||||
|
if (std.mem.eql(u8, "Regular", style_str)) {
|
||||||
|
break :style .match;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we do not, and we have no symbolic traits, then we try
|
// Otherwise the score is based on the length of the style string.
|
||||||
// to find "regular" (or no style). If we have symbolic traits
|
// Shorter styles are scored higher. This is a heuristic that
|
||||||
// we do nothing but we can improve scoring by taking that into
|
// if we don't have a desired style then shorter tends to be
|
||||||
// account, too.
|
// more often the "regular" style.
|
||||||
if (!desc.bold and !desc.italic) {
|
break :style @enumFromInt(100 -| style_str.len);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
break :style .unmatched;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
score_acc.traits = traits: {
|
score_acc.traits = traits: {
|
||||||
|
Reference in New Issue
Block a user