mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-15 00:06:09 +03:00
font/coretext: can read font tables
This commit is contained in:
@ -16,3 +16,20 @@ pub const Range = extern struct {
|
|||||||
return @bitCast(c.CFRangeMake(@intCast(loc), @intCast(len)));
|
return @bitCast(c.CFRangeMake(@intCast(loc), @intCast(len)));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const FourCharCode = packed struct(u32) {
|
||||||
|
d: u8,
|
||||||
|
c: u8,
|
||||||
|
b: u8,
|
||||||
|
a: u8,
|
||||||
|
|
||||||
|
pub fn init(v: *const [4]u8) FourCharCode {
|
||||||
|
return .{ .a = v[0], .b = v[1], .c = v[2], .d = v[3] };
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Converts the ID to a string. The return value is only valid
|
||||||
|
/// for the lifetime of the self pointer.
|
||||||
|
pub fn str(self: FourCharCode) [4]u8 {
|
||||||
|
return .{ self.a, self.b, self.c, self.d };
|
||||||
|
}
|
||||||
|
};
|
||||||
|
@ -20,9 +20,13 @@ pub const Data = opaque {
|
|||||||
foundation.CFRelease(self);
|
foundation.CFRelease(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getPointer(self: *Data) *const anyopaque {
|
pub fn getPointer(self: *Data) [*]const u8 {
|
||||||
return @ptrCast(c.CFDataGetBytePtr(@ptrCast(self)));
|
return @ptrCast(c.CFDataGetBytePtr(@ptrCast(self)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn getLength(self: *Data) usize {
|
||||||
|
return @intCast(c.CFDataGetLength(@ptrCast(self)));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
test {
|
test {
|
||||||
|
@ -67,6 +67,14 @@ pub const Font = opaque {
|
|||||||
return @ptrCast(@constCast(c.CTFontCopyDefaultCascadeListForLanguages(@ptrCast(self), null)));
|
return @ptrCast(@constCast(c.CTFontCopyDefaultCascadeListForLanguages(@ptrCast(self), null)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn copyTable(self: *Font, tag: FontTableTag) ?*foundation.Data {
|
||||||
|
return @constCast(@ptrCast(c.CTFontCopyTable(
|
||||||
|
@ptrCast(self),
|
||||||
|
@intFromEnum(tag),
|
||||||
|
c.kCTFontTableOptionNoOptions,
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
pub fn getGlyphCount(self: *Font) usize {
|
pub fn getGlyphCount(self: *Font) usize {
|
||||||
return @intCast(c.CTFontGetGlyphCount(@ptrCast(self)));
|
return @intCast(c.CTFontGetGlyphCount(@ptrCast(self)));
|
||||||
}
|
}
|
||||||
@ -195,6 +203,16 @@ pub const FontOrientation = enum(c_uint) {
|
|||||||
vertical = c.kCTFontOrientationVertical,
|
vertical = c.kCTFontOrientationVertical,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const FontTableTag = enum(u32) {
|
||||||
|
svg = c.kCTFontTableSVG,
|
||||||
|
_,
|
||||||
|
|
||||||
|
pub fn init(v: *const [4]u8) FontTableTag {
|
||||||
|
const raw: u32 = @bitCast(foundation.FourCharCode.init(v));
|
||||||
|
return @enumFromInt(raw);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
test {
|
test {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
|
|
||||||
|
@ -570,6 +570,21 @@ pub const Face = struct {
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Copy the font table data for the given tag.
|
||||||
|
pub fn copyTable(self: Face, alloc: Allocator, tag: *const [4]u8) !?[]u8 {
|
||||||
|
const data = self.font.copyTable(macos.text.FontTableTag.init(tag)) orelse
|
||||||
|
return null;
|
||||||
|
defer data.release();
|
||||||
|
|
||||||
|
const buf = try alloc.alloc(u8, data.getLength());
|
||||||
|
errdefer alloc.free(buf);
|
||||||
|
|
||||||
|
const ptr = data.getPointer();
|
||||||
|
@memcpy(buf, ptr[0..buf.len]);
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
test {
|
test {
|
||||||
@ -727,3 +742,20 @@ test "mixed color/non-color font treated as text" {
|
|||||||
|
|
||||||
try testing.expect(face.presentation == .text);
|
try testing.expect(face.presentation == .text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "svg font table" {
|
||||||
|
const testing = std.testing;
|
||||||
|
const alloc = testing.allocator;
|
||||||
|
const testFont = @import("../test.zig").fontJuliaMono;
|
||||||
|
|
||||||
|
var lib = try font.Library.init();
|
||||||
|
defer lib.deinit();
|
||||||
|
|
||||||
|
var face = try Face.init(lib, testFont, .{ .size = .{ .points = 12 } });
|
||||||
|
defer face.deinit();
|
||||||
|
|
||||||
|
const table = (try face.copyTable(alloc, "SVG ")).?;
|
||||||
|
defer alloc.free(table);
|
||||||
|
|
||||||
|
try testing.expect(table.len > 0);
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user