def build(self): st = otTables.MarkLigPos() st.Format = 1 st.MarkCoverage = \ self.buildCoverage_(self.marks, otTables.MarkCoverage) markClasses = self.buildMarkClasses_(self.marks) st.ClassCount = len(markClasses) self.setMarkArray_(self.marks, markClasses, st) st.LigatureCoverage = \ self.buildCoverage_(self.ligatures, otTables.LigatureCoverage) st.LigatureArray = otTables.LigatureArray() st.LigatureArray.LigatureCount = len(self.ligatures) st.LigatureArray.LigatureAttach = [] for lig in st.LigatureCoverage.glyphs: components = self.ligatures[lig] attach = otTables.LigatureAttach() attach.ComponentCount = len(components) attach.ComponentRecord = [] for component in components: crec = otTables.ComponentRecord() attach.ComponentRecord.append(crec) crec.LigatureAnchor = [] for markClass in sorted(markClasses.keys(), key=markClasses.get): crec.LigatureAnchor.append(component.get(markClass)) st.LigatureArray.LigatureAttach.append(attach) return self.buildLookup_([st])
def makeLigatureRecords(data, coverage, c, classCount): records = [None] * len(coverage.glyphs) idx = {g:i for i,g in enumerate(coverage.glyphs)} for (glyph,klass,compIdx,compCount),anchor in data.items(): record = records[idx[glyph]] if record is None: record = records[idx[glyph]] = ot.LigatureAttach() record.ComponentCount = compCount record.ComponentRecord = [ot.ComponentRecord() for i in range(compCount)] for compRec in record.ComponentRecord: compRec.LigatureAnchor = [None] * classCount assert record.ComponentCount == compCount, (glyph, record.ComponentCount, compCount) anchors = record.ComponentRecord[compIdx - 1].LigatureAnchor assert anchors[klass] is None, (glyph, compIdx, klass) anchors[klass] = anchor return records
def buildLigatureAttach(components): """[[Anchor, Anchor], [Anchor, Anchor, Anchor]] --> LigatureAttach""" self = ot.LigatureAttach() self.ComponentRecord = [buildComponentRecord(c) for c in components] self.ComponentCount = len(self.ComponentRecord) return self