lib/filigree/src/font/binary.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const model = @import("model.zig");
3
4 pub const Table = struct {
5 offset: usize,
6 len: usize,
7 };
8
9 pub fn readU16(data: []const u8, offset: usize) model.FontError!u16 {
10 if (offset > data.len or data.len - offset < 2) return error.InvalidFont;
11 return std.mem.readInt(u16, data[offset..][0..2], .big);
12 }
13
14 pub fn readI8(data: []const u8, offset: usize) model.FontError!i8 {
15 if (offset >= data.len) return error.InvalidFont;
16 return @bitCast(data[offset]);
17 }
18
19 pub fn readI16(data: []const u8, offset: usize) model.FontError!i16 {
20 return @bitCast(try readU16(data, offset));
21 }
22
23 pub fn readI32(data: []const u8, offset: usize) model.FontError!i32 {
24 return @bitCast(try readU32(data, offset));
25 }
26
27 pub fn readU24(data: []const u8, offset: usize) model.FontError!u32 {
28 if (offset > data.len or data.len - offset < 3) return error.InvalidFont;
29 return (@as(u32, data[offset]) << 16) |
30 (@as(u32, data[offset + 1]) << 8) |
31 @as(u32, data[offset + 2]);
32 }
33
34 pub fn readU32(data: []const u8, offset: usize) model.FontError!u32 {
35 if (offset > data.len or data.len - offset < 4) return error.InvalidFont;
36 return std.mem.readInt(u32, data[offset..][0..4], .big);
37 }