[feaLib] Centralize the building of coverage tables

This commit is contained in:
Sascha Brawer 2015-12-09 12:30:57 +01:00
parent 0532ec85d3
commit 320a4a57c6

View File

@ -485,28 +485,30 @@ class LookupBuilder(object):
"""Infers glyph glasses for the GDEF table, such as {"cedilla":3}.""" """Infers glyph glasses for the GDEF table, such as {"cedilla":3}."""
return {} return {}
def buildCoverage_(self, glyphs, tableClass=otTables.Coverage):
coverage = tableClass()
coverage.glyphs = sorted(glyphs, key=self.font.getGlyphID)
return coverage
def setBacktrackCoverage_(self, prefix, subtable): def setBacktrackCoverage_(self, prefix, subtable):
subtable.BacktrackGlyphCount = len(prefix) subtable.BacktrackGlyphCount = len(prefix)
subtable.BacktrackCoverage = [] subtable.BacktrackCoverage = []
for p in reversed(prefix): for p in reversed(prefix):
coverage = otTables.BacktrackCoverage() coverage = self.buildCoverage_(p, otTables.BacktrackCoverage)
coverage.glyphs = sorted(list(p), key=self.font.getGlyphID)
subtable.BacktrackCoverage.append(coverage) subtable.BacktrackCoverage.append(coverage)
def setLookAheadCoverage_(self, suffix, subtable): def setLookAheadCoverage_(self, suffix, subtable):
subtable.LookAheadGlyphCount = len(suffix) subtable.LookAheadGlyphCount = len(suffix)
subtable.LookAheadCoverage = [] subtable.LookAheadCoverage = []
for s in suffix: for s in suffix:
coverage = otTables.LookAheadCoverage() coverage = self.buildCoverage_(s, otTables.LookAheadCoverage)
coverage.glyphs = sorted(list(s), key=self.font.getGlyphID)
subtable.LookAheadCoverage.append(coverage) subtable.LookAheadCoverage.append(coverage)
def setInputCoverage_(self, glyphs, subtable): def setInputCoverage_(self, glyphs, subtable):
subtable.InputGlyphCount = len(glyphs) subtable.InputGlyphCount = len(glyphs)
subtable.InputCoverage = [] subtable.InputCoverage = []
for g in glyphs: for g in glyphs:
coverage = otTables.InputCoverage() coverage = self.buildCoverage_(g, otTables.InputCoverage)
coverage.glyphs = sorted(list(g), key=self.font.getGlyphID)
subtable.InputCoverage.append(coverage) subtable.InputCoverage.append(coverage)
@ -670,8 +672,7 @@ class PairPosBuilder(LookupBuilder):
subtables.append(st) subtables.append(st)
st.Format = 1 st.Format = 1
st.ValueFormat1, st.ValueFormat2 = vf1, vf2 st.ValueFormat1, st.ValueFormat2 = vf1, vf2
st.Coverage = otTables.Coverage() st.Coverage = self.buildCoverage_(p)
st.Coverage.glyphs = sorted(p.keys(), key=self.font.getGlyphID)
st.PairSet = [] st.PairSet = []
for glyph in st.Coverage.glyphs: for glyph in st.Coverage.glyphs:
ps = otTables.PairSet() ps = otTables.PairSet()
@ -710,9 +711,7 @@ class CursiveAttachmentPosBuilder(LookupBuilder):
def build(self): def build(self):
st = otTables.CursivePos() st = otTables.CursivePos()
st.Format = 1 st.Format = 1
st.Coverage = otTables.Coverage() st.Coverage = self.buildCoverage_(self.attachments.keys())
st.Coverage.glyphs = \
sorted(self.attachments.keys(), key=self.font.getGlyphID)
st.EntryExitCount = len(self.attachments) st.EntryExitCount = len(self.attachments)
st.EntryExitRecord = [] st.EntryExitRecord = []
for glyph in st.Coverage.glyphs: for glyph in st.Coverage.glyphs:
@ -758,7 +757,6 @@ class MarkToBaseAttachmentPosBuilder(LookupBuilder):
# whether this is the case; if so, implement the optimization. # whether this is the case; if so, implement the optimization.
marks = sorted(self.marks.keys(), key=self.font.getGlyphID) marks = sorted(self.marks.keys(), key=self.font.getGlyphID)
bases = sorted(self.bases.keys(), key=self.font.getGlyphID)
markClassIDs = self.buildMarkClassIDs_(marks) markClassIDs = self.buildMarkClassIDs_(marks)
markClasses = sorted(markClassIDs.keys(), key=markClassIDs.get) markClasses = sorted(markClassIDs.keys(), key=markClassIDs.get)
@ -766,8 +764,7 @@ class MarkToBaseAttachmentPosBuilder(LookupBuilder):
st.Format = 1 st.Format = 1
st.ClassCount = len(markClassIDs) st.ClassCount = len(markClassIDs)
st.MarkCoverage = otTables.MarkCoverage() st.MarkCoverage = self.buildCoverage_(marks, otTables.MarkCoverage)
st.MarkCoverage.glyphs = marks
st.MarkArray = otTables.MarkArray() st.MarkArray = otTables.MarkArray()
st.MarkArray.MarkCount = len(marks) st.MarkArray.MarkCount = len(marks)
st.MarkArray.MarkRecord = [] st.MarkArray.MarkRecord = []
@ -778,12 +775,12 @@ class MarkToBaseAttachmentPosBuilder(LookupBuilder):
markrec.Class = markClassIDs[markClassName] markrec.Class = markClassIDs[markClassName]
markrec.MarkAnchor = markAnchor markrec.MarkAnchor = markAnchor
st.BaseCoverage = otTables.BaseCoverage() st.BaseCoverage = self.buildCoverage_(
st.BaseCoverage.glyphs = bases self.bases.keys(), otTables.BaseCoverage)
st.BaseArray = otTables.BaseArray() st.BaseArray = otTables.BaseArray()
st.BaseArray.BaseCount = len(bases) st.BaseArray.BaseCount = len(st.BaseCoverage.glyphs)
st.BaseArray.BaseRecord = [] st.BaseArray.BaseRecord = []
for base in bases: for base in st.BaseCoverage.glyphs:
baserec = otTables.BaseRecord() baserec = otTables.BaseRecord()
st.BaseArray.BaseRecord.append(baserec) st.BaseArray.BaseRecord.append(baserec)
baserec.BaseAnchor = [] baserec.BaseAnchor = []
@ -828,11 +825,9 @@ class ReverseChainSingleSubstBuilder(LookupBuilder):
lookup.SubTable.append(st) lookup.SubTable.append(st)
self.setBacktrackCoverage_(prefix, st) self.setBacktrackCoverage_(prefix, st)
self.setLookAheadCoverage_(suffix, st) self.setLookAheadCoverage_(suffix, st)
coverage = sorted(mapping.keys(), key=self.font.getGlyphID) st.Coverage = self.buildCoverage_(mapping.keys())
st.Coverage = otTables.Coverage() st.GlyphCount = len(mapping)
st.Coverage.glyphs = coverage st.Substitute = [mapping[g] for g in st.Coverage.glyphs]
st.GlyphCount = len(coverage)
st.Substitute = [mapping[g] for g in coverage]
lookup.LookupFlag = self.lookup_flag lookup.LookupFlag = self.lookup_flag
lookup.LookupType = self.lookup_type lookup.LookupType = self.lookup_type
@ -932,8 +927,7 @@ class SinglePosBuilder(LookupBuilder):
st = otTables.SinglePos() st = otTables.SinglePos()
subtables.append(st) subtables.append(st)
st.Format = 1 st.Format = 1
st.Coverage = otTables.Coverage() st.Coverage = self.buildCoverage_(glyphs)
st.Coverage.glyphs = glyphs
st.Value, st.ValueFormat = value, valueFormat st.Value, st.ValueFormat = value, valueFormat
lookup = otTables.Lookup() lookup = otTables.Lookup()