encodeToBinary method

  1. @override
void encodeToBinary(
  1. ByteData byteData
)

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