Refactor subtable/lookup record building code
It's a bit gross, but I'm blaming OpenType for that. I'm doing this now because otherwise it would be even more repetitive once we start adding format 1 Rule and Ruleset subtables.
This commit is contained in:
parent
6d4c5fe31c
commit
8c3dfc4e33
@ -358,16 +358,56 @@ class ChainContextualBuilder(LookupBuilder):
|
|||||||
raise OpenTypeLibError('Missing index of the specified '
|
raise OpenTypeLibError('Missing index of the specified '
|
||||||
f'lookup, might be a {other} lookup',
|
f'lookup, might be a {other} lookup',
|
||||||
self.location)
|
self.location)
|
||||||
rec = self.newLookupRecord_()
|
rec = self.newLookupRecord_(st)
|
||||||
rec.SequenceIndex = sequenceIndex
|
rec.SequenceIndex = sequenceIndex
|
||||||
rec.LookupListIndex = l.lookup_index
|
rec.LookupListIndex = l.lookup_index
|
||||||
self.addLookupRecordToSubtable_(st, rec)
|
|
||||||
return st
|
return st
|
||||||
|
|
||||||
def add_subtable_break(self, location):
|
def add_subtable_break(self, location):
|
||||||
self.rules.append((self.SUBTABLE_BREAK_, self.SUBTABLE_BREAK_,
|
self.rules.append((self.SUBTABLE_BREAK_, self.SUBTABLE_BREAK_,
|
||||||
self.SUBTABLE_BREAK_, [self.SUBTABLE_BREAK_]))
|
self.SUBTABLE_BREAK_, [self.SUBTABLE_BREAK_]))
|
||||||
|
|
||||||
|
def newSubtable_(self, chaining=True):
|
||||||
|
subtablename = f"Context{self.subtable_type}"
|
||||||
|
if chaining:
|
||||||
|
subtablename = "Chain"+subtablename
|
||||||
|
st = getattr(ot,subtablename)() # ot.ChainContextPos()/ot.ChainSubst()/etc.
|
||||||
|
setattr(st, f"{self.subtable_type}Count", 0)
|
||||||
|
setattr(st, f"{self.subtable_type}LookupRecord", [])
|
||||||
|
return st
|
||||||
|
|
||||||
|
def attachSubtableWithCount_(self, st,
|
||||||
|
subtable_name, count_name,
|
||||||
|
existing=None,
|
||||||
|
index=None, chaining=False):
|
||||||
|
if chaining:
|
||||||
|
subtable_name = "Chain"+subtable_name
|
||||||
|
count_name = "Chain"+count_name
|
||||||
|
|
||||||
|
if not hasattr(st, count_name):
|
||||||
|
setattr(st, count_name, 0)
|
||||||
|
setattr(st, subtable_name, [])
|
||||||
|
|
||||||
|
if existing:
|
||||||
|
new_subtable = existing
|
||||||
|
else:
|
||||||
|
# Create a new, empty subtable from otTables
|
||||||
|
new_subtable = getattr(ot, subtable_name)()
|
||||||
|
|
||||||
|
setattr(st, count_name, getattr(st, count_name) + 1)
|
||||||
|
|
||||||
|
if index:
|
||||||
|
getattr(st, subtable_name).insert(index, new_subtable)
|
||||||
|
else:
|
||||||
|
getattr(st, subtable_name).append(new_subtable)
|
||||||
|
|
||||||
|
return new_subtable
|
||||||
|
|
||||||
|
def newLookupRecord_(self, st):
|
||||||
|
return self.attachSubtableWithCount_(st,
|
||||||
|
f"{self.subtable_type}LookupRecord",
|
||||||
|
f"{self.subtable_type}Count",
|
||||||
|
chaining=False) # Oddly, it isn't ChainSubstLookupRecord
|
||||||
|
|
||||||
class ChainContextPosBuilder(ChainContextualBuilder):
|
class ChainContextPosBuilder(ChainContextualBuilder):
|
||||||
"""Builds a Chained Contextual Positioning (GPOS8) lookup.
|
"""Builds a Chained Contextual Positioning (GPOS8) lookup.
|
||||||
@ -398,22 +438,7 @@ class ChainContextPosBuilder(ChainContextualBuilder):
|
|||||||
def __init__(self, font, location):
|
def __init__(self, font, location):
|
||||||
LookupBuilder.__init__(self, font, location, 'GPOS', 8)
|
LookupBuilder.__init__(self, font, location, 'GPOS', 8)
|
||||||
self.rules = [] # (prefix, input, suffix, lookups)
|
self.rules = [] # (prefix, input, suffix, lookups)
|
||||||
|
self.subtable_type = "Pos"
|
||||||
def newSubtable_(self, chaining=True):
|
|
||||||
if chaining:
|
|
||||||
st = ot.ChainContextPos()
|
|
||||||
else:
|
|
||||||
st = ot.ContextPos()
|
|
||||||
st.PosCount = 0
|
|
||||||
st.PosLookupRecord = []
|
|
||||||
return st
|
|
||||||
|
|
||||||
def newLookupRecord_(self):
|
|
||||||
return ot.PosLookupRecord()
|
|
||||||
|
|
||||||
def addLookupRecordToSubtable_(self, st, rec):
|
|
||||||
st.PosCount += 1
|
|
||||||
st.PosLookupRecord.append(rec)
|
|
||||||
|
|
||||||
def find_chainable_single_pos(self, lookups, glyphs, value):
|
def find_chainable_single_pos(self, lookups, glyphs, value):
|
||||||
"""Helper for add_single_pos_chained_()"""
|
"""Helper for add_single_pos_chained_()"""
|
||||||
@ -456,22 +481,7 @@ class ChainContextSubstBuilder(ChainContextualBuilder):
|
|||||||
def __init__(self, font, location):
|
def __init__(self, font, location):
|
||||||
LookupBuilder.__init__(self, font, location, 'GSUB', 6)
|
LookupBuilder.__init__(self, font, location, 'GSUB', 6)
|
||||||
self.rules = [] # (prefix, input, suffix, lookups)
|
self.rules = [] # (prefix, input, suffix, lookups)
|
||||||
|
self.subtable_type = "Subst"
|
||||||
def newSubtable_(self, chaining=True):
|
|
||||||
if chaining:
|
|
||||||
st = ot.ChainContextSubst()
|
|
||||||
else:
|
|
||||||
st = ot.ContextSubst()
|
|
||||||
st.SubstCount = 0
|
|
||||||
st.SubstLookupRecord = []
|
|
||||||
return st
|
|
||||||
|
|
||||||
def newLookupRecord_(self):
|
|
||||||
return ot.SubstLookupRecord()
|
|
||||||
|
|
||||||
def addLookupRecordToSubtable_(self, st, rec):
|
|
||||||
st.SubstCount += 1
|
|
||||||
st.SubstLookupRecord.append(rec)
|
|
||||||
|
|
||||||
def getAlternateGlyphs(self):
|
def getAlternateGlyphs(self):
|
||||||
result = {}
|
result = {}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user