[feaLib] Centralize the building of coverage tables
This commit is contained in:
parent
0532ec85d3
commit
320a4a57c6
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user