mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 16:56:09 +03:00
font group works with deferred faces exclusively
This commit is contained in:
@ -167,24 +167,24 @@ pub fn init(
|
|||||||
try group.addFace(
|
try group.addFace(
|
||||||
alloc,
|
alloc,
|
||||||
.regular,
|
.regular,
|
||||||
try font.Face.init(font_lib, face_ttf, font_size),
|
font.DeferredFace.initLoaded(try font.Face.init(font_lib, face_ttf, font_size)),
|
||||||
);
|
);
|
||||||
try group.addFace(
|
try group.addFace(
|
||||||
alloc,
|
alloc,
|
||||||
.bold,
|
.bold,
|
||||||
try font.Face.init(font_lib, face_bold_ttf, font_size),
|
font.DeferredFace.initLoaded(try font.Face.init(font_lib, face_bold_ttf, font_size)),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Emoji
|
// Emoji
|
||||||
try group.addFace(
|
try group.addFace(
|
||||||
alloc,
|
alloc,
|
||||||
.regular,
|
.regular,
|
||||||
try font.Face.init(font_lib, face_emoji_ttf, font_size),
|
font.DeferredFace.initLoaded(try font.Face.init(font_lib, face_emoji_ttf, font_size)),
|
||||||
);
|
);
|
||||||
try group.addFace(
|
try group.addFace(
|
||||||
alloc,
|
alloc,
|
||||||
.regular,
|
.regular,
|
||||||
try font.Face.init(font_lib, face_emoji_text_ttf, font_size),
|
font.DeferredFace.initLoaded(try font.Face.init(font_lib, face_emoji_text_ttf, font_size)),
|
||||||
);
|
);
|
||||||
|
|
||||||
break :group group;
|
break :group group;
|
||||||
|
@ -13,6 +13,8 @@ const options = @import("main.zig").options;
|
|||||||
const Face = @import("main.zig").Face;
|
const Face = @import("main.zig").Face;
|
||||||
const Presentation = @import("main.zig").Presentation;
|
const Presentation = @import("main.zig").Presentation;
|
||||||
|
|
||||||
|
const Library = @import("main.zig").Library;
|
||||||
|
|
||||||
/// The loaded face (once loaded).
|
/// The loaded face (once loaded).
|
||||||
face: ?Face = null,
|
face: ?Face = null,
|
||||||
|
|
||||||
@ -31,6 +33,12 @@ pub const Fontconfig = struct {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Initialize a deferred face that is already pre-loaded. The deferred face
|
||||||
|
/// takes ownership over the loaded face, deinit will deinit the loaded face.
|
||||||
|
pub fn initLoaded(face: Face) DeferredFace {
|
||||||
|
return .{ .face = face };
|
||||||
|
}
|
||||||
|
|
||||||
pub fn deinit(self: *DeferredFace) void {
|
pub fn deinit(self: *DeferredFace) void {
|
||||||
if (self.face) |*face| face.deinit();
|
if (self.face) |*face| face.deinit();
|
||||||
if (options.fontconfig) if (self.fc) |*fc| fc.deinit();
|
if (options.fontconfig) if (self.fc) |*fc| fc.deinit();
|
||||||
@ -82,3 +90,19 @@ pub fn hasCodepoint(self: DeferredFace, cp: u32, p: ?Presentation) bool {
|
|||||||
// if we're not using a discovery mechanism, the face MUST be loaded.
|
// if we're not using a discovery mechanism, the face MUST be loaded.
|
||||||
unreachable;
|
unreachable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test {
|
||||||
|
const testing = std.testing;
|
||||||
|
const testFont = @import("test.zig").fontRegular;
|
||||||
|
|
||||||
|
var lib = try Library.init();
|
||||||
|
defer lib.deinit();
|
||||||
|
|
||||||
|
var face = try Face.init(lib, testFont, .{ .points = 12 });
|
||||||
|
errdefer face.deinit();
|
||||||
|
|
||||||
|
var def = initLoaded(face);
|
||||||
|
defer def.deinit();
|
||||||
|
|
||||||
|
try testing.expect(def.hasCodepoint(' ', null));
|
||||||
|
}
|
||||||
|
@ -58,8 +58,8 @@ pub fn deinit(self: *Group, alloc: Allocator) void {
|
|||||||
///
|
///
|
||||||
/// The group takes ownership of the face. The face will be deallocated when
|
/// The group takes ownership of the face. The face will be deallocated when
|
||||||
/// the group is deallocated.
|
/// the group is deallocated.
|
||||||
pub fn addFace(self: *Group, alloc: Allocator, style: Style, face: Face) !void {
|
pub fn addFace(self: *Group, alloc: Allocator, style: Style, face: DeferredFace) !void {
|
||||||
try self.faces.getPtr(style).append(alloc, .{ .face = face });
|
try self.faces.getPtr(style).append(alloc, face);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This represents a specific font in the group.
|
/// This represents a specific font in the group.
|
||||||
@ -169,9 +169,9 @@ test {
|
|||||||
var group = try init(alloc);
|
var group = try init(alloc);
|
||||||
defer group.deinit(alloc);
|
defer group.deinit(alloc);
|
||||||
|
|
||||||
try group.addFace(alloc, .regular, try Face.init(lib, testFont, .{ .points = 12 }));
|
try group.addFace(alloc, .regular, DeferredFace.initLoaded(try Face.init(lib, testFont, .{ .points = 12 })));
|
||||||
try group.addFace(alloc, .regular, try Face.init(lib, testEmoji, .{ .points = 12 }));
|
try group.addFace(alloc, .regular, DeferredFace.initLoaded(try Face.init(lib, testEmoji, .{ .points = 12 })));
|
||||||
try group.addFace(alloc, .regular, try Face.init(lib, testEmojiText, .{ .points = 12 }));
|
try group.addFace(alloc, .regular, DeferredFace.initLoaded(try Face.init(lib, testEmojiText, .{ .points = 12 })));
|
||||||
|
|
||||||
// Should find all visible ASCII
|
// Should find all visible ASCII
|
||||||
var i: u32 = 32;
|
var i: u32 = 32;
|
||||||
|
@ -7,6 +7,7 @@ const Allocator = std.mem.Allocator;
|
|||||||
|
|
||||||
const Atlas = @import("../Atlas.zig");
|
const Atlas = @import("../Atlas.zig");
|
||||||
const Face = @import("main.zig").Face;
|
const Face = @import("main.zig").Face;
|
||||||
|
const DeferredFace = @import("main.zig").DeferredFace;
|
||||||
const Library = @import("main.zig").Library;
|
const Library = @import("main.zig").Library;
|
||||||
const Glyph = @import("main.zig").Glyph;
|
const Glyph = @import("main.zig").Glyph;
|
||||||
const Style = @import("main.zig").Style;
|
const Style = @import("main.zig").Style;
|
||||||
@ -221,7 +222,11 @@ test {
|
|||||||
defer cache.deinit(alloc);
|
defer cache.deinit(alloc);
|
||||||
|
|
||||||
// Setup group
|
// Setup group
|
||||||
try cache.group.addFace(alloc, .regular, try Face.init(lib, testFont, .{ .points = 12 }));
|
try cache.group.addFace(
|
||||||
|
alloc,
|
||||||
|
.regular,
|
||||||
|
DeferredFace.initLoaded(try Face.init(lib, testFont, .{ .points = 12 })),
|
||||||
|
);
|
||||||
const group = cache.group;
|
const group = cache.group;
|
||||||
|
|
||||||
// Visible ASCII. Do it twice to verify cache.
|
// Visible ASCII. Do it twice to verify cache.
|
||||||
|
@ -8,6 +8,7 @@ const harfbuzz = @import("harfbuzz");
|
|||||||
const trace = @import("tracy").trace;
|
const trace = @import("tracy").trace;
|
||||||
const Atlas = @import("../Atlas.zig");
|
const Atlas = @import("../Atlas.zig");
|
||||||
const Face = @import("main.zig").Face;
|
const Face = @import("main.zig").Face;
|
||||||
|
const DeferredFace = @import("main.zig").DeferredFace;
|
||||||
const Group = @import("main.zig").Group;
|
const Group = @import("main.zig").Group;
|
||||||
const GroupCache = @import("main.zig").GroupCache;
|
const GroupCache = @import("main.zig").GroupCache;
|
||||||
const Library = @import("main.zig").Library;
|
const Library = @import("main.zig").Library;
|
||||||
@ -599,9 +600,9 @@ fn testShaper(alloc: Allocator) !TestShaper {
|
|||||||
errdefer cache_ptr.*.deinit(alloc);
|
errdefer cache_ptr.*.deinit(alloc);
|
||||||
|
|
||||||
// Setup group
|
// Setup group
|
||||||
try cache_ptr.group.addFace(alloc, .regular, try Face.init(lib, testFont, .{ .points = 12 }));
|
try cache_ptr.group.addFace(alloc, .regular, DeferredFace.initLoaded(try Face.init(lib, testFont, .{ .points = 12 })));
|
||||||
try cache_ptr.group.addFace(alloc, .regular, try Face.init(lib, testEmoji, .{ .points = 12 }));
|
try cache_ptr.group.addFace(alloc, .regular, DeferredFace.initLoaded(try Face.init(lib, testEmoji, .{ .points = 12 })));
|
||||||
try cache_ptr.group.addFace(alloc, .regular, try Face.init(lib, testEmojiText, .{ .points = 12 }));
|
try cache_ptr.group.addFace(alloc, .regular, DeferredFace.initLoaded(try Face.init(lib, testEmojiText, .{ .points = 12 })));
|
||||||
|
|
||||||
var cell_buf = try alloc.alloc(Cell, 80);
|
var cell_buf = try alloc.alloc(Cell, 80);
|
||||||
errdefer alloc.free(cell_buf);
|
errdefer alloc.free(cell_buf);
|
||||||
|
Reference in New Issue
Block a user