From ff68c56268fa40cfdabfbb57df7af259843c3d0c Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 11 Dec 2023 09:23:40 -0800 Subject: [PATCH] pkg/macos: implement CTRun --- pkg/macos/text.zig | 1 + pkg/macos/text/line.zig | 4 +++ pkg/macos/text/run.zig | 62 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 pkg/macos/text/run.zig diff --git a/pkg/macos/text.zig b/pkg/macos/text.zig index 58bfaa632..1203ed426 100644 --- a/pkg/macos/text.zig +++ b/pkg/macos/text.zig @@ -5,6 +5,7 @@ pub usingnamespace @import("text/font_manager.zig"); pub usingnamespace @import("text/frame.zig"); pub usingnamespace @import("text/framesetter.zig"); pub usingnamespace @import("text/line.zig"); +pub usingnamespace @import("text/run.zig"); pub usingnamespace @import("text/stylized_strings.zig"); test { diff --git a/pkg/macos/text/line.zig b/pkg/macos/text/line.zig index e6f798bed..a5d1b2888 100644 --- a/pkg/macos/text/line.zig +++ b/pkg/macos/text/line.zig @@ -49,6 +49,10 @@ pub const Line = opaque { leading, ); } + + pub fn getGlyphRuns(self: *Line) *foundation.Array { + return @ptrCast(c.CTLineGetGlyphRuns(@ptrCast(self))); + } }; pub const LineBoundsOptions = packed struct { diff --git a/pkg/macos/text/run.zig b/pkg/macos/text/run.zig new file mode 100644 index 000000000..83e3641ae --- /dev/null +++ b/pkg/macos/text/run.zig @@ -0,0 +1,62 @@ +const std = @import("std"); +const assert = std.debug.assert; +const Allocator = std.mem.Allocator; +const foundation = @import("../foundation.zig"); +const graphics = @import("../graphics.zig"); +const text = @import("../text.zig"); +const c = @import("c.zig"); + +pub const Run = opaque { + pub fn release(self: *Run) void { + foundation.CFRelease(self); + } + + pub fn getGlyphCount(self: *Run) usize { + return @intCast(c.CTRunGetGlyphCount(@ptrCast(self))); + } + + pub fn getGlyphsPtr(self: *Run) []const graphics.Glyph { + const len = self.getGlyphCount(); + if (len == 0) return &.{}; + const ptr = c.CTRunGetGlyphsPtr(@ptrCast(self)) orelse &.{}; + return ptr[0..len]; + } + + pub fn getGlyphs(self: *Run, alloc: Allocator) ![]const graphics.Glyph { + const len = self.getGlyphCount(); + const ptr = try alloc.alloc(graphics.Glyph, len); + errdefer alloc.free(ptr); + c.CTRunGetGlyphs(@ptrCast(self), .{ .location = 0, .len = 0 }, ptr); + return ptr; + } + + pub fn getPositionsPtr(self: *Run) []const graphics.Point { + const len = self.getGlyphCount(); + if (len == 0) return &.{}; + const ptr = c.CTRunGetPositionsPtr(@ptrCast(self)) orelse &.{}; + return ptr[0..len]; + } + + pub fn getPositions(self: *Run, alloc: Allocator) ![]const graphics.Point { + const len = self.getGlyphCount(); + const ptr = try alloc.alloc(graphics.Point, len); + errdefer alloc.free(ptr); + c.CTRunGetPositions(@ptrCast(self), .{ .location = 0, .len = 0 }, ptr); + return ptr; + } + + pub fn getAdvancesPtr(self: *Run) []const graphics.Size { + const len = self.getGlyphCount(); + if (len == 0) return &.{}; + const ptr = c.CTRunGetAdvancesPtr(@ptrCast(self)) orelse &.{}; + return ptr[0..len]; + } + + pub fn getAdvances(self: *Run, alloc: Allocator) ![]const graphics.Size { + const len = self.getGlyphCount(); + const ptr = try alloc.alloc(graphics.Size, len); + errdefer alloc.free(ptr); + c.CTRunGetAdvances(@ptrCast(self), .{ .location = 0, .len = 0 }, ptr); + return ptr; + } +};