|
|
import r from 'restructure';
|
|
|
import {ScriptList, FeatureList, LookupList, Coverage, ClassDef, Device, Context, ChainingContext} from './opentype';
|
|
|
import {FeatureVariations} from './variations';
|
|
|
|
|
|
let Sequence = new r.Array(r.uint16, r.uint16);
|
|
|
let AlternateSet = Sequence;
|
|
|
|
|
|
let Ligature = new r.Struct({
|
|
|
glyph: r.uint16,
|
|
|
compCount: r.uint16,
|
|
|
components: new r.Array(r.uint16, t => t.compCount - 1)
|
|
|
});
|
|
|
|
|
|
let LigatureSet = new r.Array(new r.Pointer(r.uint16, Ligature), r.uint16);
|
|
|
|
|
|
let GSUBLookup = new r.VersionedStruct('lookupType', {
|
|
|
1: new r.VersionedStruct(r.uint16, {// Single Substitution
|
|
|
1: {
|
|
|
coverage: new r.Pointer(r.uint16, Coverage),
|
|
|
deltaGlyphID: r.int16
|
|
|
},
|
|
|
2: {
|
|
|
coverage: new r.Pointer(r.uint16, Coverage),
|
|
|
glyphCount: r.uint16,
|
|
|
substitute: new r.LazyArray(r.uint16, 'glyphCount')
|
|
|
}
|
|
|
}),
|
|
|
|
|
|
2: { // Multiple Substitution
|
|
|
substFormat: r.uint16,
|
|
|
coverage: new r.Pointer(r.uint16, Coverage),
|
|
|
count: r.uint16,
|
|
|
sequences: new r.LazyArray(new r.Pointer(r.uint16, Sequence), 'count')
|
|
|
},
|
|
|
|
|
|
3: { // Alternate Substitution
|
|
|
substFormat: r.uint16,
|
|
|
coverage: new r.Pointer(r.uint16, Coverage),
|
|
|
count: r.uint16,
|
|
|
alternateSet: new r.LazyArray(new r.Pointer(r.uint16, AlternateSet), 'count')
|
|
|
},
|
|
|
|
|
|
4: { // Ligature Substitution
|
|
|
substFormat: r.uint16,
|
|
|
coverage: new r.Pointer(r.uint16, Coverage),
|
|
|
count: r.uint16,
|
|
|
ligatureSets: new r.LazyArray(new r.Pointer(r.uint16, LigatureSet), 'count')
|
|
|
},
|
|
|
|
|
|
5: Context, // Contextual Substitution
|
|
|
6: ChainingContext, // Chaining Contextual Substitution
|
|
|
|
|
|
7: { // Extension Substitution
|
|
|
substFormat: r.uint16,
|
|
|
lookupType: r.uint16, // cannot also be 7
|
|
|
extension: new r.Pointer(r.uint32, GSUBLookup)
|
|
|
},
|
|
|
|
|
|
8: { // Reverse Chaining Contextual Single Substitution
|
|
|
substFormat: r.uint16,
|
|
|
coverage: new r.Pointer(r.uint16, Coverage),
|
|
|
backtrackCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'backtrackGlyphCount'),
|
|
|
lookaheadGlyphCount: r.uint16,
|
|
|
lookaheadCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'lookaheadGlyphCount'),
|
|
|
glyphCount: r.uint16,
|
|
|
substitutes: new r.Array(r.uint16, 'glyphCount')
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// Fix circular reference
|
|
|
GSUBLookup.versions[7].extension.type = GSUBLookup;
|
|
|
|
|
|
export default new r.VersionedStruct(r.uint32, {
|
|
|
header: {
|
|
|
scriptList: new r.Pointer(r.uint16, ScriptList),
|
|
|
featureList: new r.Pointer(r.uint16, FeatureList),
|
|
|
lookupList: new r.Pointer(r.uint16, new LookupList(GSUBLookup))
|
|
|
},
|
|
|
|
|
|
0x00010000: {},
|
|
|
0x00010001: {
|
|
|
featureVariations: new r.Pointer(r.uint32, FeatureVariations)
|
|
|
}
|
|
|
});
|
|
|
|