otTables.py revision d4d151390d1288f8d2df30f6dfa26a309c7334da
1d4d151390d1288f8d2df30f6dfa26a309c7334dajvr"""fontTools.ttLib.tables.otTables -- A collection of classes representing the various
2d4d151390d1288f8d2df30f6dfa26a309c7334dajvrOpenType subtables.
3d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
4d4d151390d1288f8d2df30f6dfa26a309c7334dajvrMost are constructed upon import from data in otData.py. Most smartness is contained
5d4d151390d1288f8d2df30f6dfa26a309c7334dajvrin otBase.BaseTable.
6d4d151390d1288f8d2df30f6dfa26a309c7334dajvr"""
7d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
8d4d151390d1288f8d2df30f6dfa26a309c7334dajvrfrom otBase import BaseTable, FormatSwitchingBaseTable
9d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
10d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
11d4d151390d1288f8d2df30f6dfa26a309c7334dajvrclass LookupOrder(BaseTable):
12d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	"""Dummy class; this table isn't defined, but is used, and is always NULL."""
13d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
14d4d151390d1288f8d2df30f6dfa26a309c7334dajvrclass FeatureParams(BaseTable):
15d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	"""Dummy class; this table isn't defined, but is used, and is always NULL."""
16d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
17d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
18d4d151390d1288f8d2df30f6dfa26a309c7334dajvr_equivalents = [
19d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('MarkArray', ("Mark1Array",)),
20d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('LangSys', ('DefaultLangSys',)),
21d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('Coverage', ('MarkCoverage', 'BaseCoverage', 'LigatureCoverage', 'Mark1Coverage',
22d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			'Mark2Coverage', 'BacktrackCoverage', 'InputCoverage',
23d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			'LookaheadCoverage')),
24d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('ClassDef', ('ClassDef1', 'ClassDef2', 'BacktrackClassDef', 'InputClassDef',
25d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			'LookaheadClassDef', 'GlyphClassDef', 'MarkAttachClassDef')),
26d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('Anchor', ('EntryAnchor', 'ExitAnchor', 'BaseAnchor', 'LigatureAnchor',
27d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			'Mark2Anchor', 'MarkAnchor')),
28d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('Device', ('XPlaDevice', 'YPlaDevice', 'XAdvDevice', 'YAdvDevice',
29d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			'XDeviceTable', 'YDeviceTable', 'DeviceTable')),
30d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('Axis', ('HorizAxis', 'VertAxis',)),
31d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('MinMax', ('DefaultMinMax',)),
32d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('BaseCoord', ('MinCoord', 'MaxCoord',)),
33d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('JstfLangSys', ('DefJstfLangSys',)),
34d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('JstfGSUBModList', ('ShrinkageEnableGSUB', 'ShrinkageDisableGSUB', 'ExtensionEnableGSUB',
35d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			'ExtensionDisableGSUB',)),
36d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('JstfGPOSModList', ('ShrinkageEnableGPOS', 'ShrinkageDisableGPOS', 'ExtensionEnableGPOS',
37d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			'ExtensionDisableGPOS',)),
38d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	('JstfMax', ('ShrinkageJstfMax', 'ExtensionJstfMax',)),
39d4d151390d1288f8d2df30f6dfa26a309c7334dajvr]
40d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
41d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
42d4d151390d1288f8d2df30f6dfa26a309c7334dajvrdef _buildClasses():
43d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	import new, re
44d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	from otData import otData
45d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
46d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	formatPat = re.compile("([A-Za-z0-9]+)Format(\d+)$")
47d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	namespace = globals()
48d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
49d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	# populate module with classes
50d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	for name, table in otData:
51d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		baseClass = BaseTable
52d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		m = formatPat.match(name)
53d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		if m:
54d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			# XxxFormatN subtable, we only add the "base" table
55d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			name = m.group(1)
56d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			baseClass = FormatSwitchingBaseTable
57d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		if not namespace.has_key(name):
58d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			cls = new.classobj(name, (baseClass,), {})
59d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			namespace[name] = cls
60d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
61d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	for base, alts in _equivalents:
62d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		base = namespace[base]
63d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		for alt in alts:
64d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			namespace[alt] = new.classobj(alt, (base,), {})
65d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
66d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	global lookupTypes
67d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	lookupTypes = {
68d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		'GSUB': {
69d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			1: SingleSubst,
70d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			2: MultipleSubst,
71d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			3: AlternateSubst,
72d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			4: LigatureSubst,
73d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			5: ContextSubst,
74d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			6: ChainContextSubst,
75d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			7: ExtensionSubst,
76d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		},
77d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		'GPOS': {
78d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			1: SinglePos,
79d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			2: PairPos,
80d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			3: CursivePos,
81d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			4: MarkBasePos,
82d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			5: MarkLigPos,
83d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			6: MarkMarkPos,
84d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			7: ContextPos,
85d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			8: ChainContextPos,
86d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			9: ExtensionPos,
87d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		},
88d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	}
89d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	lookupTypes['JSTF'] = lookupTypes['GPOS']  # JSTF contains GPOS
90d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
91d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	# add converters to classes
92d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	from otConverters import buildConverterList
93d4d151390d1288f8d2df30f6dfa26a309c7334dajvr	for name, table in otData:
94d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		m = formatPat.match(name)
95d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		if m:
96d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			# XxxFormatN subtable, add converter to "base" table
97d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			name, format = m.groups()
98d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			format = int(format)
99d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			cls = namespace[name]
100d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			if not hasattr(cls, "converters"):
101d4d151390d1288f8d2df30f6dfa26a309c7334dajvr				cls.converters = {}
102d4d151390d1288f8d2df30f6dfa26a309c7334dajvr				cls.convertersByName = {}
103d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			converters, convertersByName = buildConverterList(table[1:], namespace)
104d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			cls.converters[format] = converters
105d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			cls.convertersByName[format] = convertersByName
106d4d151390d1288f8d2df30f6dfa26a309c7334dajvr		else:
107d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			cls = namespace[name]
108d4d151390d1288f8d2df30f6dfa26a309c7334dajvr			cls.converters, cls.convertersByName = buildConverterList(table, namespace)
109d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
110d4d151390d1288f8d2df30f6dfa26a309c7334dajvr
111d4d151390d1288f8d2df30f6dfa26a309c7334dajvr_buildClasses()
112