Skip to content

Commit

Permalink
Add preliminary support for Mac kern table.
Browse files Browse the repository at this point in the history
This is to support fonts like "Anton" which only have a Mac kern table.
  • Loading branch information
fdb committed Jan 5, 2017
1 parent a798444 commit a3652cc
Showing 1 changed file with 45 additions and 9 deletions.
54 changes: 45 additions & 9 deletions src/tables/kern.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,13 @@
var check = require('../check');
var parse = require('../parse');

// Parse the `kern` table which contains kerning pairs.
function parseKernTable(data, start) {
function parseWindowsKernTable(p) {
var pairs = {};
var p = new parse.Parser(data, start);
var tableVersion = p.parseUShort();
check.argument(tableVersion === 0, 'Unsupported kern table version.');
// Skip nTables.
p.skip('uShort', 1);
var subTableVersion = p.parseUShort();
check.argument(subTableVersion === 0, 'Unsupported kern sub-table version.');
// Skip subTableLength, subTableCoverage
p.skip('uShort');
var subtableVersion = p.parseUShort();
check.argument(subtableVersion === 0, 'Unsupported kern sub-table version.');
// Skip subtableLength, subtableCoverage
p.skip('uShort', 2);
var nPairs = p.parseUShort();
// Skip searchRange, entrySelector, rangeShift.
Expand All @@ -28,8 +24,48 @@ function parseKernTable(data, start) {
var value = p.parseShort();
pairs[leftIndex + ',' + rightIndex] = value;
}
return pairs;
}

function parseMacKernTable(p) {
var pairs = {};
// The Mac kern table stores the version as a fixed (32 bits) but we only loaded the first 16 bits.
// Skip the rest.
p.skip('uShort');
var nTables = p.parseULong();
//check.argument(nTables === 1, 'Only 1 subtable is supported (got ' + nTables + ').');
if (nTables > 1) {
console.warn('Only the first kern subtable is supported.');
}
p.skip('uLong');
var coverage = p.parseUShort();
var subtableVersion = coverage & 0xFF;
p.skip('uShort');
if (subtableVersion === 0) {
var nPairs = p.parseUShort();
// Skip searchRange, entrySelector, rangeShift.
p.skip('uShort', 3);
for (var i = 0; i < nPairs; i += 1) {
var leftIndex = p.parseUShort();
var rightIndex = p.parseUShort();
var value = p.parseShort();
pairs[leftIndex + ',' + rightIndex] = value;
}
}
return pairs;
}

// Parse the `kern` table which contains kerning pairs.
function parseKernTable(data, start) {
var p = new parse.Parser(data, start);
var tableVersion = p.parseUShort();
if (tableVersion === 0) {
return parseWindowsKernTable(p);
} else if (tableVersion === 1) {
return parseMacKernTable(p);
} else {
throw new Error('Unsupported kern table version (' + tableVersion + ').');
}
}

exports.parse = parseKernTable;

0 comments on commit a3652cc

Please sign in to comment.