build: fix freetype C enum signedness for MSVC

MSVC translates C enums as signed int, while GCC/Clang uses unsigned
int. The freetype Zig bindings hardcode c_uint for enum backing types,
causing type mismatches when compiling with MSVC target.

Fix by adding @intCast at call sites where enum values are passed to
C functions, and @bitCast for the glyph format tag extraction where
bit-shift operations require unsigned integers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alessandro De Blasis
2026-03-24 17:12:18 +01:00
parent deeda46186
commit ce99300513
2 changed files with 9 additions and 6 deletions

View File

@@ -52,7 +52,7 @@ pub const Face = struct {
/// Select a given charmap by its encoding tag (as listed in freetype.h). /// Select a given charmap by its encoding tag (as listed in freetype.h).
pub fn selectCharmap(self: Face, encoding: Encoding) Error!void { pub fn selectCharmap(self: Face, encoding: Encoding) Error!void {
return intToError(c.FT_Select_Charmap(self.handle, @intFromEnum(encoding))); return intToError(c.FT_Select_Charmap(self.handle, @intCast(@intFromEnum(encoding))));
} }
/// Call FT_Request_Size to request the nominal size (in points). /// Call FT_Request_Size to request the nominal size (in points).
@@ -99,7 +99,7 @@ pub const Face = struct {
pub fn renderGlyph(self: Face, render_mode: RenderMode) Error!void { pub fn renderGlyph(self: Face, render_mode: RenderMode) Error!void {
return intToError(c.FT_Render_Glyph( return intToError(c.FT_Render_Glyph(
self.handle.*.glyph, self.handle.*.glyph,
@intFromEnum(render_mode), @intCast(@intFromEnum(render_mode)),
)); ));
} }

View File

@@ -679,13 +679,16 @@ pub const Face = struct {
else => |f| { else => |f| {
// Glyph formats are tags, so we can // Glyph formats are tags, so we can
// output a semi-readable error here. // output a semi-readable error here.
// Use @bitCast to u32 because MSVC translates C enums
// as signed int, while GCC/Clang uses unsigned int.
const tag: u32 = @bitCast(f);
log.err( log.err(
"Can't render glyph with unsupported glyph format \"{s}\"", "Can't render glyph with unsupported glyph format \"{s}\"",
.{[4]u8{ .{[4]u8{
@truncate(f >> 24), @truncate(tag >> 24),
@truncate(f >> 16), @truncate(tag >> 16),
@truncate(f >> 8), @truncate(tag >> 8),
@truncate(f >> 0), @truncate(tag >> 0),
}}, }},
); );
return error.UnsupportedGlyphFormat; return error.UnsupportedGlyphFormat;