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