encodeToBinary method
Encodes the object to binary data
Implementation
@override
void encodeToBinary(ByteData byteData) {
var currentTableOffset = kOffsetTableLength + entryListSize;
final entryList = <TableRecordEntry>[];
for (final tag in _kTableTagsToEncode) {
final table = tableMap[tag];
if (table == null) {
continue;
}
if (table is CalculatableOffsets) {
(table as CalculatableOffsets).recalculateOffsets();
}
final tableSize = table.size;
table.encodeToBinary(byteData.sublistView(currentTableOffset, tableSize));
final encodedTable = ByteData.sublistView(
byteData, currentTableOffset, currentTableOffset + tableSize);
table.entry = TableRecordEntry(tag, calculateTableChecksum(encodedTable),
currentTableOffset, tableSize);
entryList.add(table.entry!);
currentTableOffset += getPaddedTableSize(tableSize);
}
// The directory entry tags must be in ascending order
entryList.sort((e1, e2) => e1.tag.compareTo(e2.tag));
for (var i = 0; i < entryList.length; i++) {
final entryOffset = kOffsetTableLength + i * kTableRecordEntryLength;
final entryByteData =
byteData.sublistView(entryOffset, kTableRecordEntryLength);
entryList[i].encodeToBinary(entryByteData);
}
offsetTable.encodeToBinary(byteData.sublistView(0, kOffsetTableLength));
// Setting checksum for whole font in the head table
final fontChecksum = calculateFontChecksum(byteData);
byteData.setUint32(head.entry!.offset + 8, fontChecksum);
}