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:
Mitchell Hashimoto
2024-11-06 12:53:34 -08:00
parent 9a74960900
commit 964f2ce96a

View File

@ -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: {