from fontTools.otlLib import builder as builder GDEF::mark filtering sets name:: lookup_flags = builder.LOOKUP_FLAG_IGNORE_MARKS | builder.LOOKUP_FLAG_RTL smcp_subtable = builder.buildSingleSubstitute({'a':'a.scmp'}) smcp_lookup = builder.buildLookup([smcp_subtable], lookup_flags=lookup_flags, mark_filter_set=int) lookups = [smcp_lookup, ...] scmp_feature = builder.buildFeature('smcp', [scmp_lookup], lookup_list=lookups) scmp_feature = builder.buildFeature('smcp', [0]) features = [smcp_feature] default_langsys = builder.buildLangSys(set([scmp_feature]), requiredFeature=None, featureOrder=features) default_langsys = builder.buildLangSys(set([0]), requiredFeature=None) script = #GSUB: builder.buildSingleSubst({'a':'a.scmp'}) builder.buildLigatureSubst({('f','i'):'fi'}) builder.buildMultipleSubst({'a':('a0','a1')}) builder.buildAlternateSubst({'a':('a.0','a.1')}) class ChainSequence : namedtuple(['backtrack', 'input', 'lookahead')]) pass ChainSequence(backtrack=..., input=..., lookahead=...) klass0 = frozenset() builder.buildChainContextGlyphs( [ ( (None, ('f','f','i'), (,)), ( (1,lookup_fi), (1,lookup_2) ) ), ], glyphMap ) builder.buildChainContextClass( [ ( (None, (2,0,1), (,)), ( (1,lookup_fi), (1,lookup_2) ) ), ], klasses = ( backtrackClass, ... ), glyphMap ) builder.buildChainContextCoverage( ( (None, (frozenset('f'),frozenset('f'),frozenset('i')), (,)), ( (1,lookup_fi), (1,lookup_2) ) ), glyphMap ) builder.buildExtension(...) #GPOS: device = builder.buildDevice() builder.buildAnchor(100, -200) or (100,-200) builder.buildAnchor(100, -200, device=device) builder.buildAnchor(100, -200, point=2) valueRecord = builder.buildValue({'XAdvance':-200, ...}) builder.buildSinglePos({'a':valueRecord}) builder.buildPairPosGlyphs( { ('a','b'): (valueRecord1,valueRecord2), }, glyphMap, , valueFormat1=None, valueFormat2=None ) builder.buildPairPosClasses( { (frozenset(['a']),frozenset(['b'])): (valueRecord1,valueRecord2), }, glyphMap, , valueFormat1=None, valueFormat2=None ) builder.buildCursivePos( { 'alef': (entry,exit), } glyphMap ) builder.buildMarkBasePos( marks = { 'mark1': (klass, anchor), }, bases = { 'base0': [anchor0, anchor1, anchor2], }, glyphMap ) builder.buildMarkBasePos( marks = { 'mark1': (name, anchor), }, bases = { 'base0': {'top':anchor0, 'left':anchor1}, }, glyphMap )