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; } }