[varLib.merger] Really recombine multiple PairPosFormat2 subtables...

Fixup for 49d311550c29f7501dd4bc91cb24074e3d607b77

Previous try was completely dropping the ParPosFormat2 subtables. Ouch!

Fixes https://github.com/fonttools/fonttools/issues/888
This commit is contained in:
Behdad Esfahbod 2017-03-17 20:30:56 -07:00
parent e2d4fe9da8
commit 9798c30d57

View File

@ -157,9 +157,7 @@ def _merge_GlyphOrders(font, lst, values_lst=None, default=None):
for dict_set in dict_sets] for dict_set in dict_sets]
return order, padded return order, padded
def _Lookup_SinglePos_get_effective_value(self, glyph): def _Lookup_SinglePos_get_effective_value(subtables, glyph):
if self is None: return None
subtables = self.SubTable
for self in subtables: for self in subtables:
if self is None or \ if self is None or \
type(self) != ot.SinglePos or \ type(self) != ot.SinglePos or \
@ -174,9 +172,7 @@ def _Lookup_SinglePos_get_effective_value(self, glyph):
assert 0 assert 0
return None return None
def _Lookup_PairPos_get_effective_value_pair(self, firstGlyph, secondGlyph): def _Lookup_PairPos_get_effective_value_pair(subtables, firstGlyph, secondGlyph):
if self is None: return None
subtables = self.SubTable
for self in subtables: for self in subtables:
if self is None or \ if self is None or \
type(self) != ot.PairPos or \ type(self) != ot.PairPos or \
@ -226,7 +222,7 @@ def merge(merger, self, lst):
for j,glyph in enumerate(glyphs): for j,glyph in enumerate(glyphs):
if values[j] is not None: continue if values[j] is not None: continue
# Fill in value from other subtables # Fill in value from other subtables
v = _Lookup_SinglePos_get_effective_value(merger.lookups[i], glyph) v = _Lookup_SinglePos_get_effective_value(merger.lookup_subtables[i], glyph)
if v is None: if v is None:
v = otBase.ValueRecord(valueFormat) v = otBase.ValueRecord(valueFormat)
values[j] = v values[j] = v
@ -261,7 +257,7 @@ def merge(merger, self, lst):
if values[j] is not None: if values[j] is not None:
vpair = values[j] vpair = values[j]
else: else:
vpair = _Lookup_PairPos_get_effective_value_pair(merger.lookups[i], self._firstGlyph, glyph) vpair = _Lookup_PairPos_get_effective_value_pair(merger.lookup_subtables[i], self._firstGlyph, glyph)
if vpair is None: if vpair is None:
v1, v2 = None, None v1, v2 = None, None
else: else:
@ -376,9 +372,9 @@ def _PairPosFormat2_merge(self, lst, merger):
# so in reality this might not be common. # so in reality this might not be common.
# #
# TODO: Remove this requirement # TODO: Remove this requirement
for l,lookup in zip(lst,merger.lookups): for l,subtables in zip(lst,merger.lookup_subtables):
if l.Coverage.glyphs != glyphs: if l.Coverage.glyphs != glyphs:
assert l == lookup.SubTable[-1] assert l == subtables[-1]
matrices = [l.Class1Record for l in lst] matrices = [l.Class1Record for l in lst]
@ -550,7 +546,7 @@ def _Lookup_PairPosFormat2_subtables_recombine(a, b, font):
for g in s: for g in s:
classDefs[g] = i classDefs[g] = i
records = ot.Class1Record = [] records = self.Class1Record = []
assert a.Class1Count == len(a.Class1Record) assert a.Class1Count == len(a.Class1Record)
assert b.Class1Count == len(b.Class1Record) assert b.Class1Count == len(b.Class1Record)
records.extend(a.Class1Record) records.extend(a.Class1Record)
@ -559,6 +555,8 @@ def _Lookup_PairPosFormat2_subtables_recombine(a, b, font):
for name in ('Class2Count', 'ClassDef2', 'ValueFormat1', 'ValueFormat2'): for name in ('Class2Count', 'ClassDef2', 'ValueFormat1', 'ValueFormat2'):
setattr(self, name, getattr(a, name)) setattr(self, name, getattr(a, name))
return self
def _Lookup_PairPos_subtables_canonicalize(lst, font): def _Lookup_PairPos_subtables_canonicalize(lst, font):
"""Merge multiple Format1 subtables at the beginning of lst, """Merge multiple Format1 subtables at the beginning of lst,
and merge multiple consecutive Format2 subtables that have the same and merge multiple consecutive Format2 subtables that have the same
@ -591,7 +589,7 @@ def _Lookup_PairPos_subtables_canonicalize(lst, font):
@AligningMerger.merger(ot.Lookup) @AligningMerger.merger(ot.Lookup)
def merge(merger, self, lst): def merge(merger, self, lst):
merger.lookups = lst merger.lookup_subtables = [l.SubTable for l in lst]
exclude = [] exclude = []
if self.SubTable and isinstance(self.SubTable[0], ot.PairPos): if self.SubTable and isinstance(self.SubTable[0], ot.PairPos):
@ -602,6 +600,7 @@ def merge(merger, self, lst):
self.SubTable = _Lookup_PairPos_subtables_canonicalize(self.SubTable, merger.font) self.SubTable = _Lookup_PairPos_subtables_canonicalize(self.SubTable, merger.font)
subtables = [_Lookup_PairPos_subtables_canonicalize(l.SubTable, merger.font) for l in lst] subtables = [_Lookup_PairPos_subtables_canonicalize(l.SubTable, merger.font) for l in lst]
merger.lookup_subtables = subtables
merger.mergeLists(self.SubTable, subtables) merger.mergeLists(self.SubTable, subtables)
# If format-1 subtable created during canonicalization is empty, remove it. # If format-1 subtable created during canonicalization is empty, remove it.
@ -614,7 +613,7 @@ def merge(merger, self, lst):
merger.mergeObjects(self, lst, exclude=exclude) merger.mergeObjects(self, lst, exclude=exclude)
del merger.lookups del merger.lookup_subtables
# #
# InstancerMerger # InstancerMerger