tiny.filigree.font.kern
Defined in font.
API (3)
Actions
Public operations.
Types and contracts
Public types and contracts.
Source
Source: lib/filigree/src/font/kern.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 readI16 = binary.readI16;const readU16 = binary.readU16;pub const Kern = struct { subtable: ?KernSubtable, pub fn init(data: []const u8, kern_table: Table) FontError!Kern { if (kern_table.len < 4) return error.InvalidKern; const version = try readU16(data, kern_table.offset); if (version != 0) return error.InvalidKern; const count = try readU16(data, kern_table.offset + 2); var offset = kern_table.offset + 4; const end = kern_table.offset + kern_table.len; var first: ?KernSubtable = null; for (0..count) |_| { if (offset > end or end - offset < 6) return error.InvalidKern; const subtable_start = offset; const subtable_version = try readU16(data, offset); const len: usize = try readU16(data, offset + 2); const coverage = try readU16(data, offset + 4); if (len < 6 or len > end - offset) return error.InvalidKern; offset += len; if (subtable_version != 0) continue; const format: u8 = @intCast(coverage >> 8); const horizontal = (coverage & 0x0001) != 0; const minimum = (coverage & 0x0002) != 0; const cross_stream = (coverage & 0x0004) != 0; if (format != 0 or !horizontal or minimum or cross_stream) continue; const subtable = try validateKernFormat0(data, .{ .offset = subtable_start, .len = len }); if (first == null) first = subtable; } return .{ .subtable = first }; } pub fn value(self: Kern, data: []const u8, left_glyph: u32, right_glyph: u32) FontError!i16 { if (self.subtable) |subtable| { if (try subtable.value(data, left_glyph, right_glyph)) |pair_value| { return pair_value; } } return 0; }};const KernSubtable = struct { pairs_offset: usize, pair_count: u16, fn value(self: KernSubtable, data: []const u8, left_glyph: u32, right_glyph: u32) FontError!?i16 { if (left_glyph > std.math.maxInt(u16) or right_glyph > std.math.maxInt(u16)) return null; const key = (@as(u32, @intCast(left_glyph)) << 16) | @as(u32, @intCast(right_glyph)); var left: usize = 0; var right: usize = self.pair_count; while (left < right) { const mid = left + (right - left) / 2; const record = self.pairs_offset + mid * 6; const candidate = (@as(u32, try readU16(data, record)) << 16) | @as(u32, try readU16(data, record + 2)); if (key < candidate) { right = mid; } else if (key > candidate) { left = mid + 1; } else { return try readI16(data, record + 4); } } return null; }};fn validateKernFormat0(data: []const u8, subtable: Table) FontError!KernSubtable { if (subtable.len < 14) return error.InvalidKern; const pairs_offset = subtable.offset + 14; const pair_count = try readU16(data, subtable.offset + 6); const pairs_len = @as(usize, pair_count) * 6; if (pairs_len > subtable.len - 14) return error.InvalidKern; return .{ .pairs_offset = pairs_offset, .pair_count = pair_count, };}Source: lib/filigree/src/font/root.zig:10
zig
pub const kern = @import("kern.zig");Audit
| Definitions | 4 |
|---|---|
| Public names | 4 |
| Members | 1 |
| Version | 26.7.0 |
| Revision | daab053ee433 |