addLigature top-level property
Null Function(dynamic feature, dynamic ligature, dynamic script, dynamic language)
addLigature
getter/setter pair
Implementation
Substitution.prototype.addLigature = function(feature, ligature, script, language) {
const lookupTable = this.getLookupTables(script, language, feature, 4, true)[0];
let subtable = lookupTable.subtables[0];
if (!subtable) {
subtable = { // lookup type 4 subtable, format 1, coverage format 1
substFormat: 1,
coverage: { format: 1, glyphs: [] },
ligatureSets: []
};
lookupTable.subtables[0] = subtable;
}
check.assert(subtable.coverage.format === 1, 'Ligature: unable to modify coverage table format ' + subtable.coverage.format);
const coverageGlyph = ligature.sub[0];
const ligComponents = ligature.sub.slice(1);
const ligatureTable = {
ligGlyph: ligature.by,
components: ligComponents
};
let pos = this.binSearch(subtable.coverage.glyphs, coverageGlyph);
if (pos >= 0) {
// ligatureSet already exists
const ligatureSet = subtable.ligatureSets[pos];
for (let i = 0; i < ligatureSet.length; i++) {
// If ligature already exists, return.
if (arraysEqual(ligatureSet[i].components, ligComponents)) {
return;
}
}
// ligature does not exist: add it.
ligatureSet.push(ligatureTable);
} else {
// Create a new ligatureSet and add coverage for the first glyph.
pos = -1 - pos;
subtable.coverage.glyphs.splice(pos, 0, coverageGlyph);
subtable.ligatureSets.splice(pos, 0, [ligatureTable]);
}
};