Contains the sketch and start of a stateless GSUB/GPOS/GDEF builder. Will be used by mtiLib, feaLib, and the future voltLib. Can also be used by clients to build these tables with much less pain.
106 lines
2.3 KiB
Plaintext
106 lines
2.3 KiB
Plaintext
|
|
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
|
|
)
|