lib/filigree/src/fixture/layout.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const binary = @import("binary.zig");
3
4 const appendF2Dot14 = binary.appendF2Dot14;
5 const appendTag = binary.appendTag;
6 const appendU16 = binary.appendU16;
7 const appendU32 = binary.appendU32;
8 const writeU32 = binary.writeU32;
9
10 pub fn appendLayoutScriptList(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
11 try appendLayoutScriptListWithFeatures(allocator, out, &.{0});
12 }
13
14 pub fn appendLayoutScriptListWithFeatures(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8), feature_indices: []const u16) !void {
15 try appendU16(allocator, out, 1);
16 try appendTag(allocator, out, "DFLT");
17 try appendU16(allocator, out, 8);
18 try appendU16(allocator, out, 4);
19 try appendU16(allocator, out, 0);
20 try appendU16(allocator, out, 0);
21 try appendU16(allocator, out, 0xffff);
22 try appendU16(allocator, out, @intCast(feature_indices.len));
23 for (feature_indices) |feature_index| try appendU16(allocator, out, feature_index);
24 }
25
26 pub fn appendLayoutFeatureList(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8), comptime feature_tag: []const u8, lookup_index: u16) !void {
27 const lookup_indices = [_]u16{lookup_index};
28 try appendLayoutFeatureListWithLookups(allocator, out, feature_tag, &lookup_indices);
29 }
30
31 pub fn appendLayoutFeatureListWithLookups(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8), comptime feature_tag: []const u8, lookup_indices: []const u16) !void {
32 try appendU16(allocator, out, 1);
33 try appendTag(allocator, out, feature_tag);
34 try appendU16(allocator, out, 8);
35 try appendU16(allocator, out, 0);
36 try appendU16(allocator, out, @intCast(lookup_indices.len));
37 for (lookup_indices) |lookup_index| try appendU16(allocator, out, lookup_index);
38 }
39
40 pub fn appendLayoutFeatureListPair(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8), comptime first_tag: []const u8, first_lookup_index: u16, comptime second_tag: []const u8, second_lookup_index: u16) !void {
41 try appendU16(allocator, out, 2);
42 try appendTag(allocator, out, first_tag);
43 try appendU16(allocator, out, 14);
44 try appendTag(allocator, out, second_tag);
45 try appendU16(allocator, out, 20);
46 try appendU16(allocator, out, 0);
47 try appendU16(allocator, out, 1);
48 try appendU16(allocator, out, first_lookup_index);
49 try appendU16(allocator, out, 0);
50 try appendU16(allocator, out, 1);
51 try appendU16(allocator, out, second_lookup_index);
52 }
53
54 pub fn appendLayoutFeatureListFour(
55 allocator: std.mem.Allocator,
56 out: *std.ArrayListUnmanaged(u8),
57 comptime first_tag: []const u8,
58 first_lookup_index: u16,
59 comptime second_tag: []const u8,
60 second_lookup_index: u16,
61 comptime third_tag: []const u8,
62 third_lookup_index: u16,
63 comptime fourth_tag: []const u8,
64 fourth_lookup_index: u16,
65 ) !void {
66 try appendU16(allocator, out, 4);
67 try appendTag(allocator, out, first_tag);
68 try appendU16(allocator, out, 26);
69 try appendTag(allocator, out, second_tag);
70 try appendU16(allocator, out, 32);
71 try appendTag(allocator, out, third_tag);
72 try appendU16(allocator, out, 38);
73 try appendTag(allocator, out, fourth_tag);
74 try appendU16(allocator, out, 44);
75 try appendU16(allocator, out, 0);
76 try appendU16(allocator, out, 1);
77 try appendU16(allocator, out, first_lookup_index);
78 try appendU16(allocator, out, 0);
79 try appendU16(allocator, out, 1);
80 try appendU16(allocator, out, second_lookup_index);
81 try appendU16(allocator, out, 0);
82 try appendU16(allocator, out, 1);
83 try appendU16(allocator, out, third_lookup_index);
84 try appendU16(allocator, out, 0);
85 try appendU16(allocator, out, 1);
86 try appendU16(allocator, out, fourth_lookup_index);
87 }
88
89 pub fn appendLayoutFeatureVariations(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8), feature_variations: usize, alternate_lookup_index: u16) !void {
90 const lookup_indices = [_]u16{alternate_lookup_index};
91 try appendLayoutFeatureVariationsWithLookups(allocator, out, feature_variations, &lookup_indices);
92 }
93
94 pub fn appendLayoutFeatureVariationsWithLookups(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8), feature_variations: usize, lookup_indices: []const u16) !void {
95 try appendU16(allocator, out, 1);
96 try appendU16(allocator, out, 0);
97 try appendU32(allocator, out, 1);
98 const record = out.items.len;
99 try appendU32(allocator, out, 0);
100 try appendU32(allocator, out, 0);
101
102 const condition_set = out.items.len;
103 writeU32(out.items, record, @intCast(condition_set - feature_variations));
104 try appendU16(allocator, out, 1);
105 try appendU32(allocator, out, 6);
106 try appendU16(allocator, out, 1);
107 try appendU16(allocator, out, 0);
108 try appendF2Dot14(allocator, out, 8192);
109 try appendF2Dot14(allocator, out, 16384);
110
111 const substitution = out.items.len;
112 writeU32(out.items, record + 4, @intCast(substitution - feature_variations));
113 try appendU16(allocator, out, 1);
114 try appendU16(allocator, out, 0);
115 try appendU16(allocator, out, 1);
116 try appendU16(allocator, out, 0);
117 const alternate_offset = out.items.len;
118 try appendU32(allocator, out, 0);
119 writeU32(out.items, alternate_offset, @intCast(out.items.len - substitution));
120 try appendU16(allocator, out, 0);
121 try appendU16(allocator, out, @intCast(lookup_indices.len));
122 for (lookup_indices) |lookup_index| try appendU16(allocator, out, lookup_index);
123 }