parseKern method

Map<(int, int), int> parseKern()

Returns pair-kerning values in font units.

Only handles the classic kern table format 0 (horizontal pairs). Returns an empty map if the table is absent or has no format-0 subtables.

Implementation

Map<(int, int), int> parseKern() {
  final kern = _tableOffsets['kern'];
  if (kern == null) return {};

  final result = <(int, int), int>{};
  final nTables = _data.getUint16(kern + 2);
  int pos = kern + 4;

  for (int t = 0; t < nTables; t++) {
    if (pos + 6 > _data.lengthInBytes) break;
    final subtableLength = _data.getUint16(pos + 2);
    final coverage = _data.getUint16(pos + 4);
    final format = (coverage >> 8) & 0xFF;
    final isHorizontal = coverage & 0x01 != 0;

    if (format == 0 && isHorizontal) {
      final nPairs = _data.getUint16(pos + 6);
      for (int p = 0; p < nPairs; p++) {
        final pairOff = pos + 14 + p * 6;
        if (pairOff + 6 > _data.lengthInBytes) break;
        final left = _data.getUint16(pairOff);
        final right = _data.getUint16(pairOff + 2);
        final value = _data.getInt16(pairOff + 4);
        result[(left, right)] = value;
      }
    }

    pos += subtableLength;
  }

  return result;
}