From 4592dd807d7aed5d5b7d56bdf88d05a253b13ab4 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Tue, 15 Jul 2025 12:36:50 +0200 Subject: [PATCH 1/2] fix: allow font names longer than 31 characters in win32 closes #275 --- src/win32/FontFace.zig | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/win32/FontFace.zig b/src/win32/FontFace.zig index 6bf2e81..811340e 100644 --- a/src/win32/FontFace.zig +++ b/src/win32/FontFace.zig @@ -2,11 +2,13 @@ const FontFace = @This(); const std = @import("std"); -// it seems that Windows only supports font faces with up to 31 characters -pub const max = 31; +// it seems that Windows only supports font faces with up to 31 characters, +// but we use a larger buffer here because GetFamilyNames can apparently +// return longer strings +pub const max = 254; buf: [max + 1]u16, -len: u5, +len: usize, pub fn initUtf8(utf8: []const u8) error{ TooLong, InvalidUtf8 }!FontFace { const utf16_len = std.unicode.calcUtf16LeLen(utf8) catch return error.InvalidUtf8; From 0003a52aaff5e40f060516f720b53e2ec361fa6e Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Tue, 15 Jul 2025 12:38:06 +0200 Subject: [PATCH 2/2] refactor: avoid unnecessary @intCast and @ptrCast in FontFace.zig --- src/win32/FontFace.zig | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/win32/FontFace.zig b/src/win32/FontFace.zig index 811340e..6b6f15b 100644 --- a/src/win32/FontFace.zig +++ b/src/win32/FontFace.zig @@ -14,19 +14,19 @@ pub fn initUtf8(utf8: []const u8) error{ TooLong, InvalidUtf8 }!FontFace { const utf16_len = std.unicode.calcUtf16LeLen(utf8) catch return error.InvalidUtf8; if (utf16_len > max) return error.TooLong; - var result: FontFace = .{ .buf = undefined, .len = @intCast(utf16_len) }; - result.buf[utf16_len] = 0; - const actual_len = try std.unicode.utf8ToUtf16Le(&result.buf, utf8); + var self: FontFace = .{ .buf = undefined, .len = utf16_len }; + const actual_len = try std.unicode.utf8ToUtf16Le(&self.buf, utf8); std.debug.assert(actual_len == utf16_len); - return result; + self.buf[actual_len] = 0; + return self; } pub fn ptr(self: *const FontFace) [*:0]const u16 { - std.debug.assert(self.buf[@as(usize, self.len)] == 0); - return @ptrCast(&self.buf); + return self.slice().ptr; } pub fn slice(self: *const FontFace) [:0]const u16 { - return self.ptr()[0..self.len :0]; + std.debug.assert(self.buf[self.len] == 0); + return self.buf[0..self.len :0]; } pub fn eql(self: *const FontFace, other: *const FontFace) bool { return std.mem.eql(u16, self.slice(), other.slice());