lib/filigree/src/fixture/positioning.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

   1 const std = @import("std");
   2 const binary = @import("binary.zig");
   3 const layout_fixture = @import("layout.zig");
   4 
   5 const appendF2Dot14 = binary.appendF2Dot14;
   6 const appendI16 = binary.appendI16;
   7 const appendTag = binary.appendTag;
   8 const appendU16 = binary.appendU16;
   9 const appendU32 = binary.appendU32;
  10 const writeU16 = binary.writeU16;
  11 const writeU32 = binary.writeU32;
  12 
  13 const appendLayoutFeatureList = layout_fixture.appendLayoutFeatureList;
  14 const appendLayoutFeatureListPair = layout_fixture.appendLayoutFeatureListPair;
  15 const appendLayoutFeatureVariations = layout_fixture.appendLayoutFeatureVariations;
  16 const appendLayoutScriptList = layout_fixture.appendLayoutScriptList;
  17 const appendLayoutScriptListWithFeatures = layout_fixture.appendLayoutScriptListWithFeatures;
  18 
  19 pub fn appendGposSingleAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
  20     try appendU16(allocator, out, 1);
  21     try appendU16(allocator, out, 0);
  22     try appendU16(allocator, out, 10);
  23     try appendU16(allocator, out, 30);
  24     try appendU16(allocator, out, 44);
  25 
  26     try appendU16(allocator, out, 1);
  27     try appendTag(allocator, out, "DFLT");
  28     try appendU16(allocator, out, 8);
  29 
  30     try appendU16(allocator, out, 4);
  31     try appendU16(allocator, out, 0);
  32 
  33     try appendU16(allocator, out, 0);
  34     try appendU16(allocator, out, 0xffff);
  35     try appendU16(allocator, out, 1);
  36     try appendU16(allocator, out, 0);
  37 
  38     try appendU16(allocator, out, 1);
  39     try appendTag(allocator, out, "dist");
  40     try appendU16(allocator, out, 8);
  41 
  42     try appendU16(allocator, out, 0);
  43     try appendU16(allocator, out, 1);
  44     try appendU16(allocator, out, 0);
  45 
  46     try appendU16(allocator, out, 1);
  47     try appendU16(allocator, out, 4);
  48 
  49     try appendU16(allocator, out, 1);
  50     try appendU16(allocator, out, 0);
  51     try appendU16(allocator, out, 1);
  52     try appendU16(allocator, out, 8);
  53 
  54     try appendU16(allocator, out, 2);
  55     try appendU16(allocator, out, 20);
  56     try appendU16(allocator, out, 0x0007);
  57     try appendU16(allocator, out, 2);
  58     try appendI16(allocator, out, 20);
  59     try appendI16(allocator, out, 30);
  60     try appendI16(allocator, out, -40);
  61     try appendI16(allocator, out, -10);
  62     try appendI16(allocator, out, 0);
  63     try appendI16(allocator, out, 0);
  64 
  65     try appendU16(allocator, out, 1);
  66     try appendU16(allocator, out, 2);
  67     try appendU16(allocator, out, 'A' - 31);
  68     try appendU16(allocator, out, 'B' - 31);
  69 }
  70 
  71 pub fn appendGposFeatureVariations(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
  72     const header = out.items.len;
  73     try appendU16(allocator, out, 1);
  74     try appendU16(allocator, out, 1);
  75     try appendU16(allocator, out, 0);
  76     try appendU16(allocator, out, 0);
  77     try appendU16(allocator, out, 0);
  78     try appendU32(allocator, out, 0);
  79 
  80     const script_list = out.items.len;
  81     writeU16(out.items, header + 4, @intCast(script_list - header));
  82     try appendLayoutScriptList(allocator, out);
  83 
  84     const feature_list = out.items.len;
  85     writeU16(out.items, header + 6, @intCast(feature_list - header));
  86     try appendLayoutFeatureList(allocator, out, "kern", 0);
  87 
  88     const lookup_list = out.items.len;
  89     writeU16(out.items, header + 8, @intCast(lookup_list - header));
  90     try appendU16(allocator, out, 2);
  91     const first_lookup_offset = out.items.len;
  92     try appendU16(allocator, out, 0);
  93     const second_lookup_offset = out.items.len;
  94     try appendU16(allocator, out, 0);
  95     writeU16(out.items, first_lookup_offset, @intCast(out.items.len - lookup_list));
  96     try appendGposSingleLookup(allocator, out, -40);
  97     writeU16(out.items, second_lookup_offset, @intCast(out.items.len - lookup_list));
  98     try appendGposSingleLookup(allocator, out, -120);
  99 
 100     const feature_variations = out.items.len;
 101     writeU32(out.items, header + 10, @intCast(feature_variations - header));
 102     try appendLayoutFeatureVariations(allocator, out, feature_variations, 1);
 103 }
 104 
 105 pub fn appendGposSingleLookup(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8), x_advance: i16) !void {
 106     try appendU16(allocator, out, 1);
 107     try appendU16(allocator, out, 0);
 108     try appendU16(allocator, out, 1);
 109     try appendU16(allocator, out, 8);
 110     try appendU16(allocator, out, 1);
 111     try appendU16(allocator, out, 8);
 112     try appendU16(allocator, out, 0x0004);
 113     try appendI16(allocator, out, x_advance);
 114     try appendU16(allocator, out, 1);
 115     try appendU16(allocator, out, 1);
 116     try appendU16(allocator, out, 'A' - 31);
 117 }
 118 
 119 pub fn appendGposSingleVariationAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
 120     try appendU16(allocator, out, 1);
 121     try appendU16(allocator, out, 0);
 122     try appendU16(allocator, out, 10);
 123     try appendU16(allocator, out, 30);
 124     try appendU16(allocator, out, 44);
 125 
 126     try appendU16(allocator, out, 1);
 127     try appendTag(allocator, out, "DFLT");
 128     try appendU16(allocator, out, 8);
 129 
 130     try appendU16(allocator, out, 4);
 131     try appendU16(allocator, out, 0);
 132 
 133     try appendU16(allocator, out, 0);
 134     try appendU16(allocator, out, 0xffff);
 135     try appendU16(allocator, out, 1);
 136     try appendU16(allocator, out, 0);
 137 
 138     try appendU16(allocator, out, 1);
 139     try appendTag(allocator, out, "dist");
 140     try appendU16(allocator, out, 8);
 141 
 142     try appendU16(allocator, out, 0);
 143     try appendU16(allocator, out, 1);
 144     try appendU16(allocator, out, 0);
 145 
 146     try appendU16(allocator, out, 1);
 147     try appendU16(allocator, out, 4);
 148 
 149     try appendU16(allocator, out, 1);
 150     try appendU16(allocator, out, 0);
 151     try appendU16(allocator, out, 1);
 152     try appendU16(allocator, out, 8);
 153 
 154     try appendU16(allocator, out, 2);
 155     try appendU16(allocator, out, 12);
 156     try appendU16(allocator, out, 0x0011);
 157     try appendU16(allocator, out, 1);
 158     try appendI16(allocator, out, 20);
 159     try appendU16(allocator, out, 18);
 160 
 161     try appendU16(allocator, out, 1);
 162     try appendU16(allocator, out, 1);
 163     try appendU16(allocator, out, 'A' - 31);
 164 
 165     try appendU16(allocator, out, 0);
 166     try appendU16(allocator, out, 0);
 167     try appendU16(allocator, out, 0x8000);
 168 }
 169 
 170 pub fn appendGposContextualSingleAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
 171     try appendU16(allocator, out, 1);
 172     try appendU16(allocator, out, 0);
 173     try appendU16(allocator, out, 10);
 174     try appendU16(allocator, out, 30);
 175     try appendU16(allocator, out, 44);
 176 
 177     try appendU16(allocator, out, 1);
 178     try appendTag(allocator, out, "DFLT");
 179     try appendU16(allocator, out, 8);
 180 
 181     try appendU16(allocator, out, 4);
 182     try appendU16(allocator, out, 0);
 183 
 184     try appendU16(allocator, out, 0);
 185     try appendU16(allocator, out, 0xffff);
 186     try appendU16(allocator, out, 1);
 187     try appendU16(allocator, out, 0);
 188 
 189     try appendU16(allocator, out, 1);
 190     try appendTag(allocator, out, "dist");
 191     try appendU16(allocator, out, 8);
 192 
 193     try appendU16(allocator, out, 0);
 194     try appendU16(allocator, out, 1);
 195     try appendU16(allocator, out, 0);
 196 
 197     try appendU16(allocator, out, 2);
 198     try appendU16(allocator, out, 6);
 199     try appendU16(allocator, out, 48);
 200 
 201     try appendU16(allocator, out, 7);
 202     try appendU16(allocator, out, 0);
 203     try appendU16(allocator, out, 1);
 204     try appendU16(allocator, out, 8);
 205 
 206     try appendU16(allocator, out, 3);
 207     try appendU16(allocator, out, 3);
 208     try appendU16(allocator, out, 1);
 209     try appendU16(allocator, out, 16);
 210     try appendU16(allocator, out, 22);
 211     try appendU16(allocator, out, 28);
 212     try appendU16(allocator, out, 1);
 213     try appendU16(allocator, out, 1);
 214 
 215     try appendU16(allocator, out, 1);
 216     try appendU16(allocator, out, 1);
 217     try appendU16(allocator, out, 'A' - 31);
 218 
 219     try appendU16(allocator, out, 1);
 220     try appendU16(allocator, out, 1);
 221     try appendU16(allocator, out, 'B' - 31);
 222 
 223     try appendU16(allocator, out, 1);
 224     try appendU16(allocator, out, 1);
 225     try appendU16(allocator, out, 'C' - 31);
 226 
 227     try appendU16(allocator, out, 1);
 228     try appendU16(allocator, out, 0);
 229     try appendU16(allocator, out, 1);
 230     try appendU16(allocator, out, 8);
 231 
 232     try appendU16(allocator, out, 1);
 233     try appendU16(allocator, out, 10);
 234     try appendU16(allocator, out, 0x0005);
 235     try appendI16(allocator, out, 50);
 236     try appendI16(allocator, out, -100);
 237 
 238     try appendU16(allocator, out, 1);
 239     try appendU16(allocator, out, 1);
 240     try appendU16(allocator, out, 'B' - 31);
 241 }
 242 
 243 pub fn appendGposSimpleContextualSingleAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
 244     try appendU16(allocator, out, 1);
 245     try appendU16(allocator, out, 0);
 246     try appendU16(allocator, out, 10);
 247     try appendU16(allocator, out, 30);
 248     try appendU16(allocator, out, 44);
 249 
 250     try appendU16(allocator, out, 1);
 251     try appendTag(allocator, out, "DFLT");
 252     try appendU16(allocator, out, 8);
 253 
 254     try appendU16(allocator, out, 4);
 255     try appendU16(allocator, out, 0);
 256 
 257     try appendU16(allocator, out, 0);
 258     try appendU16(allocator, out, 0xffff);
 259     try appendU16(allocator, out, 1);
 260     try appendU16(allocator, out, 0);
 261 
 262     try appendU16(allocator, out, 1);
 263     try appendTag(allocator, out, "dist");
 264     try appendU16(allocator, out, 8);
 265 
 266     try appendU16(allocator, out, 0);
 267     try appendU16(allocator, out, 1);
 268     try appendU16(allocator, out, 0);
 269 
 270     try appendU16(allocator, out, 2);
 271     try appendU16(allocator, out, 6);
 272     try appendU16(allocator, out, 44);
 273 
 274     try appendU16(allocator, out, 7);
 275     try appendU16(allocator, out, 0);
 276     try appendU16(allocator, out, 1);
 277     try appendU16(allocator, out, 8);
 278 
 279     try appendU16(allocator, out, 1);
 280     try appendU16(allocator, out, 8);
 281     try appendU16(allocator, out, 1);
 282     try appendU16(allocator, out, 14);
 283 
 284     try appendU16(allocator, out, 1);
 285     try appendU16(allocator, out, 1);
 286     try appendU16(allocator, out, 'A' - 31);
 287 
 288     try appendU16(allocator, out, 1);
 289     try appendU16(allocator, out, 4);
 290 
 291     try appendU16(allocator, out, 3);
 292     try appendU16(allocator, out, 1);
 293     try appendU16(allocator, out, 'B' - 31);
 294     try appendU16(allocator, out, 'C' - 31);
 295     try appendU16(allocator, out, 1);
 296     try appendU16(allocator, out, 1);
 297 
 298     try appendU16(allocator, out, 1);
 299     try appendU16(allocator, out, 0);
 300     try appendU16(allocator, out, 1);
 301     try appendU16(allocator, out, 8);
 302 
 303     try appendU16(allocator, out, 1);
 304     try appendU16(allocator, out, 10);
 305     try appendU16(allocator, out, 0x0005);
 306     try appendI16(allocator, out, 50);
 307     try appendI16(allocator, out, -100);
 308 
 309     try appendU16(allocator, out, 1);
 310     try appendU16(allocator, out, 1);
 311     try appendU16(allocator, out, 'B' - 31);
 312 }
 313 
 314 pub fn appendGposClassContextualSingleAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
 315     try appendU16(allocator, out, 1);
 316     try appendU16(allocator, out, 0);
 317     try appendU16(allocator, out, 10);
 318     try appendU16(allocator, out, 30);
 319     try appendU16(allocator, out, 44);
 320 
 321     try appendU16(allocator, out, 1);
 322     try appendTag(allocator, out, "DFLT");
 323     try appendU16(allocator, out, 8);
 324 
 325     try appendU16(allocator, out, 4);
 326     try appendU16(allocator, out, 0);
 327 
 328     try appendU16(allocator, out, 0);
 329     try appendU16(allocator, out, 0xffff);
 330     try appendU16(allocator, out, 1);
 331     try appendU16(allocator, out, 0);
 332 
 333     try appendU16(allocator, out, 1);
 334     try appendTag(allocator, out, "dist");
 335     try appendU16(allocator, out, 8);
 336 
 337     try appendU16(allocator, out, 0);
 338     try appendU16(allocator, out, 1);
 339     try appendU16(allocator, out, 0);
 340 
 341     try appendU16(allocator, out, 2);
 342     try appendU16(allocator, out, 6);
 343     try appendU16(allocator, out, 64);
 344 
 345     try appendU16(allocator, out, 7);
 346     try appendU16(allocator, out, 0);
 347     try appendU16(allocator, out, 1);
 348     try appendU16(allocator, out, 8);
 349 
 350     try appendU16(allocator, out, 2);
 351     try appendU16(allocator, out, 16);
 352     try appendU16(allocator, out, 22);
 353     try appendU16(allocator, out, 4);
 354     try appendU16(allocator, out, 0);
 355     try appendU16(allocator, out, 34);
 356     try appendU16(allocator, out, 0);
 357     try appendU16(allocator, out, 0);
 358 
 359     try appendU16(allocator, out, 1);
 360     try appendU16(allocator, out, 1);
 361     try appendU16(allocator, out, 'A' - 31);
 362 
 363     try appendU16(allocator, out, 1);
 364     try appendU16(allocator, out, 'A' - 31);
 365     try appendU16(allocator, out, 3);
 366     try appendU16(allocator, out, 1);
 367     try appendU16(allocator, out, 2);
 368     try appendU16(allocator, out, 3);
 369 
 370     try appendU16(allocator, out, 1);
 371     try appendU16(allocator, out, 4);
 372 
 373     try appendU16(allocator, out, 3);
 374     try appendU16(allocator, out, 1);
 375     try appendU16(allocator, out, 2);
 376     try appendU16(allocator, out, 3);
 377     try appendU16(allocator, out, 1);
 378     try appendU16(allocator, out, 1);
 379 
 380     try appendU16(allocator, out, 1);
 381     try appendU16(allocator, out, 0);
 382     try appendU16(allocator, out, 1);
 383     try appendU16(allocator, out, 8);
 384 
 385     try appendU16(allocator, out, 1);
 386     try appendU16(allocator, out, 10);
 387     try appendU16(allocator, out, 0x0005);
 388     try appendI16(allocator, out, 50);
 389     try appendI16(allocator, out, -100);
 390 
 391     try appendU16(allocator, out, 1);
 392     try appendU16(allocator, out, 1);
 393     try appendU16(allocator, out, 'B' - 31);
 394 }
 395 
 396 pub fn appendGposChainedContextualSingleAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
 397     try appendU16(allocator, out, 1);
 398     try appendU16(allocator, out, 0);
 399     try appendU16(allocator, out, 10);
 400     try appendU16(allocator, out, 30);
 401     try appendU16(allocator, out, 44);
 402 
 403     try appendU16(allocator, out, 1);
 404     try appendTag(allocator, out, "DFLT");
 405     try appendU16(allocator, out, 8);
 406 
 407     try appendU16(allocator, out, 4);
 408     try appendU16(allocator, out, 0);
 409 
 410     try appendU16(allocator, out, 0);
 411     try appendU16(allocator, out, 0xffff);
 412     try appendU16(allocator, out, 1);
 413     try appendU16(allocator, out, 0);
 414 
 415     try appendU16(allocator, out, 1);
 416     try appendTag(allocator, out, "dist");
 417     try appendU16(allocator, out, 8);
 418 
 419     try appendU16(allocator, out, 0);
 420     try appendU16(allocator, out, 1);
 421     try appendU16(allocator, out, 0);
 422 
 423     try appendU16(allocator, out, 2);
 424     try appendU16(allocator, out, 6);
 425     try appendU16(allocator, out, 60);
 426 
 427     try appendU16(allocator, out, 8);
 428     try appendU16(allocator, out, 0);
 429     try appendU16(allocator, out, 1);
 430     try appendU16(allocator, out, 8);
 431 
 432     try appendU16(allocator, out, 3);
 433     try appendU16(allocator, out, 1);
 434     try appendU16(allocator, out, 22);
 435     try appendU16(allocator, out, 2);
 436     try appendU16(allocator, out, 28);
 437     try appendU16(allocator, out, 34);
 438     try appendU16(allocator, out, 1);
 439     try appendU16(allocator, out, 40);
 440     try appendU16(allocator, out, 1);
 441     try appendU16(allocator, out, 0);
 442     try appendU16(allocator, out, 1);
 443 
 444     try appendU16(allocator, out, 1);
 445     try appendU16(allocator, out, 1);
 446     try appendU16(allocator, out, 'A' - 31);
 447 
 448     try appendU16(allocator, out, 1);
 449     try appendU16(allocator, out, 1);
 450     try appendU16(allocator, out, 'B' - 31);
 451 
 452     try appendU16(allocator, out, 1);
 453     try appendU16(allocator, out, 1);
 454     try appendU16(allocator, out, 'C' - 31);
 455 
 456     try appendU16(allocator, out, 1);
 457     try appendU16(allocator, out, 1);
 458     try appendU16(allocator, out, '!' - 31);
 459 
 460     try appendU16(allocator, out, 1);
 461     try appendU16(allocator, out, 0);
 462     try appendU16(allocator, out, 1);
 463     try appendU16(allocator, out, 8);
 464 
 465     try appendU16(allocator, out, 1);
 466     try appendU16(allocator, out, 10);
 467     try appendU16(allocator, out, 0x0005);
 468     try appendI16(allocator, out, 75);
 469     try appendI16(allocator, out, -125);
 470 
 471     try appendU16(allocator, out, 1);
 472     try appendU16(allocator, out, 1);
 473     try appendU16(allocator, out, 'B' - 31);
 474 }
 475 
 476 pub fn appendGposChainedSimpleContextualSingleAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
 477     try appendU16(allocator, out, 1);
 478     try appendU16(allocator, out, 0);
 479     try appendU16(allocator, out, 10);
 480     try appendU16(allocator, out, 30);
 481     try appendU16(allocator, out, 44);
 482 
 483     try appendU16(allocator, out, 1);
 484     try appendTag(allocator, out, "DFLT");
 485     try appendU16(allocator, out, 8);
 486 
 487     try appendU16(allocator, out, 4);
 488     try appendU16(allocator, out, 0);
 489 
 490     try appendU16(allocator, out, 0);
 491     try appendU16(allocator, out, 0xffff);
 492     try appendU16(allocator, out, 1);
 493     try appendU16(allocator, out, 0);
 494 
 495     try appendU16(allocator, out, 1);
 496     try appendTag(allocator, out, "dist");
 497     try appendU16(allocator, out, 8);
 498 
 499     try appendU16(allocator, out, 0);
 500     try appendU16(allocator, out, 1);
 501     try appendU16(allocator, out, 0);
 502 
 503     try appendU16(allocator, out, 2);
 504     try appendU16(allocator, out, 6);
 505     try appendU16(allocator, out, 48);
 506 
 507     try appendU16(allocator, out, 8);
 508     try appendU16(allocator, out, 0);
 509     try appendU16(allocator, out, 1);
 510     try appendU16(allocator, out, 8);
 511 
 512     try appendU16(allocator, out, 1);
 513     try appendU16(allocator, out, 8);
 514     try appendU16(allocator, out, 1);
 515     try appendU16(allocator, out, 14);
 516 
 517     try appendU16(allocator, out, 1);
 518     try appendU16(allocator, out, 1);
 519     try appendU16(allocator, out, 'B' - 31);
 520 
 521     try appendU16(allocator, out, 1);
 522     try appendU16(allocator, out, 4);
 523 
 524     try appendU16(allocator, out, 1);
 525     try appendU16(allocator, out, 'A' - 31);
 526     try appendU16(allocator, out, 1);
 527     try appendU16(allocator, out, 1);
 528     try appendU16(allocator, out, 'C' - 31);
 529     try appendU16(allocator, out, 1);
 530     try appendU16(allocator, out, 0);
 531     try appendU16(allocator, out, 1);
 532 
 533     try appendU16(allocator, out, 1);
 534     try appendU16(allocator, out, 0);
 535     try appendU16(allocator, out, 1);
 536     try appendU16(allocator, out, 8);
 537 
 538     try appendU16(allocator, out, 1);
 539     try appendU16(allocator, out, 10);
 540     try appendU16(allocator, out, 0x0005);
 541     try appendI16(allocator, out, 75);
 542     try appendI16(allocator, out, -125);
 543 
 544     try appendU16(allocator, out, 1);
 545     try appendU16(allocator, out, 1);
 546     try appendU16(allocator, out, 'B' - 31);
 547 }
 548 
 549 pub fn appendGposChainedClassContextualSingleAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
 550     try appendU16(allocator, out, 1);
 551     try appendU16(allocator, out, 0);
 552     try appendU16(allocator, out, 10);
 553     try appendU16(allocator, out, 30);
 554     try appendU16(allocator, out, 44);
 555 
 556     try appendU16(allocator, out, 1);
 557     try appendTag(allocator, out, "DFLT");
 558     try appendU16(allocator, out, 8);
 559 
 560     try appendU16(allocator, out, 4);
 561     try appendU16(allocator, out, 0);
 562 
 563     try appendU16(allocator, out, 0);
 564     try appendU16(allocator, out, 0xffff);
 565     try appendU16(allocator, out, 1);
 566     try appendU16(allocator, out, 0);
 567 
 568     try appendU16(allocator, out, 1);
 569     try appendTag(allocator, out, "dist");
 570     try appendU16(allocator, out, 8);
 571 
 572     try appendU16(allocator, out, 0);
 573     try appendU16(allocator, out, 1);
 574     try appendU16(allocator, out, 0);
 575 
 576     try appendU16(allocator, out, 2);
 577     try appendU16(allocator, out, 6);
 578     try appendU16(allocator, out, 82);
 579 
 580     try appendU16(allocator, out, 8);
 581     try appendU16(allocator, out, 0);
 582     try appendU16(allocator, out, 1);
 583     try appendU16(allocator, out, 8);
 584 
 585     try appendU16(allocator, out, 2);
 586     try appendU16(allocator, out, 18);
 587     try appendU16(allocator, out, 24);
 588     try appendU16(allocator, out, 32);
 589     try appendU16(allocator, out, 40);
 590     try appendU16(allocator, out, 3);
 591     try appendU16(allocator, out, 0);
 592     try appendU16(allocator, out, 0);
 593     try appendU16(allocator, out, 48);
 594 
 595     try appendU16(allocator, out, 1);
 596     try appendU16(allocator, out, 1);
 597     try appendU16(allocator, out, 'B' - 31);
 598 
 599     try appendU16(allocator, out, 1);
 600     try appendU16(allocator, out, 'A' - 31);
 601     try appendU16(allocator, out, 1);
 602     try appendU16(allocator, out, 1);
 603 
 604     try appendU16(allocator, out, 1);
 605     try appendU16(allocator, out, 'B' - 31);
 606     try appendU16(allocator, out, 1);
 607     try appendU16(allocator, out, 2);
 608 
 609     try appendU16(allocator, out, 1);
 610     try appendU16(allocator, out, 'C' - 31);
 611     try appendU16(allocator, out, 1);
 612     try appendU16(allocator, out, 3);
 613 
 614     try appendU16(allocator, out, 1);
 615     try appendU16(allocator, out, 4);
 616 
 617     try appendU16(allocator, out, 1);
 618     try appendU16(allocator, out, 1);
 619     try appendU16(allocator, out, 1);
 620     try appendU16(allocator, out, 1);
 621     try appendU16(allocator, out, 3);
 622     try appendU16(allocator, out, 1);
 623     try appendU16(allocator, out, 0);
 624     try appendU16(allocator, out, 1);
 625 
 626     try appendU16(allocator, out, 1);
 627     try appendU16(allocator, out, 0);
 628     try appendU16(allocator, out, 1);
 629     try appendU16(allocator, out, 8);
 630 
 631     try appendU16(allocator, out, 1);
 632     try appendU16(allocator, out, 10);
 633     try appendU16(allocator, out, 0x0005);
 634     try appendI16(allocator, out, 75);
 635     try appendI16(allocator, out, -125);
 636 
 637     try appendU16(allocator, out, 1);
 638     try appendU16(allocator, out, 1);
 639     try appendU16(allocator, out, 'B' - 31);
 640 }
 641 
 642 pub fn appendGposContextualPairAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
 643     try appendU16(allocator, out, 1);
 644     try appendU16(allocator, out, 0);
 645     try appendU16(allocator, out, 10);
 646     try appendU16(allocator, out, 30);
 647     try appendU16(allocator, out, 44);
 648 
 649     try appendU16(allocator, out, 1);
 650     try appendTag(allocator, out, "DFLT");
 651     try appendU16(allocator, out, 8);
 652 
 653     try appendU16(allocator, out, 4);
 654     try appendU16(allocator, out, 0);
 655 
 656     try appendU16(allocator, out, 0);
 657     try appendU16(allocator, out, 0xffff);
 658     try appendU16(allocator, out, 1);
 659     try appendU16(allocator, out, 0);
 660 
 661     try appendU16(allocator, out, 1);
 662     try appendTag(allocator, out, "kern");
 663     try appendU16(allocator, out, 8);
 664 
 665     try appendU16(allocator, out, 0);
 666     try appendU16(allocator, out, 1);
 667     try appendU16(allocator, out, 0);
 668 
 669     try appendU16(allocator, out, 2);
 670     try appendU16(allocator, out, 6);
 671     try appendU16(allocator, out, 48);
 672 
 673     try appendU16(allocator, out, 7);
 674     try appendU16(allocator, out, 0);
 675     try appendU16(allocator, out, 1);
 676     try appendU16(allocator, out, 8);
 677 
 678     try appendU16(allocator, out, 3);
 679     try appendU16(allocator, out, 3);
 680     try appendU16(allocator, out, 1);
 681     try appendU16(allocator, out, 16);
 682     try appendU16(allocator, out, 22);
 683     try appendU16(allocator, out, 28);
 684     try appendU16(allocator, out, 0);
 685     try appendU16(allocator, out, 1);
 686 
 687     try appendU16(allocator, out, 1);
 688     try appendU16(allocator, out, 1);
 689     try appendU16(allocator, out, 'A' - 31);
 690 
 691     try appendU16(allocator, out, 1);
 692     try appendU16(allocator, out, 1);
 693     try appendU16(allocator, out, 'V' - 31);
 694 
 695     try appendU16(allocator, out, 1);
 696     try appendU16(allocator, out, 1);
 697     try appendU16(allocator, out, 'C' - 31);
 698 
 699     try appendU16(allocator, out, 2);
 700     try appendU16(allocator, out, 0);
 701     try appendU16(allocator, out, 1);
 702     try appendU16(allocator, out, 8);
 703 
 704     try appendU16(allocator, out, 1);
 705     try appendU16(allocator, out, 18);
 706     try appendU16(allocator, out, 0x0004);
 707     try appendU16(allocator, out, 0);
 708     try appendU16(allocator, out, 1);
 709     try appendU16(allocator, out, 12);
 710 
 711     try appendU16(allocator, out, 1);
 712     try appendU16(allocator, out, 'V' - 31);
 713     try appendI16(allocator, out, -100);
 714 
 715     try appendU16(allocator, out, 1);
 716     try appendU16(allocator, out, 1);
 717     try appendU16(allocator, out, 'A' - 31);
 718 }
 719 
 720 pub fn appendGposSimpleContextualPairAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
 721     try appendU16(allocator, out, 1);
 722     try appendU16(allocator, out, 0);
 723     try appendU16(allocator, out, 10);
 724     try appendU16(allocator, out, 30);
 725     try appendU16(allocator, out, 44);
 726 
 727     try appendU16(allocator, out, 1);
 728     try appendTag(allocator, out, "DFLT");
 729     try appendU16(allocator, out, 8);
 730 
 731     try appendU16(allocator, out, 4);
 732     try appendU16(allocator, out, 0);
 733 
 734     try appendU16(allocator, out, 0);
 735     try appendU16(allocator, out, 0xffff);
 736     try appendU16(allocator, out, 1);
 737     try appendU16(allocator, out, 0);
 738 
 739     try appendU16(allocator, out, 1);
 740     try appendTag(allocator, out, "kern");
 741     try appendU16(allocator, out, 8);
 742 
 743     try appendU16(allocator, out, 0);
 744     try appendU16(allocator, out, 1);
 745     try appendU16(allocator, out, 0);
 746 
 747     try appendU16(allocator, out, 2);
 748     try appendU16(allocator, out, 6);
 749     try appendU16(allocator, out, 44);
 750 
 751     try appendU16(allocator, out, 7);
 752     try appendU16(allocator, out, 0);
 753     try appendU16(allocator, out, 1);
 754     try appendU16(allocator, out, 8);
 755 
 756     try appendU16(allocator, out, 1);
 757     try appendU16(allocator, out, 8);
 758     try appendU16(allocator, out, 1);
 759     try appendU16(allocator, out, 14);
 760 
 761     try appendU16(allocator, out, 1);
 762     try appendU16(allocator, out, 1);
 763     try appendU16(allocator, out, 'A' - 31);
 764 
 765     try appendU16(allocator, out, 1);
 766     try appendU16(allocator, out, 4);
 767 
 768     try appendU16(allocator, out, 3);
 769     try appendU16(allocator, out, 1);
 770     try appendU16(allocator, out, 'V' - 31);
 771     try appendU16(allocator, out, 'C' - 31);
 772     try appendU16(allocator, out, 0);
 773     try appendU16(allocator, out, 1);
 774 
 775     try appendU16(allocator, out, 2);
 776     try appendU16(allocator, out, 0);
 777     try appendU16(allocator, out, 1);
 778     try appendU16(allocator, out, 8);
 779 
 780     try appendU16(allocator, out, 1);
 781     try appendU16(allocator, out, 18);
 782     try appendU16(allocator, out, 0x0004);
 783     try appendU16(allocator, out, 0);
 784     try appendU16(allocator, out, 1);
 785     try appendU16(allocator, out, 12);
 786 
 787     try appendU16(allocator, out, 1);
 788     try appendU16(allocator, out, 'V' - 31);
 789     try appendI16(allocator, out, -100);
 790 
 791     try appendU16(allocator, out, 1);
 792     try appendU16(allocator, out, 1);
 793     try appendU16(allocator, out, 'A' - 31);
 794 }
 795 
 796 pub fn appendGposClassContextualPairAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
 797     try appendU16(allocator, out, 1);
 798     try appendU16(allocator, out, 0);
 799     try appendU16(allocator, out, 10);
 800     try appendU16(allocator, out, 30);
 801     try appendU16(allocator, out, 44);
 802 
 803     try appendU16(allocator, out, 1);
 804     try appendTag(allocator, out, "DFLT");
 805     try appendU16(allocator, out, 8);
 806 
 807     try appendU16(allocator, out, 4);
 808     try appendU16(allocator, out, 0);
 809 
 810     try appendU16(allocator, out, 0);
 811     try appendU16(allocator, out, 0xffff);
 812     try appendU16(allocator, out, 1);
 813     try appendU16(allocator, out, 0);
 814 
 815     try appendU16(allocator, out, 1);
 816     try appendTag(allocator, out, "kern");
 817     try appendU16(allocator, out, 8);
 818 
 819     try appendU16(allocator, out, 0);
 820     try appendU16(allocator, out, 1);
 821     try appendU16(allocator, out, 0);
 822 
 823     try appendU16(allocator, out, 2);
 824     try appendU16(allocator, out, 6);
 825     try appendU16(allocator, out, 64);
 826 
 827     try appendU16(allocator, out, 7);
 828     try appendU16(allocator, out, 0);
 829     try appendU16(allocator, out, 1);
 830     try appendU16(allocator, out, 8);
 831 
 832     try appendU16(allocator, out, 2);
 833     try appendU16(allocator, out, 16);
 834     try appendU16(allocator, out, 22);
 835     try appendU16(allocator, out, 4);
 836     try appendU16(allocator, out, 0);
 837     try appendU16(allocator, out, 34);
 838     try appendU16(allocator, out, 0);
 839     try appendU16(allocator, out, 0);
 840 
 841     try appendU16(allocator, out, 1);
 842     try appendU16(allocator, out, 1);
 843     try appendU16(allocator, out, 'A' - 31);
 844 
 845     try appendU16(allocator, out, 1);
 846     try appendU16(allocator, out, 'A' - 31);
 847     try appendU16(allocator, out, 3);
 848     try appendU16(allocator, out, 1);
 849     try appendU16(allocator, out, 2);
 850     try appendU16(allocator, out, 3);
 851 
 852     try appendU16(allocator, out, 1);
 853     try appendU16(allocator, out, 4);
 854 
 855     try appendU16(allocator, out, 3);
 856     try appendU16(allocator, out, 1);
 857     try appendU16(allocator, out, 2);
 858     try appendU16(allocator, out, 3);
 859     try appendU16(allocator, out, 0);
 860     try appendU16(allocator, out, 1);
 861 
 862     try appendU16(allocator, out, 2);
 863     try appendU16(allocator, out, 0);
 864     try appendU16(allocator, out, 1);
 865     try appendU16(allocator, out, 8);
 866 
 867     try appendU16(allocator, out, 1);
 868     try appendU16(allocator, out, 18);
 869     try appendU16(allocator, out, 0x0004);
 870     try appendU16(allocator, out, 0);
 871     try appendU16(allocator, out, 1);
 872     try appendU16(allocator, out, 12);
 873 
 874     try appendU16(allocator, out, 1);
 875     try appendU16(allocator, out, 'B' - 31);
 876     try appendI16(allocator, out, -100);
 877 
 878     try appendU16(allocator, out, 1);
 879     try appendU16(allocator, out, 1);
 880     try appendU16(allocator, out, 'A' - 31);
 881 }
 882 
 883 pub fn appendGposChainedContextualPairAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
 884     try appendU16(allocator, out, 1);
 885     try appendU16(allocator, out, 0);
 886     try appendU16(allocator, out, 10);
 887     try appendU16(allocator, out, 30);
 888     try appendU16(allocator, out, 44);
 889 
 890     try appendU16(allocator, out, 1);
 891     try appendTag(allocator, out, "DFLT");
 892     try appendU16(allocator, out, 8);
 893 
 894     try appendU16(allocator, out, 4);
 895     try appendU16(allocator, out, 0);
 896 
 897     try appendU16(allocator, out, 0);
 898     try appendU16(allocator, out, 0xffff);
 899     try appendU16(allocator, out, 1);
 900     try appendU16(allocator, out, 0);
 901 
 902     try appendU16(allocator, out, 1);
 903     try appendTag(allocator, out, "kern");
 904     try appendU16(allocator, out, 8);
 905 
 906     try appendU16(allocator, out, 0);
 907     try appendU16(allocator, out, 1);
 908     try appendU16(allocator, out, 0);
 909 
 910     try appendU16(allocator, out, 2);
 911     try appendU16(allocator, out, 6);
 912     try appendU16(allocator, out, 60);
 913 
 914     try appendU16(allocator, out, 8);
 915     try appendU16(allocator, out, 0);
 916     try appendU16(allocator, out, 1);
 917     try appendU16(allocator, out, 8);
 918 
 919     try appendU16(allocator, out, 3);
 920     try appendU16(allocator, out, 1);
 921     try appendU16(allocator, out, 22);
 922     try appendU16(allocator, out, 2);
 923     try appendU16(allocator, out, 28);
 924     try appendU16(allocator, out, 34);
 925     try appendU16(allocator, out, 1);
 926     try appendU16(allocator, out, 40);
 927     try appendU16(allocator, out, 1);
 928     try appendU16(allocator, out, 0);
 929     try appendU16(allocator, out, 1);
 930 
 931     try appendU16(allocator, out, 1);
 932     try appendU16(allocator, out, 1);
 933     try appendU16(allocator, out, 'A' - 31);
 934 
 935     try appendU16(allocator, out, 1);
 936     try appendU16(allocator, out, 1);
 937     try appendU16(allocator, out, 'V' - 31);
 938 
 939     try appendU16(allocator, out, 1);
 940     try appendU16(allocator, out, 1);
 941     try appendU16(allocator, out, 'C' - 31);
 942 
 943     try appendU16(allocator, out, 1);
 944     try appendU16(allocator, out, 1);
 945     try appendU16(allocator, out, '!' - 31);
 946 
 947     try appendU16(allocator, out, 2);
 948     try appendU16(allocator, out, 0);
 949     try appendU16(allocator, out, 1);
 950     try appendU16(allocator, out, 8);
 951 
 952     try appendU16(allocator, out, 1);
 953     try appendU16(allocator, out, 18);
 954     try appendU16(allocator, out, 0x0004);
 955     try appendU16(allocator, out, 0);
 956     try appendU16(allocator, out, 1);
 957     try appendU16(allocator, out, 12);
 958 
 959     try appendU16(allocator, out, 1);
 960     try appendU16(allocator, out, 'C' - 31);
 961     try appendI16(allocator, out, -100);
 962 
 963     try appendU16(allocator, out, 1);
 964     try appendU16(allocator, out, 1);
 965     try appendU16(allocator, out, 'V' - 31);
 966 }
 967 
 968 pub fn appendGposChainedSimpleContextualPairAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
 969     try appendU16(allocator, out, 1);
 970     try appendU16(allocator, out, 0);
 971     try appendU16(allocator, out, 10);
 972     try appendU16(allocator, out, 30);
 973     try appendU16(allocator, out, 44);
 974 
 975     try appendU16(allocator, out, 1);
 976     try appendTag(allocator, out, "DFLT");
 977     try appendU16(allocator, out, 8);
 978 
 979     try appendU16(allocator, out, 4);
 980     try appendU16(allocator, out, 0);
 981 
 982     try appendU16(allocator, out, 0);
 983     try appendU16(allocator, out, 0xffff);
 984     try appendU16(allocator, out, 1);
 985     try appendU16(allocator, out, 0);
 986 
 987     try appendU16(allocator, out, 1);
 988     try appendTag(allocator, out, "kern");
 989     try appendU16(allocator, out, 8);
 990 
 991     try appendU16(allocator, out, 0);
 992     try appendU16(allocator, out, 1);
 993     try appendU16(allocator, out, 0);
 994 
 995     try appendU16(allocator, out, 2);
 996     try appendU16(allocator, out, 6);
 997     try appendU16(allocator, out, 48);
 998 
 999     try appendU16(allocator, out, 8);
1000     try appendU16(allocator, out, 0);
1001     try appendU16(allocator, out, 1);
1002     try appendU16(allocator, out, 8);
1003 
1004     try appendU16(allocator, out, 1);
1005     try appendU16(allocator, out, 8);
1006     try appendU16(allocator, out, 1);
1007     try appendU16(allocator, out, 14);
1008 
1009     try appendU16(allocator, out, 1);
1010     try appendU16(allocator, out, 1);
1011     try appendU16(allocator, out, 'B' - 31);
1012 
1013     try appendU16(allocator, out, 1);
1014     try appendU16(allocator, out, 4);
1015 
1016     try appendU16(allocator, out, 1);
1017     try appendU16(allocator, out, 'A' - 31);
1018     try appendU16(allocator, out, 2);
1019     try appendU16(allocator, out, 'C' - 31);
1020     try appendU16(allocator, out, 0);
1021     try appendU16(allocator, out, 1);
1022     try appendU16(allocator, out, 0);
1023     try appendU16(allocator, out, 1);
1024 
1025     try appendU16(allocator, out, 2);
1026     try appendU16(allocator, out, 0);
1027     try appendU16(allocator, out, 1);
1028     try appendU16(allocator, out, 8);
1029 
1030     try appendU16(allocator, out, 1);
1031     try appendU16(allocator, out, 18);
1032     try appendU16(allocator, out, 0x0004);
1033     try appendU16(allocator, out, 0);
1034     try appendU16(allocator, out, 1);
1035     try appendU16(allocator, out, 12);
1036 
1037     try appendU16(allocator, out, 1);
1038     try appendU16(allocator, out, 'C' - 31);
1039     try appendI16(allocator, out, -100);
1040 
1041     try appendU16(allocator, out, 1);
1042     try appendU16(allocator, out, 1);
1043     try appendU16(allocator, out, 'B' - 31);
1044 }
1045 
1046 pub fn appendGposChainedClassContextualPairAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
1047     try appendU16(allocator, out, 1);
1048     try appendU16(allocator, out, 0);
1049     try appendU16(allocator, out, 10);
1050     try appendU16(allocator, out, 30);
1051     try appendU16(allocator, out, 44);
1052 
1053     try appendU16(allocator, out, 1);
1054     try appendTag(allocator, out, "DFLT");
1055     try appendU16(allocator, out, 8);
1056 
1057     try appendU16(allocator, out, 4);
1058     try appendU16(allocator, out, 0);
1059 
1060     try appendU16(allocator, out, 0);
1061     try appendU16(allocator, out, 0xffff);
1062     try appendU16(allocator, out, 1);
1063     try appendU16(allocator, out, 0);
1064 
1065     try appendU16(allocator, out, 1);
1066     try appendTag(allocator, out, "kern");
1067     try appendU16(allocator, out, 8);
1068 
1069     try appendU16(allocator, out, 0);
1070     try appendU16(allocator, out, 1);
1071     try appendU16(allocator, out, 0);
1072 
1073     try appendU16(allocator, out, 2);
1074     try appendU16(allocator, out, 6);
1075     try appendU16(allocator, out, 84);
1076 
1077     try appendU16(allocator, out, 8);
1078     try appendU16(allocator, out, 0);
1079     try appendU16(allocator, out, 1);
1080     try appendU16(allocator, out, 8);
1081 
1082     try appendU16(allocator, out, 2);
1083     try appendU16(allocator, out, 18);
1084     try appendU16(allocator, out, 24);
1085     try appendU16(allocator, out, 32);
1086     try appendU16(allocator, out, 42);
1087     try appendU16(allocator, out, 3);
1088     try appendU16(allocator, out, 0);
1089     try appendU16(allocator, out, 0);
1090     try appendU16(allocator, out, 50);
1091 
1092     try appendU16(allocator, out, 1);
1093     try appendU16(allocator, out, 1);
1094     try appendU16(allocator, out, 'B' - 31);
1095 
1096     try appendU16(allocator, out, 1);
1097     try appendU16(allocator, out, 'A' - 31);
1098     try appendU16(allocator, out, 1);
1099     try appendU16(allocator, out, 1);
1100 
1101     try appendU16(allocator, out, 1);
1102     try appendU16(allocator, out, 'B' - 31);
1103     try appendU16(allocator, out, 2);
1104     try appendU16(allocator, out, 2);
1105     try appendU16(allocator, out, 3);
1106 
1107     try appendU16(allocator, out, 1);
1108     try appendU16(allocator, out, 'C' - 31);
1109     try appendU16(allocator, out, 1);
1110     try appendU16(allocator, out, 1);
1111 
1112     try appendU16(allocator, out, 1);
1113     try appendU16(allocator, out, 4);
1114 
1115     try appendU16(allocator, out, 1);
1116     try appendU16(allocator, out, 1);
1117     try appendU16(allocator, out, 2);
1118     try appendU16(allocator, out, 3);
1119     try appendU16(allocator, out, 0);
1120     try appendU16(allocator, out, 1);
1121     try appendU16(allocator, out, 0);
1122     try appendU16(allocator, out, 1);
1123 
1124     try appendU16(allocator, out, 2);
1125     try appendU16(allocator, out, 0);
1126     try appendU16(allocator, out, 1);
1127     try appendU16(allocator, out, 8);
1128 
1129     try appendU16(allocator, out, 1);
1130     try appendU16(allocator, out, 18);
1131     try appendU16(allocator, out, 0x0004);
1132     try appendU16(allocator, out, 0);
1133     try appendU16(allocator, out, 1);
1134     try appendU16(allocator, out, 12);
1135 
1136     try appendU16(allocator, out, 1);
1137     try appendU16(allocator, out, 'C' - 31);
1138     try appendI16(allocator, out, -100);
1139 
1140     try appendU16(allocator, out, 1);
1141     try appendU16(allocator, out, 1);
1142     try appendU16(allocator, out, 'B' - 31);
1143 }
1144 
1145 pub fn appendGposPairAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8), lookup_flag: u16) !void {
1146     try appendGposPairAdjustmentWithFeature(allocator, out, "kern", 0x0004, -80, lookup_flag);
1147 }
1148 
1149 pub fn appendGposVerticalPairAdjustment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
1150     try appendGposPairAdjustmentWithFeature(allocator, out, "vkrn", 0x0008, -80, 0);
1151 }
1152 
1153 pub fn appendGposPairAdjustmentWithFeature(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8), comptime feature_tag: []const u8, value_format_1: u16, adjustment: i16, lookup_flag: u16) !void {
1154     try appendU16(allocator, out, 1);
1155     try appendU16(allocator, out, 0);
1156     try appendU16(allocator, out, 10);
1157     try appendU16(allocator, out, 30);
1158     try appendU16(allocator, out, 44);
1159 
1160     try appendU16(allocator, out, 1);
1161     try appendTag(allocator, out, "DFLT");
1162     try appendU16(allocator, out, 8);
1163 
1164     try appendU16(allocator, out, 4);
1165     try appendU16(allocator, out, 0);
1166 
1167     try appendU16(allocator, out, 0);
1168     try appendU16(allocator, out, 0xffff);
1169     try appendU16(allocator, out, 1);
1170     try appendU16(allocator, out, 0);
1171 
1172     try appendU16(allocator, out, 1);
1173     try appendTag(allocator, out, feature_tag);
1174     try appendU16(allocator, out, 8);
1175 
1176     try appendU16(allocator, out, 0);
1177     try appendU16(allocator, out, 1);
1178     try appendU16(allocator, out, 0);
1179 
1180     try appendU16(allocator, out, 1);
1181     try appendU16(allocator, out, 4);
1182 
1183     try appendU16(allocator, out, 2);
1184     try appendU16(allocator, out, lookup_flag);
1185     try appendU16(allocator, out, 1);
1186     try appendU16(allocator, out, 8);
1187 
1188     try appendU16(allocator, out, 1);
1189     try appendU16(allocator, out, 18);
1190     try appendU16(allocator, out, value_format_1);
1191     try appendU16(allocator, out, 0);
1192     try appendU16(allocator, out, 1);
1193     try appendU16(allocator, out, 12);
1194 
1195     try appendU16(allocator, out, 1);
1196     try appendU16(allocator, out, 'V' - 31);
1197     try appendI16(allocator, out, adjustment);
1198 
1199     try appendU16(allocator, out, 1);
1200     try appendU16(allocator, out, 1);
1201     try appendU16(allocator, out, 'A' - 31);
1202 }
1203 
1204 pub fn appendGposCursiveAttachment(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
1205     try appendU16(allocator, out, 1);
1206     try appendU16(allocator, out, 0);
1207     try appendU16(allocator, out, 10);
1208     try appendU16(allocator, out, 30);
1209     try appendU16(allocator, out, 44);
1210 
1211     try appendU16(allocator, out, 1);
1212     try appendTag(allocator, out, "DFLT");
1213     try appendU16(allocator, out, 8);
1214 
1215     try appendU16(allocator, out, 4);
1216     try appendU16(allocator, out, 0);
1217 
1218     try appendU16(allocator, out, 0);
1219     try appendU16(allocator, out, 0xffff);
1220     try appendU16(allocator, out, 1);
1221     try appendU16(allocator, out, 0);
1222 
1223     try appendU16(allocator, out, 1);
1224     try appendTag(allocator, out, "curs");
1225     try appendU16(allocator, out, 8);
1226 
1227     try appendU16(allocator, out, 0);
1228     try appendU16(allocator, out, 1);
1229     try appendU16(allocator, out, 0);
1230 
1231     try appendU16(allocator, out, 1);
1232     try appendU16(allocator, out, 4);
1233 
1234     try appendU16(allocator, out, 3);
1235     try appendU16(allocator, out, 0);
1236     try appendU16(allocator, out, 1);
1237     try appendU16(allocator, out, 8);
1238 
1239     try appendU16(allocator, out, 1);
1240     try appendU16(allocator, out, 14);
1241     try appendU16(allocator, out, 2);
1242     try appendU16(allocator, out, 0);
1243     try appendU16(allocator, out, 22);
1244     try appendU16(allocator, out, 28);
1245     try appendU16(allocator, out, 0);
1246 
1247     try appendU16(allocator, out, 1);
1248     try appendU16(allocator, out, 2);
1249     try appendU16(allocator, out, 'A' - 31);
1250     try appendU16(allocator, out, 'B' - 31);
1251 
1252     try appendU16(allocator, out, 1);
1253     try appendI16(allocator, out, 480);
1254     try appendI16(allocator, out, 300);
1255 
1256     try appendU16(allocator, out, 1);
1257     try appendI16(allocator, out, 20);
1258     try appendI16(allocator, out, 200);
1259 }
1260 
1261 pub fn appendGposMarkToBase(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
1262     try appendGposMarkToBaseFeature(allocator, out, "mark");
1263 }
1264 
1265 pub fn appendGposMarkToBaseThenPair(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
1266     try appendU16(allocator, out, 1);
1267     try appendU16(allocator, out, 0);
1268     try appendU16(allocator, out, 10);
1269     try appendU16(allocator, out, 32);
1270     try appendU16(allocator, out, 58);
1271 
1272     try appendU16(allocator, out, 1);
1273     try appendTag(allocator, out, "DFLT");
1274     try appendU16(allocator, out, 8);
1275 
1276     try appendU16(allocator, out, 4);
1277     try appendU16(allocator, out, 0);
1278 
1279     try appendU16(allocator, out, 0);
1280     try appendU16(allocator, out, 0xffff);
1281     try appendU16(allocator, out, 2);
1282     try appendU16(allocator, out, 0);
1283     try appendU16(allocator, out, 1);
1284 
1285     try appendU16(allocator, out, 2);
1286     try appendTag(allocator, out, "kern");
1287     try appendU16(allocator, out, 14);
1288     try appendTag(allocator, out, "mark");
1289     try appendU16(allocator, out, 20);
1290 
1291     try appendU16(allocator, out, 0);
1292     try appendU16(allocator, out, 1);
1293     try appendU16(allocator, out, 1);
1294 
1295     try appendU16(allocator, out, 0);
1296     try appendU16(allocator, out, 1);
1297     try appendU16(allocator, out, 0);
1298 
1299     try appendU16(allocator, out, 2);
1300     try appendU16(allocator, out, 6);
1301     try appendU16(allocator, out, 60);
1302 
1303     try appendU16(allocator, out, 4);
1304     try appendU16(allocator, out, 0);
1305     try appendU16(allocator, out, 1);
1306     try appendU16(allocator, out, 8);
1307 
1308     try appendU16(allocator, out, 1);
1309     try appendU16(allocator, out, 34);
1310     try appendU16(allocator, out, 40);
1311     try appendU16(allocator, out, 1);
1312     try appendU16(allocator, out, 12);
1313     try appendU16(allocator, out, 24);
1314 
1315     try appendU16(allocator, out, 1);
1316     try appendU16(allocator, out, 0);
1317     try appendU16(allocator, out, 6);
1318 
1319     try appendU16(allocator, out, 1);
1320     try appendI16(allocator, out, 100);
1321     try appendI16(allocator, out, 0);
1322 
1323     try appendU16(allocator, out, 1);
1324     try appendU16(allocator, out, 4);
1325 
1326     try appendU16(allocator, out, 1);
1327     try appendI16(allocator, out, 250);
1328     try appendI16(allocator, out, 700);
1329 
1330     try appendU16(allocator, out, 1);
1331     try appendU16(allocator, out, 1);
1332     try appendU16(allocator, out, '^' - 31);
1333 
1334     try appendU16(allocator, out, 1);
1335     try appendU16(allocator, out, 1);
1336     try appendU16(allocator, out, 'A' - 31);
1337 
1338     try appendU16(allocator, out, 2);
1339     try appendU16(allocator, out, 0x0008);
1340     try appendU16(allocator, out, 1);
1341     try appendU16(allocator, out, 8);
1342 
1343     try appendU16(allocator, out, 1);
1344     try appendU16(allocator, out, 18);
1345     try appendU16(allocator, out, 0x0004);
1346     try appendU16(allocator, out, 0);
1347     try appendU16(allocator, out, 1);
1348     try appendU16(allocator, out, 12);
1349 
1350     try appendU16(allocator, out, 1);
1351     try appendU16(allocator, out, 'V' - 31);
1352     try appendI16(allocator, out, -80);
1353 
1354     try appendU16(allocator, out, 1);
1355     try appendU16(allocator, out, 1);
1356     try appendU16(allocator, out, 'A' - 31);
1357 }
1358 
1359 pub fn appendGposAboveBaseMarkPositioning(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
1360     try appendGposMarkToBaseFeature(allocator, out, "abvm");
1361 }
1362 
1363 pub fn appendGposBelowBaseMarkPositioning(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
1364     try appendGposMarkToBaseFeature(allocator, out, "blwm");
1365 }
1366 
1367 pub fn appendGposMarkToBaseFeature(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8), comptime feature_tag: []const u8) !void {
1368     try appendU16(allocator, out, 1);
1369     try appendU16(allocator, out, 0);
1370     try appendU16(allocator, out, 10);
1371     try appendU16(allocator, out, 30);
1372     try appendU16(allocator, out, 44);
1373 
1374     try appendU16(allocator, out, 1);
1375     try appendTag(allocator, out, "DFLT");
1376     try appendU16(allocator, out, 8);
1377 
1378     try appendU16(allocator, out, 4);
1379     try appendU16(allocator, out, 0);
1380 
1381     try appendU16(allocator, out, 0);
1382     try appendU16(allocator, out, 0xffff);
1383     try appendU16(allocator, out, 1);
1384     try appendU16(allocator, out, 0);
1385 
1386     try appendU16(allocator, out, 1);
1387     try appendTag(allocator, out, feature_tag);
1388     try appendU16(allocator, out, 8);
1389 
1390     try appendU16(allocator, out, 0);
1391     try appendU16(allocator, out, 1);
1392     try appendU16(allocator, out, 0);
1393 
1394     try appendU16(allocator, out, 1);
1395     try appendU16(allocator, out, 4);
1396 
1397     try appendU16(allocator, out, 4);
1398     try appendU16(allocator, out, 0);
1399     try appendU16(allocator, out, 1);
1400     try appendU16(allocator, out, 8);
1401 
1402     try appendU16(allocator, out, 1);
1403     try appendU16(allocator, out, 34);
1404     try appendU16(allocator, out, 40);
1405     try appendU16(allocator, out, 1);
1406     try appendU16(allocator, out, 12);
1407     try appendU16(allocator, out, 24);
1408 
1409     try appendU16(allocator, out, 1);
1410     try appendU16(allocator, out, 0);
1411     try appendU16(allocator, out, 6);
1412 
1413     try appendU16(allocator, out, 1);
1414     try appendI16(allocator, out, 100);
1415     try appendI16(allocator, out, 0);
1416 
1417     try appendU16(allocator, out, 1);
1418     try appendU16(allocator, out, 4);
1419 
1420     try appendU16(allocator, out, 1);
1421     try appendI16(allocator, out, 250);
1422     try appendI16(allocator, out, 700);
1423 
1424     try appendU16(allocator, out, 1);
1425     try appendU16(allocator, out, 1);
1426     try appendU16(allocator, out, '^' - 31);
1427 
1428     try appendU16(allocator, out, 1);
1429     try appendU16(allocator, out, 1);
1430     try appendU16(allocator, out, 'A' - 31);
1431 }
1432 
1433 pub fn appendGposMarkToLigature(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
1434     try appendU16(allocator, out, 1);
1435     try appendU16(allocator, out, 0);
1436     try appendU16(allocator, out, 10);
1437     try appendU16(allocator, out, 30);
1438     try appendU16(allocator, out, 44);
1439 
1440     try appendU16(allocator, out, 1);
1441     try appendTag(allocator, out, "DFLT");
1442     try appendU16(allocator, out, 8);
1443 
1444     try appendU16(allocator, out, 4);
1445     try appendU16(allocator, out, 0);
1446 
1447     try appendU16(allocator, out, 0);
1448     try appendU16(allocator, out, 0xffff);
1449     try appendU16(allocator, out, 1);
1450     try appendU16(allocator, out, 0);
1451 
1452     try appendU16(allocator, out, 1);
1453     try appendTag(allocator, out, "mark");
1454     try appendU16(allocator, out, 8);
1455 
1456     try appendU16(allocator, out, 0);
1457     try appendU16(allocator, out, 1);
1458     try appendU16(allocator, out, 0);
1459 
1460     try appendU16(allocator, out, 1);
1461     try appendU16(allocator, out, 4);
1462 
1463     try appendU16(allocator, out, 5);
1464     try appendU16(allocator, out, 0);
1465     try appendU16(allocator, out, 1);
1466     try appendU16(allocator, out, 8);
1467 
1468     try appendU16(allocator, out, 1);
1469     try appendU16(allocator, out, 46);
1470     try appendU16(allocator, out, 52);
1471     try appendU16(allocator, out, 1);
1472     try appendU16(allocator, out, 12);
1473     try appendU16(allocator, out, 24);
1474 
1475     try appendU16(allocator, out, 1);
1476     try appendU16(allocator, out, 0);
1477     try appendU16(allocator, out, 6);
1478 
1479     try appendU16(allocator, out, 1);
1480     try appendI16(allocator, out, 100);
1481     try appendI16(allocator, out, 0);
1482 
1483     try appendU16(allocator, out, 1);
1484     try appendU16(allocator, out, 4);
1485 
1486     try appendU16(allocator, out, 2);
1487     try appendU16(allocator, out, 6);
1488     try appendU16(allocator, out, 12);
1489 
1490     try appendU16(allocator, out, 1);
1491     try appendI16(allocator, out, 180);
1492     try appendI16(allocator, out, 700);
1493 
1494     try appendU16(allocator, out, 1);
1495     try appendI16(allocator, out, 330);
1496     try appendI16(allocator, out, 650);
1497 
1498     try appendU16(allocator, out, 1);
1499     try appendU16(allocator, out, 1);
1500     try appendU16(allocator, out, '^' - 31);
1501 
1502     try appendU16(allocator, out, 1);
1503     try appendU16(allocator, out, 1);
1504     try appendU16(allocator, out, 96);
1505 }
1506 
1507 pub fn appendGposMarkToMark(allocator: std.mem.Allocator, out: *std.ArrayListUnmanaged(u8)) !void {
1508     try appendU16(allocator, out, 1);
1509     try appendU16(allocator, out, 0);
1510     try appendU16(allocator, out, 10);
1511     try appendU16(allocator, out, 30);
1512     try appendU16(allocator, out, 44);
1513 
1514     try appendU16(allocator, out, 1);
1515     try appendTag(allocator, out, "DFLT");
1516     try appendU16(allocator, out, 8);
1517 
1518     try appendU16(allocator, out, 4);
1519     try appendU16(allocator, out, 0);
1520 
1521     try appendU16(allocator, out, 0);
1522     try appendU16(allocator, out, 0xffff);
1523     try appendU16(allocator, out, 1);
1524     try appendU16(allocator, out, 0);
1525 
1526     try appendU16(allocator, out, 1);
1527     try appendTag(allocator, out, "mkmk");
1528     try appendU16(allocator, out, 8);
1529 
1530     try appendU16(allocator, out, 0);
1531     try appendU16(allocator, out, 1);
1532     try appendU16(allocator, out, 0);
1533 
1534     try appendU16(allocator, out, 1);
1535     try appendU16(allocator, out, 4);
1536 
1537     try appendU16(allocator, out, 6);
1538     try appendU16(allocator, out, 0);
1539     try appendU16(allocator, out, 1);
1540     try appendU16(allocator, out, 8);
1541 
1542     try appendU16(allocator, out, 1);
1543     try appendU16(allocator, out, 34);
1544     try appendU16(allocator, out, 40);
1545     try appendU16(allocator, out, 1);
1546     try appendU16(allocator, out, 12);
1547     try appendU16(allocator, out, 24);
1548 
1549     try appendU16(allocator, out, 1);
1550     try appendU16(allocator, out, 0);
1551     try appendU16(allocator, out, 6);
1552 
1553     try appendU16(allocator, out, 1);
1554     try appendI16(allocator, out, 80);
1555     try appendI16(allocator, out, 100);
1556 
1557     try appendU16(allocator, out, 1);
1558     try appendU16(allocator, out, 4);
1559 
1560     try appendU16(allocator, out, 1);
1561     try appendI16(allocator, out, 100);
1562     try appendI16(allocator, out, 400);
1563 
1564     try appendU16(allocator, out, 1);
1565     try appendU16(allocator, out, 1);
1566     try appendU16(allocator, out, '_' - 31);
1567 
1568     try appendU16(allocator, out, 1);
1569     try appendU16(allocator, out, 1);
1570     try appendU16(allocator, out, '^' - 31);
1571 }