private static void WriteFileHeader(this BigEndianBinaryWriter writer, uint version, ushort tableCount, ushort searchRange, ushort entrySelector, ushort rangeShift)
 {
     // file header
     // Type Name | name          | Description
     // ----------|---------------|------------------------------
     // uint32    | sfntVersion   | 0x00010000 or 0x4F54544F('OTTO') — see below.
     // uint16    | numTables     | Number of tables.
     // uint16    | searchRange   | (Maximum power of 2 <= numTables) x 16.
     // uint16    | entrySelector | Log2(maximum power of 2 <= numTables).
     // uint16    | rangeShift    | NumTables x 16 - searchRange.
     writer.WriteUInt32(version);
     writer.WriteUInt16(tableCount);
     writer.WriteUInt16(searchRange);
     writer.WriteUInt16(entrySelector);
     writer.WriteUInt16(rangeShift);
 }
        private static void WriteFileHeader(this BigEndianBinaryWriter writer, uint version, params TableHeader[] headers)
        {
            // file header
            // Type Name | name          | Description
            // ----------|---------------|------------------------------
            // uint32    | sfntVersion   | 0x00010000 or 0x4F54544F('OTTO') — see below.
            // uint16    | numTables     | Number of tables.
            // uint16    | searchRange   | (Maximum power of 2 <= numTables) x 16.
            // uint16    | entrySelector | Log2(maximum power of 2 <= numTables).
            // uint16    | rangeShift    | NumTables x 16 - searchRange.
            writer.WriteUInt32(version);
            writer.WriteUInt16((ushort)headers.Length);
            writer.WriteUInt16(0);
            writer.WriteUInt16(0);
            writer.WriteUInt16(0);
            int offset = 12;

            offset += headers.Length * 16;
            foreach (TableHeader h in headers)
            {
                writer.WriteTableHeader(h.Tag, h.CheckSum, (uint)offset, h.Length);
                offset += (int)h.Length;
            }
        }