From 762a2074eeada1aa0c61a3f1bed662ff05e5119b Mon Sep 17 00:00:00 2001 From: Erik Arvstedt Date: Wed, 5 Apr 2023 16:37:51 +0200 Subject: [PATCH] freetype: fix type for C string args Propagate the correct string type required by Freetype to the Zig layer. Previously, passing non zero-terminated strings caused runtime errors. --- libs/freetype/src/Face.zig | 2 +- libs/freetype/src/Library.zig | 2 +- libs/freetype/src/freetype.zig | 6 ++++-- libs/freetype/src/main.zig | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/libs/freetype/src/Face.zig b/libs/freetype/src/Face.zig index 8f3041c9..ad805da5 100644 --- a/libs/freetype/src/Face.zig +++ b/libs/freetype/src/Face.zig @@ -58,7 +58,7 @@ pub fn deinit(self: Face) void { _ = c.FT_Done_Face(self.handle); } -pub fn attachFile(self: Face, path: []const u8) Error!void { +pub fn attachFile(self: Face, path: [*:0]const u8) Error!void { return self.attachStream(.{ .flags = .{ .path = true }, .data = .{ .path = path }, diff --git a/libs/freetype/src/Library.zig b/libs/freetype/src/Library.zig index 8fa1bbd2..9ab79b06 100644 --- a/libs/freetype/src/Library.zig +++ b/libs/freetype/src/Library.zig @@ -30,7 +30,7 @@ pub fn deinit(self: Library) void { _ = c.FT_Done_FreeType(self.handle); } -pub fn createFace(self: Library, path: []const u8, face_index: i32) Error!Face { +pub fn createFace(self: Library, path: [*:0]const u8, face_index: i32) Error!Face { return self.openFace(.{ .flags = .{ .path = true }, .data = .{ .path = path }, diff --git a/libs/freetype/src/freetype.zig b/libs/freetype/src/freetype.zig index 0d99e693..b96c0277 100644 --- a/libs/freetype/src/freetype.zig +++ b/libs/freetype/src/freetype.zig @@ -159,7 +159,7 @@ pub const OpenArgs = struct { flags: OpenFlags, data: union(enum) { memory: []const u8, - path: []const u8, + path: [*:0]const u8, stream: c.FT_Stream, driver: c.FT_Module, params: []const c.FT_Parameter, @@ -173,7 +173,9 @@ pub const OpenArgs = struct { oa.memory_base = d.ptr; oa.memory_size = @intCast(u31, d.len); }, - .path => |*d| oa.pathname = @intToPtr(*u8, @ptrToInt(d.ptr)), + // The Freetype API requires a mutable string. + // This is an oversight, Freetype actually never writes to this string. + .path => |d| oa.pathname = @constCast(d), .stream => |d| oa.stream = d, .driver => |d| oa.driver = d, .params => |*d| { diff --git a/libs/freetype/src/main.zig b/libs/freetype/src/main.zig index ac242633..3d558307 100644 --- a/libs/freetype/src/main.zig +++ b/libs/freetype/src/main.zig @@ -13,7 +13,7 @@ const std = @import("std"); const testing = std.testing; const ft = @import("freetype.zig"); -fn sdkPath(comptime suffix: []const u8) []const u8 { +fn sdkPath(comptime suffix: [*:0]const u8) [*:0]const u8 { if (suffix[0] != '/') @compileError("suffix must be an absolute path"); return comptime blk: { const root_dir = std.fs.path.dirname(@src().file) orelse ".";