tiny.filigree.font.directory
Defined in font.
API (7)
Actions
Public operations.
Source
Source: lib/filigree/src/font/directory.zig
zig
const std = @import("std");const binary = @import("binary.zig");const model = @import("model.zig");const FontError = model.FontError;const Table = binary.Table;const Tag = model.Tag;const readU16 = binary.readU16;const readU32 = binary.readU32;const tag = model.tag;pub fn table(data: []const u8, comptime name: []const u8) FontError!Table { return tableAt(data, 0, name);}pub fn tableAt(data: []const u8, directory_offset: usize, comptime name: []const u8) FontError!Table { return tableAtTag(data, directory_offset, tag(name));}pub fn tableAtTag(data: []const u8, directory_offset: usize, wanted: Tag) FontError!Table { if (directory_offset > data.len or data.len - directory_offset < 12) return error.InvalidFont; const num_tables = try readU16(data, directory_offset + 4); if (@as(usize, num_tables) > (data.len - directory_offset - 12) / 16) return error.InvalidFont; for (0..num_tables) |i| { const record = directory_offset + 12 + i * 16; if (try readU32(data, record) != wanted) continue; const offset = try readU32(data, record + 8); const len = try readU32(data, record + 12); const start: usize = @intCast(offset); const size: usize = @intCast(len); if (start > data.len or size > data.len - start) return error.InvalidFont; return .{ .offset = start, .len = size }; } return error.MissingTable;}pub fn optional(data: []const u8, comptime name: []const u8) ?Table { return table(data, name) catch null;}pub fn optionalAt(data: []const u8, directory_offset: usize, comptime name: []const u8) ?Table { return tableAt(data, directory_offset, name) catch null;}pub fn optionalAtTag(data: []const u8, directory_offset: usize, table_tag: Tag) ?Table { return tableAtTag(data, directory_offset, table_tag) catch null;}pub fn fontDirectoryOffset(data: []const u8, face_index: u32) FontError!usize { if (data.len < 12) return error.InvalidFont; if (try readU32(data, 0) != tag("ttcf")) { if (face_index != 0) return error.InvalidFont; return 0; } const version = try readU32(data, 4); if (version != 0x00010000 and version != 0x00020000) return error.InvalidFont; const face_count = try readU32(data, 8); if (face_count == 0 or face_index >= face_count) return error.InvalidFont; const face_count_usize: usize = @intCast(face_count); if (face_count_usize > (data.len - 12) / 4) return error.InvalidFont; const record = 12 + @as(usize, @intCast(face_index)) * 4; const offset = try readU32(data, record); const directory_offset: usize = @intCast(offset); if (directory_offset > data.len or data.len - directory_offset < 12) return error.InvalidFont; return directory_offset;}test "table lookup rejects empty directory" { try std.testing.expectError(error.InvalidFont, table(&.{}, "head"));}Source: lib/filigree/src/font/root.zig:4
zig
pub const directory = @import("directory.zig");Audit
| Definitions | 8 |
|---|---|
| Public names | 8 |
| Members | 0 |
| Version | 26.7.0 |
| Revision | daab053ee433 |