mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-15 00:06:09 +03:00
font: don't use intCast on index
This is a weird one. By using intCast on the `idx` I am periodically getting a panic on index out of bounds where the index is larger than FontIndex can possibly be. Very strange! I tried to just remove intCasts and believe it or not that worked. Previously, `cat /dev/urandom` would trigger the issue in seconds and now I've had it running 20+ minutes without the issue. The additional `if` check is just a safety mechanism
This commit is contained in:
@ -303,7 +303,8 @@ fn indexForCodepointExact(self: Group, cp: u32, style: Style, p: ?Presentation)
|
|||||||
/// necessarily force the font to load.
|
/// necessarily force the font to load.
|
||||||
pub fn hasCodepoint(self: *Group, index: FontIndex, cp: u32, p: ?Presentation) bool {
|
pub fn hasCodepoint(self: *Group, index: FontIndex, cp: u32, p: ?Presentation) bool {
|
||||||
const list = self.faces.getPtr(index.style);
|
const list = self.faces.getPtr(index.style);
|
||||||
const item = list.items[@intCast(index.idx)];
|
if (index.idx >= list.items.len) return false;
|
||||||
|
const item = list.items[index.idx];
|
||||||
return switch (item) {
|
return switch (item) {
|
||||||
.deferred => |v| v.hasCodepoint(cp, p),
|
.deferred => |v| v.hasCodepoint(cp, p),
|
||||||
.loaded => |face| loaded: {
|
.loaded => |face| loaded: {
|
||||||
@ -330,7 +331,7 @@ pub fn presentationFromIndex(self: *Group, index: FontIndex) !font.Presentation
|
|||||||
pub fn faceFromIndex(self: *Group, index: FontIndex) !*Face {
|
pub fn faceFromIndex(self: *Group, index: FontIndex) !*Face {
|
||||||
if (index.special() != null) return error.SpecialHasNoFace;
|
if (index.special() != null) return error.SpecialHasNoFace;
|
||||||
const list = self.faces.getPtr(index.style);
|
const list = self.faces.getPtr(index.style);
|
||||||
const item = &list.items[@intCast(index.idx)];
|
const item = &list.items[index.idx];
|
||||||
return switch (item.*) {
|
return switch (item.*) {
|
||||||
.deferred => |*d| deferred: {
|
.deferred => |*d| deferred: {
|
||||||
const face = try d.load(self.lib, self.size);
|
const face = try d.load(self.lib, self.size);
|
||||||
@ -553,6 +554,30 @@ test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "face count limit" {
|
||||||
|
const testing = std.testing;
|
||||||
|
const alloc = testing.allocator;
|
||||||
|
const testFont = @import("test.zig").fontRegular;
|
||||||
|
|
||||||
|
var atlas_greyscale = try font.Atlas.init(alloc, 512, .greyscale);
|
||||||
|
defer atlas_greyscale.deinit(alloc);
|
||||||
|
|
||||||
|
var lib = try Library.init();
|
||||||
|
defer lib.deinit();
|
||||||
|
|
||||||
|
var group = try init(alloc, lib, .{ .points = 12 });
|
||||||
|
defer group.deinit();
|
||||||
|
|
||||||
|
for (0..FontIndex.Special.start - 1) |_| {
|
||||||
|
try group.addFace(.regular, .{ .loaded = try Face.init(lib, testFont, .{ .points = 12 }) });
|
||||||
|
}
|
||||||
|
|
||||||
|
try testing.expectError(error.GroupFull, group.addFace(
|
||||||
|
.regular,
|
||||||
|
.{ .loaded = try Face.init(lib, testFont, .{ .points = 12 }) },
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
test "box glyph" {
|
test "box glyph" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
const alloc = testing.allocator;
|
const alloc = testing.allocator;
|
||||||
|
Reference in New Issue
Block a user