aboutsummaryrefslogtreecommitdiff
path: root/vendor/libghostty-vt/pkg/macos/text/framesetter.zig
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-04-04 19:22:04 +0300
committerCan Celik <ogulcancelik@gmail.com>2026-04-05 01:23:06 +0300
commit41dd733ca7123c9ac4bfc6c781697a660e95b052 (patch)
tree3fc91815ca139ef2e0b281bba0abda4ef15175f4 /vendor/libghostty-vt/pkg/macos/text/framesetter.zig
parent55c138263e190a1e79d4b997bfb9397306c0ec1f (diff)
feat: finish ghostty pane backend integration
Diffstat (limited to 'vendor/libghostty-vt/pkg/macos/text/framesetter.zig')
-rw-r--r--vendor/libghostty-vt/pkg/macos/text/framesetter.zig66
1 files changed, 66 insertions, 0 deletions
diff --git a/vendor/libghostty-vt/pkg/macos/text/framesetter.zig b/vendor/libghostty-vt/pkg/macos/text/framesetter.zig
new file mode 100644
index 00000000..dbd82762
--- /dev/null
+++ b/vendor/libghostty-vt/pkg/macos/text/framesetter.zig
@@ -0,0 +1,66 @@
+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").c;
+
+pub const Framesetter = opaque {
+ pub fn createWithAttributedString(str: *foundation.AttributedString) Allocator.Error!*Framesetter {
+ return @as(
+ ?*Framesetter,
+ @ptrFromInt(@intFromPtr(c.CTFramesetterCreateWithAttributedString(
+ @ptrCast(str),
+ ))),
+ ) orelse Allocator.Error.OutOfMemory;
+ }
+
+ pub fn release(self: *Framesetter) void {
+ foundation.CFRelease(self);
+ }
+
+ pub fn createFrame(
+ self: *Framesetter,
+ range: foundation.Range,
+ path: *graphics.Path,
+ attrs: ?*foundation.Dictionary,
+ ) !*text.Frame {
+ return @as(
+ ?*text.Frame,
+ @ptrFromInt(@intFromPtr(c.CTFramesetterCreateFrame(
+ @ptrCast(self),
+ @bitCast(range),
+ @ptrCast(path),
+ @ptrCast(attrs),
+ ))),
+ ) orelse error.FrameCreateFailed;
+ }
+};
+
+test {
+ const str = try foundation.MutableAttributedString.create(0);
+ defer str.release();
+ {
+ const rep = try foundation.String.createWithBytes("hello", .utf8, false);
+ defer rep.release();
+ str.replaceString(foundation.Range.init(0, 0), rep);
+ }
+
+ const fs = try Framesetter.createWithAttributedString(@ptrCast(str));
+ defer fs.release();
+
+ const path = try graphics.Path.createWithRect(graphics.Rect.init(0, 0, 100, 200), null);
+ defer path.release();
+ const frame = try fs.createFrame(
+ foundation.Range.init(0, 0),
+ path,
+ null,
+ );
+ defer frame.release();
+
+ {
+ var points: [1]graphics.Point = undefined;
+ frame.getLineOrigins(foundation.Range.init(0, 1), &points);
+ }
+}