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 }